From 8da32105732949b4b0273c718d118bcfae70a1c9 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Mon, 11 Dec 2006 15:47:35 +0000 Subject: Merged 0.0 changes from revision 2825 to 2898 to trunk. --- src/utils/wingettimeofday.h | 111 ++++++++++++++++++++++++++++++++++++++++++++ src/utils/xml.cpp | 54 +++++++++++++++++++++ src/utils/xml.h | 46 ++++++++++++++++++ 3 files changed, 211 insertions(+) create mode 100644 src/utils/wingettimeofday.h create mode 100644 src/utils/xml.cpp create mode 100644 src/utils/xml.h (limited to 'src/utils') diff --git a/src/utils/wingettimeofday.h b/src/utils/wingettimeofday.h new file mode 100644 index 00000000..0f8b767a --- /dev/null +++ b/src/utils/wingettimeofday.h @@ -0,0 +1,111 @@ +/* + * The Mana World Server + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _TMWSERV_WINGETTIMEOFDAY_H_ +#define _TMWSERV_WINGETTIMEOFDAY_H_ + +#ifdef WIN32 + +#include + +/* + * the function gettimeofday() is available on UNIX but not on windows. + * this header defines a windows implementation as a + * GetSystemTimeAsFileTime() wrapper. + */ + +int gettimeofday(struct timeval* tv, void *tz) +/*--------------------------------------------------------------- + * Copyright (c) 1999,2000,2001,2002,2003 + * The Board of Trustees of the University of Illinois + * All Rights Reserved. + *--------------------------------------------------------------- + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software (Iperf) and associated + * documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * + * Redistributions of source code must retain the above + * copyright notice, this list of conditions and + * the following disclaimers. + * + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimers in the documentation and/or other materials + * provided with the distribution. + * + * + * Neither the names of the University of Illinois, NCSA, + * nor the names of its contributors may be used to endorse + * or promote products derived from this Software without + * specific prior written permission. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ________________________________________________________________ + * National Laboratory for Applied Network Research + * National Center for Supercomputing Applications + * University of Illinois at Urbana-Champaign + * http://www.ncsa.uiuc.edu + * ________________________________________________________________ + * + * gettimeofday.c + * by Mark Gates + * ------------------------------------------------------------------- + * A (hack) implementation of gettimeofday for Windows. + * Since I send sec/usec in UDP packets, this made the most sense. + * ------------------------------------------------------------------- */ +{ + FILETIME time; + double timed; + + GetSystemTimeAsFileTime( &time ); + + // Apparently Win32 has units of 1e-7 sec (tenths of microsecs) + // 4294967296 is 2^32, to shift high word over + // 11644473600 is the number of seconds between + // the Win32 epoch 1601-Jan-01 and the Unix epoch 1970-Jan-01 + // Tests found floating point to be 10x faster than 64bit int math. + + timed = ((time.dwHighDateTime * 4294967296e-7) - 11644473600.0) + + (time.dwLowDateTime * 1e-7); + + tv->tv_sec = (long) timed; + tv->tv_usec = (long) ((timed - tv->tv_sec) * 1e6); + + return 0; +} + + +#endif // WIN32 +#endif diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp new file mode 100644 index 00000000..7c917dc0 --- /dev/null +++ b/src/utils/xml.cpp @@ -0,0 +1,54 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "xml.h" + +namespace XML +{ + int + getProperty(xmlNodePtr node, const char* name, int def) + { + int &ret = def; + + xmlChar *prop = xmlGetProp(node, BAD_CAST name); + if (prop) { + ret = atoi((char*)prop); + xmlFree(prop); + } + + return ret; + } + + std::string + getProperty(xmlNodePtr node, const char *name, const std::string &def) + { + xmlChar *prop = xmlGetProp(node, BAD_CAST name); + if (prop) { + std::string val = (char*)prop; + xmlFree(prop); + return val; + } + + return def; + } +} diff --git a/src/utils/xml.h b/src/utils/xml.h new file mode 100644 index 00000000..54ed9951 --- /dev/null +++ b/src/utils/xml.h @@ -0,0 +1,46 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_XML_H +#define _TMW_XML_H + +#include + +#include + +namespace XML +{ + /** + * Gets an integer property from an xmlNodePtr. + */ + int + getProperty(xmlNodePtr node, const char *name, int def); + + /** + * Gets a string property from an xmlNodePtr. + */ + std::string + getProperty(xmlNodePtr node, const char *name, const std::string &def); +} + +#endif -- cgit v1.2.3-70-g09d2 From 4eec29ac0f6a9b05562ac0fbe3d4e5d7e82deeac Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Thu, 4 Jan 2007 02:20:38 +0000 Subject: Merged 0.0 changes from revision 2898 to 2988 to trunk. --- ChangeLog | 181 +++++++++++++++++++++++++++++++++ INSTALL | 2 +- NEWS | 8 +- README | 2 +- configure.ac | 3 - data/CMakeLists.txt | 9 -- data/Makefile.am | 9 +- data/graphics/CMakeLists.txt | 1 - data/graphics/Makefile.am | 2 +- data/graphics/images/CMakeLists.txt | 14 +-- data/graphics/images/Makefile.am | 14 +-- data/help/header.txt | 2 +- docs/INSTALL/ubuntu.txt | 43 ++++++++ docs/INSTALL/win32.txt | 5 +- src/CMakeLists.txt | 12 +-- src/Makefile.am | 12 +-- src/action.cpp | 66 ------------ src/action.h | 61 ----------- src/animatedsprite.cpp | 6 +- src/animatedsprite.h | 9 +- src/animation.cpp | 55 ---------- src/animation.h | 101 ------------------ src/base64.cpp | 149 --------------------------- src/base64.h | 37 ------- src/being.cpp | 33 +++--- src/being.h | 1 - src/engine.cpp | 32 +----- src/engine.h | 9 +- src/game.cpp | 4 +- src/gui/buy.cpp | 57 +++++------ src/gui/chargedialog.cpp | 1 + src/gui/listbox.cpp | 7 +- src/gui/listbox.h | 4 +- src/gui/sell.cpp | 3 +- src/gui/shop.cpp | 2 +- src/gui/shoplistbox.cpp | 142 ++++++++++---------------- src/gui/shoplistbox.h | 20 +--- src/gui/updatewindow.cpp | 175 +++++++++++++++++++------------ src/gui/updatewindow.h | 9 +- src/gui/viewport.cpp | 4 +- src/guichanfwd.h | 5 +- src/inventory.h | 7 ++ src/localplayer.cpp | 19 +++- src/localplayer.h | 17 +++- src/main.cpp | 20 ++-- src/main.h | 3 +- src/net/playerhandler.cpp | 16 +++ src/npc.cpp | 1 - src/resources/action.cpp | 67 ++++++++++++ src/resources/action.h | 61 +++++++++++ src/resources/animation.cpp | 53 ++++++++++ src/resources/animation.h | 99 ++++++++++++++++++ src/resources/equipmentdb.cpp | 3 + src/resources/image.cpp | 6 +- src/resources/itemdb.cpp | 8 ++ src/resources/itemdb.h | 6 +- src/resources/mapreader.cpp | 2 +- src/resources/monsterdb.cpp | 8 ++ src/resources/openglsdlimageloader.cpp | 3 +- src/resources/openglsdlimageloader.h | 3 +- src/resources/spritedef.cpp | 37 ++++--- src/resources/spritedef.h | 3 - src/resources/spriteset.cpp | 2 +- src/tmw.rc | 41 +++----- src/utils/base64.cpp | 149 +++++++++++++++++++++++++++ src/utils/base64.h | 37 +++++++ src/utils/wingettimeofday.h | 8 +- src/winver.h | 6 ++ tmw.cbp | 72 ++++++------- 69 files changed, 1139 insertions(+), 929 deletions(-) create mode 100644 docs/INSTALL/ubuntu.txt delete mode 100644 src/action.cpp delete mode 100644 src/action.h delete mode 100644 src/animation.cpp delete mode 100644 src/animation.h delete mode 100644 src/base64.cpp delete mode 100644 src/base64.h create mode 100644 src/resources/action.cpp create mode 100644 src/resources/action.h create mode 100644 src/resources/animation.cpp create mode 100644 src/resources/animation.h create mode 100644 src/utils/base64.cpp create mode 100644 src/utils/base64.h create mode 100644 src/winver.h (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index d2cc233c..d75d457a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -55,6 +55,187 @@ performs an attack and attack messages from the server are received and displayed. +2006-12-25 Bjørn Lindeijer + + * data/graphics/tiles/christmastree.png, data/maps/new_11-1.tmx.gz: + Added Christmas tree by Pauan. + * data/graphics/sprites/head-christmastree.xml: Fixed name of image. + * src/resources/spriteset.cpp: Fixed index check to prevent crashing. + * data/graphics/sprites/head-christmastreehat.png, + data/graphics/sprites/head-rangerhat.png, + data/graphics/sprites/head-christmastree.xml, + data/graphics/sprites/head-antlerhat.xml, + data/graphics/sprites/head-santabeardhat.xml, + data/graphics/sprites/head-santabeardhat.png, + data/graphics/sprites/head-rangerhat.xml: Updates to Pauan's recent + sprites by Pauan. + * data/items.xml: Fixes to descriptions and weights by Pauan. + +2006-12-24 Bjørn Lindeijer + + * src/gui/shoplistbox.cpp: Don't try to draw an icon when it is not + defined or failed to load properly. + * src/resources/image.cpp: Major rendering performance increase in + software mode, by not using RLE compression on loaded images while + most of the time, we're only drawing a small subimage of them. + * README, data/help/header.txt, NEWS: Filled in release dates. + +2006-12-23 Bjørn Lindeijer + + * configure.ac, data/graphics/items/Makefile.am, + data/graphics/items/CMakeLists.txt, data/graphics/images/Makefile.am, + data/graphics/images/CMakeLists.txt, + data/graphics/sprites/Makefile.am, + data/graphics/sprites/CMakeLists.txt, data/graphics/Makefile.am, + data/graphics/CMakeLists.txt, data/maps/Makefile.am, + data/maps/CMakeLists.txt, data/sfx/Makefile.am, + data/sfx/CMakeLists.txt, data/Makefile.am, data/CMakeLists.txt: + Removed database files, minimaps, items, monster sprites, maps and + sounds from the release. They will be released dynamically only. + * data/graphics/tiles/snow_x3.png: Added bottom of Christmas tree by + pauan. + * src/main.cpp, src/resources/itemdb.h, src/resources/monsterdb.cpp, + src/resources/itemdb.cpp, src/resources/equipmentdb.cpp: Load the + databases at the start of the LOGIN state, after the updates are + loaded. + +2006-12-22 Bjørn Lindeijer + + * data/graphics/items/armor-head-rangerhat.png, + data/graphics/items/generic-redstocking.png, + data/graphics/items/armor-head-christmastree.png, + data/graphics/items/armor-head-antlerhat.png, + data/graphics/items/armor-head-santabeardhat.png, + data/graphics/sprites/head-christmastreehat.png, + data/graphics/sprites/head-rangerhat.png, + data/graphics/sprites/head-christmastree.xml, + data/graphics/sprites/head-antlerhat.xml, + data/graphics/sprites/head-santabeardhat.xml, + data/graphics/sprites/head-antlerhat.png, + data/graphics/sprites/head-santabeardhat.png, + data/graphics/sprites/head-rangerhat.xml, data/items.xml, + data/equipment.xml, data/monsters.xml: Added new Christmas themed + headwear by Pauan. + * data/graphics/items/Makefile.am, data/graphics/items/CMakeLists.txt, + data/graphics/sprites/Makefile.am, + data/graphics/sprites/CMakeLists.txt, data/Makefile.am, + data/CMakeLists.txt: Updated Makefiles. + +2006-12-21 Bjørn Lindeijer + + * configure.ac, CMakeLists.txt, README, data/help/header.txt: Updated + version to 0.0.22. + +2006-12-18 Philipp Sehmisch + + * data/graphics/items/armor-chest-vnecksweater.png: New version of + the inventory icon for the V-neck sweater by Saphy. + +2006-12-17 Bjørn Lindeijer + + * src/gui/sell.cpp, src/gui/shoplistbox.h, src/gui/listbox.h, + src/gui/shop.cpp, src/gui/buy.cpp, src/gui/shoplistbox.cpp, + src/gui/listbox.cpp: Subclassed ShopListBox from ListBox to get rid of + some duplicated code, and fixed a problem with scrolling to the + current selection. Also aligned the text a bit better and put the + price in parenthesis. + +2006-12-16 Bjørn Lindeijer + + * src/gui/connection.cpp, src/gui/chargedialog.cpp: Fixed dialog + visibility. + * src/localplayer.cpp, src/game.cpp, src/localplayer.h: Fixed issues + with walking one tile too many and changing direction towards an + obstacle. + +2006-12-15 Philipp Sehmisch + + * data/graphics/tiles/desert1.png: Removed some unused legacy tiles and + added variant tiles for the cliffs. + +2006-12-14 Bjørn Lindeijer + + * src/game.cpp, src/engine.h, src/engine.cpp: Removed the rather + useless remaining draw function from the engine class. + * src/being.cpp, src/being.h: Fixed an issue with fading out damage + texts (they were sometimes fully opaque at the end of fading out). + +2006-12-12 Eugenio Favalli + + * The Mana World.dev, tmw.cbp: Updated project files. + * src/gui/updatewindow.cpp, src/gui/updatewindow.h, src/main.cpp: + Added Adler32 checksum for updates. + * src/net/playerhandler.cpp: Fixed crash when selecting an item after + death. + * data/items.xml: Fixed defense values for sweaters. + * src/net/playerhandler.cpp: Hide all NPC dialogs after death. + +2006-12-12 Bjørn Lindeijer + + * src/animatedsprite.h, src/CMakeLists.txt, src/animatedsprite.cpp, + src/resources/action.h, src/resources/animation.h, + src/resources/spritedef.cpp, src/resources/action.cpp, + src/resources/animation.cpp, src/resources/spritedef.h: Moved + Action, Animation and Frame (renamed from AnimationPhase) classes into + the resources directory, since they are part of the SpriteDef class. + * src/CMakeLists.txt, src/utils/base64.cpp, src/utils/base64.h, + src/Makefile.am, src/resources/mapreader.cpp: Moved base64 module into + utils directory. + * src/engine.cpp, src/npc.cpp: Cleaned up some unused stuff. + +2006-12-12 Philipp Sehmisch + + * data/sfx/bat-dying1.ogg, data/sfx/bat-hit1.ogg, + data/sfx/bow_shoot_1.ogg, data/sfx/fire-goblin-hit1.ogg + data/sfx/fire-goblin-hit2.ogg, data/sfx/fire-goblin-miss1.ogg, + data/sfx/fist-swish.ogg, data/sfx/flower-hit1.ogg, + data/sfx/flower-hit2.ogg, data/sfx/flower-miss1.ogg, + data/sfx/fluffy-hit1.ogg, data/sfx/fluffy-hit2.ogg, + data/sfx/fluffy-hit3.ogg, data/sfx/fluffy-hurt1.ogg, + data/sfx/fluffy-miss1.ogg, data/sfx/knife-hit1.ogg, + data/sfx/knife-miss1.ogg, data/sfx/levelup.ogg + data/sfx/scorpion-hit1.ogg, data/sfx/scorpion-hit2.ogg + data/sfx/scorpion-hit3.ogg, data/sfx/scorpion-hit4.ogg + data/sfx/scorpion-miss1.ogg, data/sfx/short-sword-hit1.ogg + data/sfx/short-sword-miss1.ogg, data/sfx/shroom-hit1.ogg + data/sfx/slime-hit1.ogg: + Normalized versions of sound effects by Cosmostrator. + +2006-12-11 Bjørn Lindeijer + + * src/gui/updatewindow.cpp: Fixed visibility of the update window. + +2006-12-11 Philipp Sehmisch + + * data/equipment.xml, data/items.xml, + data/graphics/sprites/chest-tnecksweater-male.png, + data/graphics/sprites/chest-tnecksweater-female.png, + data/graphics/sprites/chest-vnecksweater-male.png, + data/graphics/sprites/chest-vnecksweater-female.png, + data/graphics/sprites/chest-tnecksweater-male.xml, + data/graphics/sprites/chest-tnecksweater-female.xml, + data/graphics/sprites/chest-vnecksweater-male.xml, + data/graphics/sprites/chest-vnecksweater-female.xml, + data/graphics/sprites/Makefile.AM, + data/graphics/sprites/CMakeLists.txt, + data/graphics/items/armor-chest-vnecksweater.png, + data/graphics/items/armor-chest-tnecksweater.png, + data/graphics/items/armor-chest-woolsweater.png, + data/graphics/items/Makefile.AM, data/graphics/items/CMakeLists.txt: + Added new sweaters by Saphy. Info for server admins: Item IDs are 564 + for turtleneck (should already be in there) and 624 for v-neck. The + visible sprite IDs are 19 for turtleneck and 20 for v-neck. + +2006-12-11 Eugenio Favalli + + * src/main.h, src/tmw.rc, src/winver.h, The Mana World.dev, tmw.cbp: + Fixed windows binary version. + +2006-12-10 Eugenio Favalli + + * docs/INSTALL/win32.txt: Added more detailed instructions for Dev-C++ + users. + 2006-12-09 Eugenio Favalli * data/graphics/sprites/npcs.png: Added pirate NPC. diff --git a/INSTALL b/INSTALL index a4f269e1..5b3eb3f2 100644 --- a/INSTALL +++ b/INSTALL @@ -39,7 +39,7 @@ you to figure this out. ========================================== 1) Go to the directory you have extracted the source to. -2) If you checked out from CVS, run "./autogen.sh" to generate configure. +2) If you checked out from SVN, run "./autogen.sh" to generate configure. 3) Run "./configure" 4) Run "make" 5) Run "make install" as root diff --git a/NEWS b/NEWS index f3b586f8..9edd05b6 100644 --- a/NEWS +++ b/NEWS @@ -1,13 +1,17 @@ -0.0.22 (...) +0.0.22 (24 December 2006) - Added support for female-specific equipment graphics - Added support for monster sounds +- Added item icons to buy/sell dialogs +- Enhanced character select dialog to show equipment - Changed to new update host (http://updates.themanaworld.org) - Worked around a Guichan exception thrown for mice with many buttons - Changed mouse walk to keep following mouse while button is held down -- Extended font support for Ã¥ and Ã…. +- Extended font support for Ã¥ and Ã… +- Disabled RLE compression on all surfaces in software mode - Fixed joystick setting not to show disabled when it's actually enabled - Fixed money field to no longer hide below the bottom of the window - Fixed pathfinding to allow walking through beings when they block your path +- Fixed an issue with NPC dialogs staying open after player respawn 0.0.21.1 (30 October 2006) - Reload wallpaper after loading updates diff --git a/README b/README index 54a6dcaf..342524ec 100644 --- a/README +++ b/README @@ -1,7 +1,7 @@ THE MANA WORLD ============== - Version: 0.0.21.1 Date: 30/10/2006 + Version: 0.0.22 Date: 24/12/2006 Development team: diff --git a/configure.ac b/configure.ac index d32aee08..ca31930e 100755 --- a/configure.ac +++ b/configure.ac @@ -113,13 +113,10 @@ data/graphics/Makefile data/graphics/gui/Makefile data/graphics/images/Makefile data/graphics/images/ambient/Makefile -data/graphics/items/Makefile data/graphics/sprites/Makefile data/graphics/tiles/Makefile data/help/Makefile data/icons/Makefile -data/maps/Makefile -data/sfx/Makefile docs/Makefile ]) diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index e60bfe30..3c482b49 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -3,12 +3,3 @@ SET(DATA_DIR ${PKG_DATADIR}/data) ADD_SUBDIRECTORY(graphics) ADD_SUBDIRECTORY(help) ADD_SUBDIRECTORY(icons) -ADD_SUBDIRECTORY(maps) -ADD_SUBDIRECTORY(sfx) - -SET(FILES - equipment.xml - items.xml - ) - -INSTALL(FILES ${FILES} DESTINATION ${DATA_DIR}) \ No newline at end of file diff --git a/data/Makefile.am b/data/Makefile.am index ed080d08..5a28f7c1 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,11 +1,4 @@ -SUBDIRS = graphics help icons maps sfx +SUBDIRS = graphics help icons tmwdatadir = $(pkgdatadir)/data - -tmwdata_DATA = \ - equipment.xml \ - items.xml - -EXTRA_DIST = \ - $(tmwdata_DATA) \ No newline at end of file diff --git a/data/graphics/CMakeLists.txt b/data/graphics/CMakeLists.txt index c569e04f..0fa9a7be 100644 --- a/data/graphics/CMakeLists.txt +++ b/data/graphics/CMakeLists.txt @@ -1,5 +1,4 @@ ADD_SUBDIRECTORY(gui) ADD_SUBDIRECTORY(images) -ADD_SUBDIRECTORY(items) ADD_SUBDIRECTORY(sprites) ADD_SUBDIRECTORY(tiles) diff --git a/data/graphics/Makefile.am b/data/graphics/Makefile.am index 19e95869..43354894 100644 --- a/data/graphics/Makefile.am +++ b/data/graphics/Makefile.am @@ -1,2 +1,2 @@ -SUBDIRS = gui images items sprites tiles +SUBDIRS = gui images sprites tiles diff --git a/data/graphics/images/CMakeLists.txt b/data/graphics/images/CMakeLists.txt index f02cd2ea..a8b6ddbd 100644 --- a/data/graphics/images/CMakeLists.txt +++ b/data/graphics/images/CMakeLists.txt @@ -1,18 +1,8 @@ ADD_SUBDIRECTORY(ambient) SET(FILES - error.png + error.png login_wallpaper.png - minimap_new_1-1.png - minimap_new_14-1.png - minimap_new_15-1.png - minimap_new_16-1.png - minimap_new_2-1.png - minimap_new_3-1.png - minimap_new_5-1.png - minimap_new_7-1.png - minimap_new_9-1.png - minimap_new_17-1.png ) -INSTALL(FILES ${FILES} DESTINATION ${DATA_DIR}/graphics/images) \ No newline at end of file +INSTALL(FILES ${FILES} DESTINATION ${DATA_DIR}/graphics/images) diff --git a/data/graphics/images/Makefile.am b/data/graphics/images/Makefile.am index 00d9ed7e..be8593f6 100644 --- a/data/graphics/images/Makefile.am +++ b/data/graphics/images/Makefile.am @@ -4,17 +4,7 @@ imagesdir = $(pkgdatadir)/data/graphics/images images_DATA = \ error.png \ - login_wallpaper.png \ - minimap_new_1-1.png \ - minimap_new_2-1.png \ - minimap_new_3-1.png \ - minimap_new_5-1.png \ - minimap_new_7-1.png \ - minimap_new_9-1.png \ - minimap_new_14-1.png \ - minimap_new_15-1.png \ - minimap_new_16-1.png \ - minimap_new_17-1.png + login_wallpaper.png EXTRA_DIST = \ - $(images_DATA) \ No newline at end of file + $(images_DATA) diff --git a/data/help/header.txt b/data/help/header.txt index b292388a..4f4c9615 100644 --- a/data/help/header.txt +++ b/data/help/header.txt @@ -2,7 +2,7 @@ ##1 T H E M A N A W O R L D ##1 ========================================== - ##2Version:##6 0.0.21.1 ##2Date:##30 October 2006 + ##2Version:##6 0.0.22 ##2Date:##324 December 2006 ##2 Website: http://themanaworld.org diff --git a/docs/INSTALL/ubuntu.txt b/docs/INSTALL/ubuntu.txt new file mode 100644 index 00000000..cf830ccc --- /dev/null +++ b/docs/INSTALL/ubuntu.txt @@ -0,0 +1,43 @@ +How to build a .deb for TMW on Ubuntu +===================================== + +This documentation is for those who are interested in building the .deb files +of The Mana World. Most people do not need to do this, but can instead use the +repository. You can find information about how to use the repository on our +downloads page. + + +1. Installing the dependencies +============================== + +First of all you need a working compiler and package building environment. If +you don't have this yet, install the following packages: + + apt-get install gcc g++ dh-make fakeroot dpkg-dev build-essentials + +In order to compile The Mana World, you'll need the developer packages for +SDL, SDL_mixer, SDL_image, SDL_net, libxml2, libphysfs and libguichan0. + + apt-get install libsdl1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev ... + +(todo: add missing entries) +(todo: include information about installing Guichan development package) + + +2. Creating the .debs using DebHelper Tools +=========================================== + +Either download the source release of TMW that you want to build a package for, +or check out the appropriate version from Subversion, for example by using the +tag. + +Make sure the files in the debian directory are up to date. You can do this by +checking out the appropriate directory from Subversion (will be either +tmw/branches/0.0/debian or tmw/trunk/debian for the latest release). + +Now we can build the packages using the following command. + + fakeroot dpkg-buildpackage + +The packages will be created in the parent folder. + diff --git a/docs/INSTALL/win32.txt b/docs/INSTALL/win32.txt index ab2a429f..f438a7e7 100644 --- a/docs/INSTALL/win32.txt +++ b/docs/INSTALL/win32.txt @@ -45,7 +45,7 @@ the old stable version, so don't do that. Get Dev-C++ here: http://www.bloodshed.net/ -After you fetched it simply run and install. +After you have fetched it, simply run and install as prompted. 3. Installing the required libraries @@ -63,6 +63,9 @@ to remove anything the devpak might overlap before installing, for example the previous devpak.) Remember to copy the required dlls from your dll folder in the Dev-Cpp root directory, to the folder where you have your copy of The Mana World. You also have to add the SDL include folder in your C++ include paths. +If you're using Dev-C++, this means: Tools -> Compiler options -> +-> Directories -> C++ includes -> Browse... (browse to MinGW/include/SDL) -> +-> Add -> Ok. If you can't get the package or you are experiencing problems with it, just send me an email at elvenprogrammer@gmail.com or continue reading. (Coming to bug us on the IRC channel is a valid alternative too.) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e0b93382..55109ec4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -214,10 +214,14 @@ SET(SRCS net/gameserver/internal.h net/gameserver/player.cpp net/gameserver/player.h + resources/action.cpp + resources/action.h resources/ambientoverlay.cpp resources/ambientoverlay.h resources/buddylist.cpp resources/buddylist.h + resources/animation.cpp + resources/animation.h resources/equipmentdb.cpp resources/equipmentdb.h resources/equipmentinfo.h @@ -251,18 +255,14 @@ SET(SRCS resources/spritedef.h resources/spritedef.cpp resources/spriteset.h + utils/base64.cpp + utils/base64.h utils/dtor.h utils/tostring.h utils/xml.cpp utils/xml.h - action.cpp - action.h animatedsprite.cpp animatedsprite.h - animation.cpp - animation.h - base64.cpp - base64.h being.cpp being.h beingmanager.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 1628df18..777cc30e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -179,8 +179,12 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ net/gameserver/internal.h \ net/gameserver/player.cpp \ net/gameserver/player.h \ + resources/action.cpp \ + resources/action.h \ resources/ambientoverlay.cpp \ resources/ambientoverlay.h \ + resources/animation.cpp \ + resources/animation.h \ resources/equipmentdb.cpp \ resources/equipmentdb.h \ resources/equipmentinfo.h \ @@ -216,18 +220,14 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ resources/spriteset.cpp \ resources/buddylist.h \ resources/buddylist.cpp \ + utils/base64.cpp \ + utils/base64.h \ utils/dtor.h \ utils/tostring.h \ utils/xml.cpp \ utils/xml.h \ - action.cpp \ - action.h \ animatedsprite.cpp \ animatedsprite.h \ - animation.cpp \ - animation.h \ - base64.cpp \ - base64.h \ being.cpp \ being.h \ beingmanager.cpp \ diff --git a/src/action.cpp b/src/action.cpp deleted file mode 100644 index 148ea105..00000000 --- a/src/action.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include "action.h" - -#include - -#include "animation.h" -#include "utils/dtor.h" - - -Action::Action() -{ -} - -Action::~Action() -{ - std::for_each(mAnimations.begin(), mAnimations.end(), - make_dtor(mAnimations)); -} - -Animation* -Action::getAnimation(int direction) const -{ - Animations::const_iterator i = mAnimations.find(direction); - - // When the direction isn't defined, try the default - if (i == mAnimations.end()) - { - i = mAnimations.find(0); - } - - return (i == mAnimations.end()) ? NULL : i->second; -} - -void -Action::setAnimation(int direction, Animation *animation) -{ - // Set first direction as default direction - if (mAnimations.empty()) - { - mAnimations[0] = animation; - } - - mAnimations[direction] = animation; -} diff --git a/src/action.h b/src/action.h deleted file mode 100644 index 8d5e8d11..00000000 --- a/src/action.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#ifndef _TMW_ACTION_H -#define _TMW_ACTION_H - -#include - -#include - -class Animation; - -/** - * An action consists of several animations, one for each direction. - */ -class Action -{ - public: - /** - * Constructor. - */ - Action(); - - /** - * Destructor. - */ - ~Action(); - - void - setAnimation(int direction, Animation *animation); - - Animation* - getAnimation(int direction) const; - - protected: - typedef std::map Animations; - typedef Animations::iterator AnimationIterator; - Animations mAnimations; -}; - -#endif diff --git a/src/animatedsprite.cpp b/src/animatedsprite.cpp index 46369c80..3d1979a9 100644 --- a/src/animatedsprite.cpp +++ b/src/animatedsprite.cpp @@ -23,14 +23,14 @@ #include "animatedsprite.h" -#include "animation.h" -#include "action.h" #include "graphics.h" #include "log.h" +#include "resources/action.h" +#include "resources/animation.h" +#include "resources/image.h" #include "resources/resourcemanager.h" #include "resources/spriteset.h" -#include "resources/image.h" #include "utils/xml.h" diff --git a/src/animatedsprite.h b/src/animatedsprite.h index 4e485f14..2257c0f0 100644 --- a/src/animatedsprite.h +++ b/src/animatedsprite.h @@ -29,8 +29,9 @@ #include #include +class Animation; class Graphics; -struct AnimationPhase; +struct Frame; /** * Animates a sprite by adding playback state. @@ -72,13 +73,13 @@ class AnimatedSprite /** * Inform the animation of the passed time so that it can output the - * correct animation phase. + * correct animation frame. */ void update(int time); /** - * Draw the current animation phase at the coordinates given in screen + * Draw the current animation frame at the coordinates given in screen * pixels. */ bool @@ -103,7 +104,7 @@ class AnimatedSprite SpriteDef *mSprite; /**< The sprite definition. */ Action *mAction; /**< The currently active action. */ Animation *mAnimation; /**< The currently active animation. */ - AnimationPhase *mFrame; /**< The currently active frame. */ + Frame *mFrame; /**< The currently active frame. */ std::string mAnimationFile; }; diff --git a/src/animation.cpp b/src/animation.cpp deleted file mode 100644 index 67fdae11..00000000 --- a/src/animation.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include "animation.h" - -#include - -#include "utils/dtor.h" - -Animation::Animation(): - mDuration(0) -{ -} - -void -Animation::addPhase(Image *image, unsigned int delay, int offsetX, int offsetY) -{ - // Add new phase to animation list - AnimationPhase newPhase = { image, delay, offsetX, offsetY }; - - mAnimationPhases.push_back(newPhase); - mDuration += delay; -} - -void -Animation::addTerminator() -{ - addPhase(NULL, 0, 0, 0); -} - -bool -Animation::isTerminator(const AnimationPhase candidate) -{ - return (candidate.image == NULL); -} diff --git a/src/animation.h b/src/animation.h deleted file mode 100644 index 85e950d7..00000000 --- a/src/animation.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#ifndef _TMW_ANIMATION_H -#define _TMW_ANIMATION_H - -#include - -#include - -class Image; -class Spriteset; - -/** - * A single frame in an animation, with a delay and an offset. - * - * TODO: Rename this struct to Frame - */ -struct AnimationPhase -{ - Image *image; - unsigned int delay; - int offsetX; - int offsetY; -}; - -/** - * An animation consists of several frames, each with their own delay and - * offset. - */ -class Animation -{ - public: - /** - * Constructor. - */ - Animation(); - - /** - * Appends a new animation at the end of the sequence - */ - void - addPhase(Image *image, unsigned int delay, int offsetX, int offsetY); - - /** - * Appends an animation terminator that states that the animation - * should not loop. - */ - void - addTerminator(); - - /** - * Returns the frame at the specified index. - */ - AnimationPhase* - getFrame(int index) { return &(mAnimationPhases[index]); } - - /** - * Returns the length of this animation in frames. - */ - unsigned int - getLength() const { return mAnimationPhases.size(); } - - /** - * Returns the duration of this animation. - */ - int - getDuration() const { return mDuration; } - - /** - * Determines whether the given animation frame is a terminator. - */ - static bool - isTerminator(const AnimationPhase phase); - - protected: - std::vector mAnimationPhases; - int mDuration; -}; - -#endif diff --git a/src/base64.cpp b/src/base64.cpp deleted file mode 100644 index 9a8f6356..00000000 --- a/src/base64.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP HTML Embedded Scripting Language Version 3.0 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997-2000 PHP Development Team (See Credits file) | - +----------------------------------------------------------------------+ - | This program is free software; you can redistribute it and/or modify | - | it under the terms of one of the following licenses: | - | | - | A) the GNU General Public License as published by the Free Software | - | Foundation; either version 2 of the License, or (at your option) | - | any later version. | - | | - | B) the PHP License as published by the PHP Development Team and | - | included in the distribution in the file: LICENSE | - | | - | This program is distributed in the hope that it will be useful, | - | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | GNU General Public License for more details. | - | | - | You should have received a copy of both licenses referred to here. | - | If you did not, or have any questions about PHP licensing, please | - | contact core@php.net. | - +----------------------------------------------------------------------+ - | Author: Jim Winstead (jimw@php.net) | - +----------------------------------------------------------------------+ - */ -/* $Id$ */ - -#include -#include - -#include "base64.h" - -static char base64_table[] = -{ - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0' -}; -static char base64_pad = '='; - -unsigned char *php3_base64_encode(const unsigned char *string, int length, int *ret_length) { - const unsigned char *current = string; - int i = 0; - unsigned char *result = (unsigned char *)malloc(((length + 3 - length % 3) * 4 / 3 + 1) * sizeof(char)); - - while (length > 2) { /* keep going until we have less than 24 bits */ - result[i++] = base64_table[current[0] >> 2]; - result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)]; - result[i++] = base64_table[((current[1] & 0x0f) << 2) + (current[2] >> 6)]; - result[i++] = base64_table[current[2] & 0x3f]; - - current += 3; - length -= 3; /* we just handle 3 octets of data */ - } - - /* now deal with the tail end of things */ - if (length != 0) { - result[i++] = base64_table[current[0] >> 2]; - if (length > 1) { - result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)]; - result[i++] = base64_table[(current[1] & 0x0f) << 2]; - result[i++] = base64_pad; - } - else { - result[i++] = base64_table[(current[0] & 0x03) << 4]; - result[i++] = base64_pad; - result[i++] = base64_pad; - } - } - if(ret_length) { - *ret_length = i; - } - result[i] = '\0'; - return result; -} - -/* as above, but backwards. :) */ -unsigned char *php3_base64_decode(const unsigned char *string, int length, int *ret_length) { - const unsigned char *current = string; - int ch, i = 0, j = 0, k; - char *chp; - - unsigned char *result = (unsigned char *)malloc(length + 1); - - if (result == NULL) { - return NULL; - } - - /* run through the whole string, converting as we go */ - while ((ch = *current++) != '\0') { - if (ch == base64_pad) break; - - /* When Base64 gets POSTed, all pluses are interpreted as spaces. - This line changes them back. It's not exactly the Base64 spec, - but it is completely compatible with it (the spec says that - spaces are invalid). This will also save many people considerable - headache. - Turadg Aleahmad - */ - - if (ch == ' ') ch = '+'; - - chp = strchr(base64_table, ch); - if (chp == NULL) continue; - ch = chp - base64_table; - - switch(i % 4) { - case 0: - result[j] = ch << 2; - break; - case 1: - result[j++] |= ch >> 4; - result[j] = (ch & 0x0f) << 4; - break; - case 2: - result[j++] |= ch >>2; - result[j] = (ch & 0x03) << 6; - break; - case 3: - result[j++] |= ch; - break; - } - i++; - } - - k = j; - /* mop things up if we ended on a boundary */ - if (ch == base64_pad) { - switch(i % 4) { - case 0: - case 1: - free(result); - return NULL; - case 2: - k++; - case 3: - result[k++] = 0; - } - } - if(ret_length) { - *ret_length = j; - } - result[k] = '\0'; - return result; -} diff --git a/src/base64.h b/src/base64.h deleted file mode 100644 index ff20ac53..00000000 --- a/src/base64.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - +----------------------------------------------------------------------+ - | PHP HTML Embedded Scripting Language Version 3.0 | - +----------------------------------------------------------------------+ - | Copyright (c) 1997,1998 PHP Development Team (See Credits file) | - +----------------------------------------------------------------------+ - | This program is free software; you can redistribute it and/or modify | - | it under the terms of one of the following licenses: | - | | - | A) the GNU General Public License as published by the Free Software | - | Foundation; either version 2 of the License, or (at your option) | - | any later version. | - | | - | B) the PHP License as published by the PHP Development Team and | - | included in the distribution in the file: LICENSE | - | | - | This program is distributed in the hope that it will be useful, | - | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | GNU General Public License for more details. | - | | - | You should have received a copy of both licenses referred to here. | - | If you did not, or have any questions about PHP licensing, please | - | contact core@php.net. | - +----------------------------------------------------------------------+ - | Author: Jim Winstead (jimw@php.net) | - +----------------------------------------------------------------------+ - */ -/* $Id$ */ - -#ifndef _TMW_BASE64_H -#define _TMW_BASE64_H - -extern unsigned char *php3_base64_encode(const unsigned char *, int, int *); -extern unsigned char *php3_base64_decode(const unsigned char *, int, int *); - -#endif /* _TMW_BASE64_H */ diff --git a/src/being.cpp b/src/being.cpp index 68c670fd..ac003d1c 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -65,7 +65,6 @@ Being::Being(Uint16 id, Uint16 job, Map *map): mHairStyle(0), mHairColor(0), mSpeechTime(0), mDamageTime(0), - mShowSpeech(false), mShowDamage(false), mPx(0), mPy(0), mSprites(VECTOREND_SPRITE, NULL), mEquipmentSpriteIDs(VECTOREND_SPRITE, 0) @@ -272,16 +271,14 @@ void Being::setSpeech(const std::string &text, Uint32 time) { mSpeech = text; - mSpeechTime = tick_time; - mShowSpeech = true; + mSpeechTime = 500; } void Being::setDamage(Sint16 amount, Uint32 time) { mDamage = amount ? toString(amount) : "miss"; - mDamageTime = tick_time; - mShowDamage = true; + mDamageTime = 300; } void @@ -443,17 +440,13 @@ Being::logic() nextStep(); } - // Determine whether speech should still be displayed - if (get_elapsed_time(mSpeechTime) > 5000) - { - mShowSpeech = false; - } + // Reduce the time that speech is still displayed + if (mSpeechTime > 0) + mSpeechTime--; - // Determine whether damage should still be displayed - if (get_elapsed_time(mDamageTime) > 3000) - { - mShowDamage = false; - } + // Reduce the time that damage is still displayed + if (mDamageTime > 0) + mDamageTime--; // Update pixel coordinates mPx = mX - 16 + getXOffset(); @@ -511,7 +504,7 @@ Being::drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY) int py = mPy + offsetY; // Draw speech above this being - if (mShowSpeech) + if (mSpeechTime > 0) { graphics->setFont(speechFont); graphics->setColor(gcn::Color(255, 255, 255)); @@ -519,7 +512,7 @@ Being::drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY) } // Draw damage above this being - if (mShowDamage && get_elapsed_time(mDamageTime) > 250) + if (mDamageTime > 0 && mDamageTime < 275) { // Selecting the right color if (mDamage == "miss") @@ -536,13 +529,13 @@ Being::drawSpeech(Graphics *graphics, Sint32 offsetX, Sint32 offsetY) } int textY = (getType() == MONSTER) ? 32 : 70; - int ft = get_elapsed_time(mDamageTime) - 1500; - float a = (ft > 0) ? 1.0 - ft / 1500.0 : 1.0; + int ft = 150 - mDamageTime; + float a = (ft > 0) ? 1.0 - ft / 150.0 : 1.0; graphics->setColor(gcn::Color(255, 255, 255, (int)(255 * a))); graphics->drawText(mDamage, px + 16, - py - textY - get_elapsed_time(mDamageTime) / 100, + py - textY - (300 - mDamageTime) / 10, gcn::Graphics::CENTER); // Reset alpha value diff --git a/src/being.h b/src/being.h index f9287b65..bfd01568 100644 --- a/src/being.h +++ b/src/being.h @@ -368,7 +368,6 @@ class Being : public Sprite Uint16 mHairStyle, mHairColor; Uint32 mSpeechTime; Uint32 mDamageTime; - bool mShowSpeech, mShowDamage; Sint32 mPx, mPy; /**< Pixel coordinates */ std::vector mSprites; diff --git a/src/engine.cpp b/src/engine.cpp index 30f0097e..d2ce6d6f 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -54,42 +54,19 @@ extern Minimap *minimap; char itemCurrenyQ[10] = "0"; Spriteset *emotionset; -Spriteset *npcset; -std::vector weaponset; Engine::Engine(): mCurrentMap(NULL) { - // Load the sprite sets + // Load the emotion set ResourceManager *resman = ResourceManager::getInstance(); - - npcset = resman->getSpriteset("graphics/sprites/npcs.png", 50, 80); - emotionset = resman->getSpriteset("graphics/sprites/emotions.png", - 30, 32); - for (int i = 0; i < 2; i++) - { - Spriteset *tmp = ResourceManager::getInstance()->getSpriteset( - "graphics/sprites/weapon" + toString(i) + ".png", 64, 64); - if (!tmp) { - logger->error("Unable to load weaponset"); - } else { - weaponset.push_back(tmp); - } - } - - if (!npcset) logger->error("Unable to load NPC spriteset!"); + emotionset = resman->getSpriteset("graphics/sprites/emotions.png", 30, 32); if (!emotionset) logger->error("Unable to load emotions spriteset!"); } Engine::~Engine() { - // Delete sprite sets - npcset->decRef(); emotionset->decRef(); - - std::for_each(weaponset.begin(), weaponset.end(), - std::mem_fun(&Spriteset::decRef)); - weaponset.clear(); } void Engine::changeMap(const std::string &mapPath) @@ -142,8 +119,3 @@ void Engine::logic() beingManager->logic(); gui->logic(); } - -void Engine::draw(Graphics *graphics) -{ - gui->draw(); -} diff --git a/src/engine.h b/src/engine.h index 62e82a49..b16b7c13 100644 --- a/src/engine.h +++ b/src/engine.h @@ -26,11 +26,11 @@ #include -class Graphics; class Map; /** - * Game engine that does the main drawing. + * Game engine. Actually hardly does anything anymore except keeping track of + * the current map and loading the emotes. */ class Engine { @@ -60,11 +60,6 @@ class Engine */ void logic(); - /** - * Draws everything on the screen. - */ - void draw(Graphics *graphics); - private: Map *mCurrentMap; }; diff --git a/src/game.cpp b/src/game.cpp index f708fabf..2af13146 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -360,7 +360,7 @@ void Game::logic() get_elapsed_time(mDrawTime / 10) > mMinFrameTime) { frame++; - engine->draw(graphics); + gui->draw(); graphics->updateScreen(); mDrawTime += mMinFrameTime; @@ -662,7 +662,7 @@ void Game::handleInput() direction |= Being::RIGHT; } - player_node->walk(direction); + player_node->setWalkingDir(direction); // Target the nearest monster if 'a' pressed if (keys[SDLK_a]) diff --git a/src/gui/buy.cpp b/src/gui/buy.cpp index 9fcf752b..102dd49e 100644 --- a/src/gui/buy.cpp +++ b/src/gui/buy.cpp @@ -85,7 +85,6 @@ BuyDialog::BuyDialog(): mShopItemList->setEventId("item"); mSlider->setEventId("slider"); - mShopItemList->addActionListener(this); mShopItemList->addSelectionListener(this); mSlider->addActionListener(this); @@ -112,7 +111,7 @@ void BuyDialog::setMoney(int amount) { mMoney = amount; mShopItemList->setPlayersMoney(amount); - mMoneyLabel->setCaption("Price : 0 GP / " + toString(mMoney) + " GP"); + mMoneyLabel->setCaption("Price: 0 GP / " + toString(mMoney) + " GP"); mMoneyLabel->adjustSize(); } @@ -129,7 +128,7 @@ void BuyDialog::reset() mDecreaseButton->setEnabled(false); mQuantityLabel->setCaption("0"); mQuantityLabel->adjustSize(); - mMoneyLabel->setCaption("Price : 0 GP / " + toString(mMoney) + " GP"); + mMoneyLabel->setCaption("Price: 0 GP / " + toString(mMoney) + " GP"); mMoneyLabel->adjustSize(); mItemDescLabel->setCaption(""); mItemEffectLabel->setCaption(""); @@ -145,31 +144,7 @@ void BuyDialog::action(const std::string &eventId, gcn::Widget *widget) { int selectedItem = mShopItemList->getSelected(); - if (eventId == "item") - { - // Reset amount of items and update labels - mAmountItems = 0; - mSlider->setValue(0); - mQuantityLabel->setCaption("0"); - mQuantityLabel->adjustSize(); - mMoneyLabel->setCaption("Price : 0 GP / " + toString(mMoney) + " GP"); - mMoneyLabel->adjustSize(); - - // Disable buttons for buying and decreasing - mBuyButton->setEnabled(false); - mDecreaseButton->setEnabled(false); - - // If no item was selected, none can be bought, otherwise - // calculate how many the player can afford - mMaxItems = (mShopItemList->getSelected() == -1) ? 0 : - mMoney / mShopItems->at(selectedItem).price; - - // When at least one item can be bought, enable the slider and the - // increase button - mIncreaseButton->setEnabled(mMaxItems > 0); - mSlider->setEnabled(mMaxItems > 0); - } - else if (eventId == "quit") + if (eventId == "quit") { setVisible(false); current_npc = 0; @@ -253,7 +228,7 @@ void BuyDialog::action(const std::string &eventId, gcn::Widget *widget) mQuantityLabel->adjustSize(); int price = mAmountItems * mShopItems->at(selectedItem).price; - mMoneyLabel->setCaption("Price : " + toString(price) + " GP / " + mMoneyLabel->setCaption("Price: " + toString(price) + " GP / " + toString(mMoney) + " GP" ); mMoneyLabel->adjustSize(); } @@ -261,19 +236,39 @@ void BuyDialog::action(const std::string &eventId, gcn::Widget *widget) void BuyDialog::selectionChanged(const SelectionEvent &event) { + // Reset amount of items and update labels + mAmountItems = 0; + mSlider->setValue(0); + mQuantityLabel->setCaption("0"); + mQuantityLabel->adjustSize(); + mMoneyLabel->setCaption("Price: 0 GP / " + toString(mMoney) + " GP"); + mMoneyLabel->adjustSize(); + + // Disable buttons for buying and decreasing + mBuyButton->setEnabled(false); + mDecreaseButton->setEnabled(false); + int selectedItem = mShopItemList->getSelected(); if (selectedItem > -1) { - const ItemInfo &info = - ItemDB::get(mShopItems->at(selectedItem).id); + const ItemInfo &info = ItemDB::get(mShopItems->at(selectedItem).id); mItemDescLabel->setCaption("Description: " + info.getDescription()); mItemEffectLabel->setCaption("Effect: " + info.getEffect()); + + // Calculate how many the player can afford + mMaxItems = mMoney / mShopItems->at(selectedItem).price; } else { mItemDescLabel->setCaption("Description:"); mItemEffectLabel->setCaption("Effect:"); + mMaxItems = 0; } + + // When at least one item can be bought, enable the slider and the + // increase button + mIncreaseButton->setEnabled(mMaxItems > 0); + mSlider->setEnabled(mMaxItems > 0); } diff --git a/src/gui/chargedialog.cpp b/src/gui/chargedialog.cpp index 349ca223..862378ae 100644 --- a/src/gui/chargedialog.cpp +++ b/src/gui/chargedialog.cpp @@ -37,6 +37,7 @@ ChargeDialog::ChargeDialog(): mProgBar = new ProgressBar(0.0f, 140, 25, 128, 128, 128); mProgBar->setPosition(20, 40); add(mProgBar); + setVisible(true); } // update the dialog diff --git a/src/gui/listbox.cpp b/src/gui/listbox.cpp index 14626d06..d4a2c6cb 100644 --- a/src/gui/listbox.cpp +++ b/src/gui/listbox.cpp @@ -38,9 +38,8 @@ ListBox::ListBox(gcn::ListModel *listModel): void ListBox::draw(gcn::Graphics *graphics) { - if (mListModel == NULL) { + if (!mListModel) return; - } graphics->setColor(gcn::Color(110, 160, 255)); graphics->setFont(getFont()); @@ -54,7 +53,9 @@ void ListBox::draw(gcn::Graphics *graphics) } // Draw the list elements - for (int i = 0, y = 0; i < mListModel->getNumberOfElements(); ++i, y += fontHeight) + for (int i = 0, y = 0; + i < mListModel->getNumberOfElements(); + ++i, y += fontHeight) { graphics->drawText(mListModel->getElementAt(i), 1, y); } diff --git a/src/gui/listbox.h b/src/gui/listbox.h index c1932f54..deca07cf 100644 --- a/src/gui/listbox.h +++ b/src/gui/listbox.h @@ -73,9 +73,9 @@ class ListBox : public gcn::ListBox /** * Sets the index of the selected element. */ - void setSelected(int selected); + virtual void setSelected(int selected); - private: + protected: /** * Sends out selection events to the list of selection listeners. */ diff --git a/src/gui/sell.cpp b/src/gui/sell.cpp index 499bbd05..b0957f9e 100644 --- a/src/gui/sell.cpp +++ b/src/gui/sell.cpp @@ -142,7 +142,8 @@ void SellDialog::addItem(Item *item, int price) ITEM_SHOP item_shop; - item_shop.name = item->getInfo().getName() + " " + toString(price) + " GP"; + item_shop.name = item->getInfo().getName() + + " (" + toString(price) + " GP)"; item_shop.price = price; item_shop.index = item->getInvIndex(); item_shop.id = item->getId(); diff --git a/src/gui/shop.cpp b/src/gui/shop.cpp index 2d33e8a8..3d972bc2 100644 --- a/src/gui/shop.cpp +++ b/src/gui/shop.cpp @@ -45,7 +45,7 @@ void ShopItems::addItem(short id, int price) ITEM_SHOP item_shop; item_shop.name = ItemDB::get(id).getName() - + " " + toString(price) + " GP"; + + " (" + toString(price) + " GP)"; item_shop.price = price; item_shop.id = id; item_shop.image = ItemDB::get(id).getImage(); diff --git a/src/gui/shoplistbox.cpp b/src/gui/shoplistbox.cpp index 61abff35..4821067c 100644 --- a/src/gui/shoplistbox.cpp +++ b/src/gui/shoplistbox.cpp @@ -34,11 +34,10 @@ #include "../graphics.h" -const int ITEM_SPRITE_HEIGHT = 32; +const int ITEM_ICON_SIZE = 32; ShopListBox::ShopListBox(gcn::ListModel *listModel): - gcn::ListBox(listModel), - mMousePressed(false), + ListBox(listModel), mPlayerMoney(0) { mRowHeight = getFont()->getHeight(); @@ -46,105 +45,101 @@ ShopListBox::ShopListBox(gcn::ListModel *listModel): } ShopListBox::ShopListBox(gcn::ListModel *listModel, ShopItems *shopListModel): - gcn::ListBox(listModel), - mMousePressed(false), + ListBox(listModel), mPlayerMoney(0), mShopItems(shopListModel) { - mRowHeight = (getFont()->getHeight() > ITEM_SPRITE_HEIGHT ? - getFont()->getHeight() : ITEM_SPRITE_HEIGHT); + mRowHeight = std::max(getFont()->getHeight(), ITEM_ICON_SIZE); mPriceCheck = true; } - void ShopListBox::setPlayersMoney(int money) { mPlayerMoney = money; } -void ShopListBox::draw(gcn::Graphics *graphics) +void ShopListBox::draw(gcn::Graphics *gcnGraphics) { - if (mListModel == NULL) { + if (!mListModel) return; - } + + Graphics *graphics = static_cast(gcnGraphics); graphics->setFont(getFont()); // Draw the list elements - for (int i = 0, y = 0; i < mListModel->getNumberOfElements(); ++i, y += mRowHeight) + for (int i = 0, y = 0; + i < mListModel->getNumberOfElements(); + ++i, y += mRowHeight) { - graphics->setColor(gcn::Color(0xffffff)); - if (mShopItems != NULL) + gcn::Color backgroundColor = gcn::Color(0xffffff); + + if (i == mSelected) { - if(mPlayerMoney < mShopItems->at(i).price && mPriceCheck) - { - graphics->setColor(gcn::Color(0x919191)); - } + backgroundColor = gcn::Color(110, 160, 255); } + else if (mShopItems && + mPlayerMoney < mShopItems->at(i).price && mPriceCheck) + { + backgroundColor = gcn::Color(0x919191); + } + + graphics->setColor(backgroundColor); graphics->fillRectangle(gcn::Rectangle(0, y, getWidth(), mRowHeight)); - if (mShopItems) - dynamic_cast(graphics)->drawImage(mShopItems->at(i).image, 1, y); - graphics->drawText(mListModel->getElementAt(i), ITEM_SPRITE_HEIGHT, y); - } - // Draw rectangle below the selected list element and the list element - // not shown. - if (mSelected >= 0) { - graphics->setColor(gcn::Color(110, 160, 255)); - graphics->fillRectangle(gcn::Rectangle(0, mRowHeight * mSelected, - getWidth(), mRowHeight)); if (mShopItems) - dynamic_cast(graphics)->drawImage( - mShopItems->at(mSelected).image, 1, mRowHeight * mSelected); - graphics->drawText(mListModel->getElementAt(mSelected), - ITEM_SPRITE_HEIGHT, mRowHeight * mSelected); + { + Image *icon = mShopItems->at(i).image; + if (icon) + { + graphics->drawImage(icon, 1, y); + } + } + graphics->drawText(mListModel->getElementAt(i), ITEM_ICON_SIZE + 5, + y + (ITEM_ICON_SIZE - getFont()->getHeight()) / 2); } } void ShopListBox::setSelected(int selected) { - gcn::ListBox::setSelected(selected); - if (mListModel != NULL) + if (!mListModel) { - gcn::BasicContainer *par = getParent(); - if (par == NULL) - { - return; - } - - gcn::Rectangle scroll; + mSelected = -1; + } + else + { + // Update mSelected with bounds checking + mSelected = std::min(mListModel->getNumberOfElements() - 1, + std::max(-1, selected)); - if (mSelected < 0) + gcn::BasicContainer *parent = getParent(); + if (parent) { - scroll.y = 0; + gcn::Rectangle scroll; + scroll.y = (mSelected < 0) ? 0 : mRowHeight * mSelected; + scroll.height = mRowHeight; + parent->showWidgetPart(this, scroll); } - else - { - scroll.y = mRowHeight * mSelected; - } - - scroll.height = mRowHeight; - par->showWidgetPart(this, scroll); } + fireSelectionChangedEvent(); } void ShopListBox::mousePress(int x, int y, int button) { - - bool enoughMoney = false; if (button == gcn::MouseInput::LEFT && hasMouse()) { - if (mShopItems) + bool enoughMoney = false; + + if (mShopItems && mPriceCheck) { - if(mPlayerMoney >= mShopItems->at(y / mRowHeight).price) + if (mPlayerMoney >= mShopItems->at(y / mRowHeight).price) enoughMoney = true; } else // Old Behaviour + { enoughMoney = true; - - if (!mPriceCheck) - enoughMoney = true; + } if (enoughMoney) { @@ -155,40 +150,9 @@ void ShopListBox::mousePress(int x, int y, int button) } } -void ShopListBox::mouseRelease(int x, int y, int button) -{ - gcn::ListBox::mouseRelease(x, y, button); - - mMousePressed = false; -} - -void ShopListBox::mouseMotion(int x, int y) -{ - gcn::ListBox::mouseMotion(x, y); - - // Pretend mouse is pressed continuously while dragged. Causes list - // selection to be updated as is default in many GUIs. - if (mMousePressed) - { - mousePress(x, y, gcn::MouseInput::LEFT); - } -} - -void ShopListBox::fireSelectionChangedEvent() -{ - SelectionEvent event(this); - SelectionListeners::iterator i_end = mListeners.end(); - SelectionListeners::iterator i; - - for (i = mListeners.begin(); i != i_end; ++i) - { - (*i)->selectionChanged(event); - } -} - void ShopListBox::adjustSize() { - if (mListModel != NULL) + if (mListModel) { setHeight(mRowHeight * mListModel->getNumberOfElements()); } diff --git a/src/gui/shoplistbox.h b/src/gui/shoplistbox.h index 2dff8977..476564b2 100644 --- a/src/gui/shoplistbox.h +++ b/src/gui/shoplistbox.h @@ -21,10 +21,10 @@ * $Id: listbox.h 2655 2006-09-03 21:25:02Z b_lindeijer $ */ -#ifndef _TMW_LISTBOX_H -#define _TMW_LISTBOX_H +#ifndef _TMW_SHOPLISTBOX_H +#define _TMW_SHOPLISTBOX_H -#include +#include "listbox.h" #include "shop.h" class SelectionListener; @@ -36,7 +36,7 @@ class SelectionListener; * * \ingroup GUI */ -class ShopListBox : public gcn::ListBox +class ShopListBox : public ListBox { public: /** @@ -55,8 +55,6 @@ class ShopListBox : public gcn::ListBox void draw(gcn::Graphics *graphics); void mousePress(int x, int y, int button); - void mouseRelease(int x, int y, int button); - void mouseMotion(int x, int y); /** * Adds a listener to the list that's notified each time a change to @@ -98,15 +96,6 @@ class ShopListBox : public gcn::ListBox void setPriceCheck(bool check); private: - /** - * Sends out selection events to the list of selection listeners. - */ - void fireSelectionChangedEvent(); - - bool mMousePressed; /**< Keeps track of mouse pressed status. */ - - std::list mListeners; - int mPlayerMoney; /** @@ -118,7 +107,6 @@ class ShopListBox : public gcn::ListBox int mRowHeight; /**< Row Height */ bool mPriceCheck; - }; #endif diff --git a/src/gui/updatewindow.cpp b/src/gui/updatewindow.cpp index 73343483..73e4489e 100644 --- a/src/gui/updatewindow.cpp +++ b/src/gui/updatewindow.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -48,9 +49,9 @@ UpdaterWindow::UpdaterWindow(): Window("Updating..."), mThread(NULL), mMutex(NULL), mDownloadStatus(UPDATE_NEWS), mUpdateHost(""), mCurrentFile("news.txt"), mBasePath(""), - mStoreInMemory(true), mDownloadComplete(true), mUserCancel(false), - mDownloadedBytes(0), mMemoryBuffer(NULL), - mCurlError(new char[CURL_ERROR_SIZE]), mFileIndex(0) + mStoreInMemory(true), mDownloadComplete(true), mUserCancel(false), + mDownloadedBytes(0), mMemoryBuffer(NULL), + mCurlError(new char[CURL_ERROR_SIZE]), mLineIndex(0) { mCurlError[0] = 0; @@ -83,8 +84,9 @@ UpdaterWindow::UpdaterWindow(): add(mCancelButton); add(mPlayButton); - mCancelButton->requestFocus(); setLocationRelativeTo(getParent()); + setVisible(true); + mCancelButton->requestFocus(); mUpdateHost = config.getValue("updatehost", "http://updates.themanaworld.org"); @@ -179,7 +181,6 @@ void UpdaterWindow::loadNews() mMemoryBuffer = NULL; mScrollArea->setVerticalScrollAmount(0); - setVisible(true); } int UpdaterWindow::updateProgress(void *ptr, @@ -227,78 +228,116 @@ size_t UpdaterWindow::memoryWrite(void *ptr, int UpdaterWindow::downloadThread(void *ptr) { + int attempts = 0; + UpdaterWindow *uw = reinterpret_cast(ptr); CURL *curl; CURLcode res; - FILE *outfile = NULL; - UpdaterWindow *uw = reinterpret_cast(ptr); std::string outFilename; std::string url(uw->mUpdateHost + "/" + uw->mCurrentFile); - uw->setLabel(uw->mCurrentFile + " (0%)"); - curl = curl_easy_init(); + while (attempts < 3 && !uw->mDownloadComplete) { + FILE *outfile = NULL; + uw->setLabel(uw->mCurrentFile + " (0%)"); - if (curl) - { - logger->log("Downloading: %s", url.c_str()); + curl = curl_easy_init(); - if (uw->mStoreInMemory) + if (curl) { - uw->mDownloadedBytes = 0; - curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, - UpdaterWindow::memoryWrite); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, ptr); - } - else - { - // Download in the proper folder : ./updates under win, - // /home/user/.tmw/updates for unices - outFilename = uw->mBasePath + "/updates/download.temp"; - outfile = fopen(outFilename.c_str(), "wb"); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile); - } + logger->log("Downloading: %s", url.c_str()); - curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, uw->mCurlError); - curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); - curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); - curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, - UpdaterWindow::updateProgress); - curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, ptr); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15); + if (uw->mStoreInMemory) + { + uw->mDownloadedBytes = 0; + curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, + UpdaterWindow::memoryWrite); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, ptr); + } + else + { + // Download in the proper folder : ./updates under win, + // /home/user/.tmw/updates for unices + outFilename = uw->mBasePath + "/updates/download.temp"; + outfile = fopen(outFilename.c_str(), "w+b"); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile); + } - if ((res = curl_easy_perform(curl)) != 0) - { - uw->mDownloadStatus = UPDATE_ERROR; - switch (res) + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, uw->mCurlError); + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); + curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, + UpdaterWindow::updateProgress); + curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, ptr); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 15); + + if ((res = curl_easy_perform(curl)) != 0) { - case CURLE_COULDNT_CONNECT: // give more debug info on that error - std::cerr << "curl error " << res << " : " << uw->mCurlError << " " << url.c_str() - << std::endl; - break; - - default: - std::cerr << "curl error " << res << " : " << uw->mCurlError << " host: " << url.c_str() - << std::endl; + uw->mDownloadStatus = UPDATE_ERROR; + switch (res) + { + case CURLE_COULDNT_CONNECT: // give more debug info on that error + std::cerr << "curl error " << res << " : " << uw->mCurlError << " " << url.c_str() + << std::endl; + break; + + default: + std::cerr << "curl error " << res << " : " << uw->mCurlError << " host: " << url.c_str() + << std::endl; + } } - } - curl_easy_cleanup(curl); - uw->mDownloadComplete = true; + curl_easy_cleanup(curl); - if (!uw->mStoreInMemory) - { - fclose(outfile); + uw->mDownloadComplete = true; - // Give the file the proper name - std::string newName(uw->mBasePath + "/updates/" + - uw->mCurrentFile.c_str()); + if (!uw->mStoreInMemory) + { + long fileSize; + char *buffer; + // Obtain file size. + fseek(outfile, 0, SEEK_END); + fileSize = ftell(outfile); + rewind(outfile); + buffer = (char*)malloc(fileSize); + fread(buffer, 1, fileSize, outfile); + fclose(outfile); + + // Give the file the proper name + std::string newName(uw->mBasePath + "/updates/" + + uw->mCurrentFile.c_str()); + + // Any existing file with this name is deleted first, otherwise the + // rename will fail on Windows. + ::remove(newName.c_str()); + ::rename(outFilename.c_str(), newName.c_str()); + + // Don't check resources2.txt checksum + if (uw->mDownloadStatus == UPDATE_RESOURCES) + { + // Calculate Adler-32 checksum + unsigned long adler = adler32(0L, Z_NULL, 0); + adler = adler32(adler, (Bytef *)buffer, fileSize); + free(buffer); + + if (uw->mCurrentChecksum != adler) { + uw->mDownloadComplete = false; + // Remove the corrupted file + ::remove(newName.c_str()); + logger->log( + "Checksum for file %s failed: (%lx/%lx)", + uw->mCurrentFile.c_str(), + adler, uw->mCurrentChecksum); + } + } - // Any existing file with this name is deleted first, otherwise the - // rename will fail on Windows. - ::remove(newName.c_str()); - ::rename(outFilename.c_str(), newName.c_str()); + } } + attempts++; + } + + if (!uw->mDownloadComplete) { + uw->mDownloadStatus = UPDATE_ERROR; } return 0; @@ -351,7 +390,7 @@ void UpdaterWindow::logic() // Parse current memory buffer as news and dispose of the data loadNews(); - mCurrentFile = "resources.txt"; + mCurrentFile = "resources2.txt"; mStoreInMemory = false; download(); mDownloadStatus = UPDATE_LIST; @@ -361,7 +400,7 @@ void UpdaterWindow::logic() if (mDownloadComplete) { ResourceManager *resman = ResourceManager::getInstance(); - mFiles = resman->loadTextFile("updates/resources.txt"); + mLines = resman->loadTextFile("updates/resources2.txt"); mStoreInMemory = false; mDownloadStatus = UPDATE_RESOURCES; } @@ -375,9 +414,15 @@ void UpdaterWindow::logic() mThread = NULL; } - if (mFileIndex < mFiles.size()) + if (mLineIndex < mLines.size()) { - mCurrentFile = mFiles[mFileIndex]; + std::stringstream line(mLines[mLineIndex]); + line >> mCurrentFile; + std::string checksum; + line >> checksum; + std::stringstream ss(checksum); + ss >> std::hex >> mCurrentChecksum; + std::ifstream temp( (mBasePath + "/updates/" + mCurrentFile).c_str()); if (!temp.is_open()) @@ -389,7 +434,7 @@ void UpdaterWindow::logic() { logger->log("%s already here", mCurrentFile.c_str()); } - mFileIndex++; + mLineIndex++; } else { diff --git a/src/gui/updatewindow.h b/src/gui/updatewindow.h index 16442656..0d1493ee 100644 --- a/src/gui/updatewindow.h +++ b/src/gui/updatewindow.h @@ -140,6 +140,11 @@ class UpdaterWindow : public Window, public gcn::ActionListener */ std::string mCurrentFile; + /** + * The Adler32 checksum of the file currently downloading. + */ + unsigned long mCurrentChecksum; + /** * Absolute path to locally save downloaded files. */ @@ -179,12 +184,12 @@ class UpdaterWindow : public Window, public gcn::ActionListener /** * List of files to download */ - std::vector mFiles; + std::vector mLines; /** * Index of the file to be downloaded */ - unsigned int mFileIndex; + unsigned int mLineIndex; gcn::Label *mLabel; /**< Progress bar caption. */ Button *mCancelButton; /**< Button to stop the update process. */ diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index 3346c07a..75a16865 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -197,8 +197,8 @@ Viewport::draw(gcn::Graphics *gcnGraphics) } // Draw target marker if needed - Being *target; - if ((target = player_node->getTarget())) + Being *target = player_node->getTarget(); + if (target) { graphics->setFont(speechFont); graphics->setColor(gcn::Color(255, 32, 32)); diff --git a/src/guichanfwd.h b/src/guichanfwd.h index 5eabc783..812f3f7a 100644 --- a/src/guichanfwd.h +++ b/src/guichanfwd.h @@ -27,6 +27,7 @@ namespace gcn { class ActionListener; class AllegroGraphics; + class AllegroImage; class AllegroImageLoader; class AllegroInput; class BasicContainer; @@ -56,11 +57,13 @@ namespace gcn { class MouseInput; class MouseListener; class OpenGLGraphics; - class OpenGLImageLoader; + class OpenGLImage; + class OpenGLSDLImageLoader; class RadioButton; class Rectangle; class ScrollArea; class SDLGraphics; + class SDLImage; class SDLImageLoader; class SDLInput; class Slider; diff --git a/src/inventory.h b/src/inventory.h index 40bcafbb..32ae393e 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -31,7 +31,14 @@ class Item; class Inventory { public: + /** + * Constructor. + */ Inventory(); + + /** + * Destructor. + */ ~Inventory(); /** diff --git a/src/localplayer.cpp b/src/localplayer.cpp index ba7b6117..8076c538 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -166,11 +166,6 @@ void LocalPlayer::pickUp(FloorItem *item) void LocalPlayer::walk(unsigned char dir) { - if (mWalkingDir != dir) - { - mWalkingDir = dir; - } - if (!mMap || !dir) return; @@ -237,6 +232,20 @@ void LocalPlayer::setDestination(Uint16 x, Uint16 y) Being::setDestination(x, y); } +void LocalPlayer::setWalkingDir(int dir) +{ + if (mWalkingDir != dir) + { + mWalkingDir = dir; + } + + // If we're not already walking, start walking. + if (mAction != WALK && dir) + { + walk(dir); + } +} + void LocalPlayer::raiseAttribute(Attribute attr) { // XXX Convert for new server diff --git a/src/localplayer.h b/src/localplayer.h index 59b59812..765b7cca 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -42,9 +42,15 @@ class LocalPlayer : public Player STR = 0, AGI, VIT, INT, DEX, LUK }; + /** + * Constructor. + */ LocalPlayer(); - virtual ~LocalPlayer(); + /** + * Destructor. + */ + ~LocalPlayer(); virtual void logic(); @@ -111,13 +117,16 @@ class LocalPlayer : public Player */ void setTarget(Being* target) { mTarget = target; } - void walk(unsigned char dir); - /** * Sets a new destination for this being to walk to. */ void setDestination(Uint16 x, Uint16 y); + /** + * Sets a new direction to keep walking in. + */ + void setWalkingDir(int dir); + void raiseAttribute(Attribute attr); void raiseSkill(Uint16 skillId); @@ -151,6 +160,8 @@ class LocalPlayer : public Player std::auto_ptr mInventory; protected: + void walk(unsigned char dir); + Being *mTarget; FloorItem *mPickUpTarget; diff --git a/src/main.cpp b/src/main.cpp index 90368b7d..8163cde3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -309,11 +309,6 @@ void init_engine() errorMessage = err; logger->log("Warning: %s", err); } - - // Load XML databases - EquipmentDB::load(); - ItemDB::load(); - MonsterDB::load(); } /** Clear the engine */ @@ -411,19 +406,22 @@ void parseOptions(int argc, char *argv[], Options &options) } /** - * Reads the file "updates/resources.txt" and attempts to load each update + * Reads the file "updates/resources2.txt" and attempts to load each update * mentioned in it. */ void loadUpdates() { - const std::string updatesFile = "updates/resources.txt"; + const std::string updatesFile = "updates/resources2.txt"; ResourceManager *resman = ResourceManager::getInstance(); std::vector lines = resman->loadTextFile(updatesFile); std::string homeDir = config.getValue("homeDir", ""); for (unsigned int i = 0; i < lines.size(); ++i) { - resman->addToSearchPath(homeDir + "/updates/" + lines[i], false); + std::stringstream line(lines[i]); + std::string filename; + line >> filename; + resman->addToSearchPath(homeDir + "/updates/" + filename, false); } } @@ -687,6 +685,12 @@ int main(int argc, char *argv[]) case STATE_LOGIN: logger->log("State: LOGIN"); + + // Load XML databases + EquipmentDB::load(); + ItemDB::load(); + MonsterDB::load(); + currentDialog = new LoginDialog(&loginData); // TODO: Restore autologin //if (!loginData.password.empty()) { diff --git a/src/main.h b/src/main.h index b68a4e4d..14f52e4d 100644 --- a/src/main.h +++ b/src/main.h @@ -29,8 +29,7 @@ #ifdef HAVE_CONFIG_H #include "../config.h" #elif defined WIN32 -#include "../The_Mana_World_private.h" -#define PACKAGE_VERSION PRODUCT_VERSION +#include "winver.h" #endif #ifndef TMW_DATADIR diff --git a/src/net/playerhandler.cpp b/src/net/playerhandler.cpp index 988a9a68..f16037cf 100644 --- a/src/net/playerhandler.cpp +++ b/src/net/playerhandler.cpp @@ -31,14 +31,24 @@ #include "../log.h" #include "../npc.h" +#include "../gui/buy.h" #include "../gui/chat.h" +#include "../gui/npclistdialog.h" +#include "../gui/npc_text.h" #include "../gui/ok_dialog.h" +#include "../gui/sell.h" #include "../gui/skill.h" // TODO Move somewhere else OkDialog *weightNotice = NULL; OkDialog *deathNotice = NULL; +extern NpcListDialog *npcListDialog; +extern NpcTextDialog *npcTextDialog; +extern BuyDialog *buyDialog; +extern SellDialog *sellDialog; +extern Window *buySellDialog; + /** * Listener used for handling the overweigth message. */ @@ -64,6 +74,12 @@ namespace { { player_node->revive(); deathNotice = NULL; + npcListDialog->setVisible(false); + npcTextDialog->setVisible(false); + buyDialog->setVisible(false); + sellDialog->setVisible(false); + buySellDialog->setVisible(false); + current_npc = 0; } } deathListener; } diff --git a/src/npc.cpp b/src/npc.cpp index 3c142889..ccd085b6 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -29,7 +29,6 @@ #include "gui/gui.h" class Spriteset; -extern Spriteset *npcset; NPC *current_npc = 0; diff --git a/src/resources/action.cpp b/src/resources/action.cpp new file mode 100644 index 00000000..247455db --- /dev/null +++ b/src/resources/action.cpp @@ -0,0 +1,67 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "action.h" + +#include + +#include "animation.h" + +#include "../utils/dtor.h" + + +Action::Action() +{ +} + +Action::~Action() +{ + std::for_each(mAnimations.begin(), mAnimations.end(), + make_dtor(mAnimations)); +} + +Animation* +Action::getAnimation(int direction) const +{ + Animations::const_iterator i = mAnimations.find(direction); + + // When the direction isn't defined, try the default + if (i == mAnimations.end()) + { + i = mAnimations.find(0); + } + + return (i == mAnimations.end()) ? NULL : i->second; +} + +void +Action::setAnimation(int direction, Animation *animation) +{ + // Set first direction as default direction + if (mAnimations.empty()) + { + mAnimations[0] = animation; + } + + mAnimations[direction] = animation; +} diff --git a/src/resources/action.h b/src/resources/action.h new file mode 100644 index 00000000..8d5e8d11 --- /dev/null +++ b/src/resources/action.h @@ -0,0 +1,61 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_ACTION_H +#define _TMW_ACTION_H + +#include + +#include + +class Animation; + +/** + * An action consists of several animations, one for each direction. + */ +class Action +{ + public: + /** + * Constructor. + */ + Action(); + + /** + * Destructor. + */ + ~Action(); + + void + setAnimation(int direction, Animation *animation); + + Animation* + getAnimation(int direction) const; + + protected: + typedef std::map Animations; + typedef Animations::iterator AnimationIterator; + Animations mAnimations; +}; + +#endif diff --git a/src/resources/animation.cpp b/src/resources/animation.cpp new file mode 100644 index 00000000..de96525c --- /dev/null +++ b/src/resources/animation.cpp @@ -0,0 +1,53 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "animation.h" + +#include + +#include "../utils/dtor.h" + +Animation::Animation(): + mDuration(0) +{ +} + +void +Animation::addFrame(Image *image, unsigned int delay, int offsetX, int offsetY) +{ + Frame frame = { image, delay, offsetX, offsetY }; + mFrames.push_back(frame); + mDuration += delay; +} + +void +Animation::addTerminator() +{ + addFrame(NULL, 0, 0, 0); +} + +bool +Animation::isTerminator(const Frame &candidate) +{ + return (candidate.image == NULL); +} diff --git a/src/resources/animation.h b/src/resources/animation.h new file mode 100644 index 00000000..54142bcb --- /dev/null +++ b/src/resources/animation.h @@ -0,0 +1,99 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_ANIMATION_H +#define _TMW_ANIMATION_H + +#include + +#include + +class Image; +class Spriteset; + +/** + * A single frame in an animation, with a delay and an offset. + */ +struct Frame +{ + Image *image; + unsigned int delay; + int offsetX; + int offsetY; +}; + +/** + * An animation consists of several frames, each with their own delay and + * offset. + */ +class Animation +{ + public: + /** + * Constructor. + */ + Animation(); + + /** + * Appends a new animation at the end of the sequence + */ + void + addFrame(Image *image, unsigned int delay, int offsetX, int offsetY); + + /** + * Appends an animation terminator that states that the animation + * should not loop. + */ + void + addTerminator(); + + /** + * Returns the frame at the specified index. + */ + Frame* + getFrame(int index) { return &(mFrames[index]); } + + /** + * Returns the length of this animation in frames. + */ + unsigned int + getLength() const { return mFrames.size(); } + + /** + * Returns the duration of this animation. + */ + int + getDuration() const { return mDuration; } + + /** + * Determines whether the given animation frame is a terminator. + */ + static bool + isTerminator(const Frame &phase); + + protected: + std::vector mFrames; + int mDuration; +}; + +#endif diff --git a/src/resources/equipmentdb.cpp b/src/resources/equipmentdb.cpp index 78ae3b6a..52a9fbd3 100644 --- a/src/resources/equipmentdb.cpp +++ b/src/resources/equipmentdb.cpp @@ -40,6 +40,9 @@ namespace void EquipmentDB::load() { + if (mLoaded) + return; + logger->log("Initializing equipment database..."); mUnknown.setSprite("error.xml", 0); mUnknown.setSprite("error.xml", 1); diff --git a/src/resources/image.cpp b/src/resources/image.cpp index 48818f6f..9398e06b 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -153,10 +153,10 @@ Image* Image::load(void *buffer, unsigned int bufferSize, SDL_FreeSurface(image); if (hasPink && !hasAlpha) { - SDL_SetColorKey(tmpImage, SDL_SRCCOLORKEY | SDL_RLEACCEL, + SDL_SetColorKey(tmpImage, SDL_SRCCOLORKEY, SDL_MapRGB(tmpImage->format, 255, 0, 255)); } else if (hasAlpha) { - SDL_SetAlpha(tmpImage, SDL_SRCALPHA | SDL_RLEACCEL, SDL_ALPHA_OPAQUE); + SDL_SetAlpha(tmpImage, SDL_SRCALPHA, SDL_ALPHA_OPAQUE); } #ifdef USE_OPENGL @@ -305,7 +305,7 @@ void Image::setAlpha(float a) if (mImage) { // Set the alpha value this image is drawn at - SDL_SetAlpha(mImage, SDL_SRCALPHA | SDL_RLEACCEL, (int)(255 * mAlpha)); + SDL_SetAlpha(mImage, SDL_SRCALPHA, (int) (255 * mAlpha)); } } diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index b91e34cc..f914af47 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -37,11 +37,15 @@ namespace { ItemDB::ItemInfos mItemInfos; ItemInfo mUnknown; + bool mLoaded = false; } void ItemDB::load() { + if (mLoaded) + return; + logger->log("Initializing item database..."); mUnknown.setName("Unknown item"); @@ -150,6 +154,8 @@ void ItemDB::load() } xmlFreeDoc(doc); + + mLoaded = true; } void ItemDB::unload() @@ -159,6 +165,8 @@ void ItemDB::unload() delete i->second; } mItemInfos.clear(); + + mLoaded = false; } const ItemInfo& diff --git a/src/resources/itemdb.h b/src/resources/itemdb.h index 5922984a..c080194b 100644 --- a/src/resources/itemdb.h +++ b/src/resources/itemdb.h @@ -29,17 +29,17 @@ #include /** - * The namespace that holds the item information + * The namespace that holds the item information. */ namespace ItemDB { /** - * Loads the item data from Items.xml + * Loads the item data from items.xml. */ void load(); /** - * Frees item data + * Frees item data. */ void unload(); diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index 4569ced7..15a88b4d 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -30,11 +30,11 @@ #include "resourcemanager.h" #include "image.h" -#include "../base64.h" #include "../log.h" #include "../map.h" #include "../tileset.h" +#include "../utils/base64.h" #include "../utils/tostring.h" #include "../utils/xml.h" diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index fb03f6c1..e4406f9c 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -34,11 +34,15 @@ namespace { MonsterDB::MonsterInfos mMonsterInfos; MonsterInfo mUnknown; + bool mLoaded = false; } void MonsterDB::load() { + if (mLoaded) + return; + mUnknown.setSprite("error.xml"); mUnknown.setName("unnamed"); @@ -123,6 +127,8 @@ MonsterDB::load() } mMonsterInfos[XML::getProperty(monsterNode, "id", 0)] = currentInfo; } + + mLoaded = true; } void @@ -131,6 +137,8 @@ MonsterDB::unload() for_each ( mMonsterInfos.begin(), mMonsterInfos.end(), make_dtor(mMonsterInfos)); mMonsterInfos.clear(); + + mLoaded = false; } diff --git a/src/resources/openglsdlimageloader.cpp b/src/resources/openglsdlimageloader.cpp index b3e1601e..68de1e19 100644 --- a/src/resources/openglsdlimageloader.cpp +++ b/src/resources/openglsdlimageloader.cpp @@ -31,7 +31,8 @@ #ifdef USE_OPENGL -SDL_Surface* OpenGLSDLImageLoader::loadSDLSurface(const std::string& filename) +SDL_Surface* +OpenGLSDLImageLoader::loadSDLSurface(const std::string &filename) { ResourceManager *resman = ResourceManager::getInstance(); return resman->loadSDLSurface(filename); diff --git a/src/resources/openglsdlimageloader.h b/src/resources/openglsdlimageloader.h index 29be294c..b79dde15 100644 --- a/src/resources/openglsdlimageloader.h +++ b/src/resources/openglsdlimageloader.h @@ -31,7 +31,8 @@ class OpenGLSDLImageLoader : public gcn::OpenGLSDLImageLoader { protected: - SDL_Surface* loadSDLSurface(const std::string& filename); + SDL_Surface* + loadSDLSurface(const std::string &filename); }; #endif diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp index bd273b3b..feb6f8f8 100644 --- a/src/resources/spritedef.cpp +++ b/src/resources/spritedef.cpp @@ -23,11 +23,10 @@ #include "spritedef.h" -#include "../animation.h" -#include "../action.h" -#include "../graphics.h" #include "../log.h" +#include "animation.h" +#include "action.h" #include "resourcemanager.h" #include "spriteset.h" #include "image.h" @@ -208,20 +207,20 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, Animation *animation = new Animation(); action->setAnimation(directionType, animation); - // Get animation phases - for (xmlNodePtr phaseNode = animationNode->xmlChildrenNode; - phaseNode != NULL; - phaseNode = phaseNode->next) + // Get animation frames + for (xmlNodePtr frameNode = animationNode->xmlChildrenNode; + frameNode != NULL; + frameNode = frameNode->next) { - int delay = XML::getProperty(phaseNode, "delay", 0); - int offsetX = XML::getProperty(phaseNode, "offsetX", 0); - int offsetY = XML::getProperty(phaseNode, "offsetY", 0); + int delay = XML::getProperty(frameNode, "delay", 0); + int offsetX = XML::getProperty(frameNode, "offsetX", 0); + int offsetY = XML::getProperty(frameNode, "offsetY", 0); offsetY -= imageset->getHeight() - 32; offsetX -= imageset->getWidth() / 2 - 16; - if (xmlStrEqual(phaseNode->name, BAD_CAST "frame")) + if (xmlStrEqual(frameNode->name, BAD_CAST "frame")) { - int index = XML::getProperty(phaseNode, "index", -1); + int index = XML::getProperty(frameNode, "index", -1); if (index < 0) { @@ -237,12 +236,12 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, continue; } - animation->addPhase(img, delay, offsetX, offsetY); + animation->addFrame(img, delay, offsetX, offsetY); } - else if (xmlStrEqual(phaseNode->name, BAD_CAST "sequence")) + else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) { - int start = XML::getProperty(phaseNode, "start", -1); - int end = XML::getProperty(phaseNode, "end", -1); + int start = XML::getProperty(frameNode, "start", -1); + int end = XML::getProperty(frameNode, "end", -1); if (start < 0 || end < 0) { @@ -261,15 +260,15 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, continue; } - animation->addPhase(img, delay, offsetX, offsetY); + animation->addFrame(img, delay, offsetX, offsetY); start++; } } - else if (xmlStrEqual(phaseNode->name, BAD_CAST "end")) + else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) { animation->addTerminator(); } - } // for phaseNode + } // for frameNode } void diff --git a/src/resources/spritedef.h b/src/resources/spritedef.h index 64414259..057129ad 100644 --- a/src/resources/spritedef.h +++ b/src/resources/spritedef.h @@ -32,10 +32,7 @@ #include class Action; -class Graphics; class Spriteset; -struct AnimationPhase; -class Animation; enum SpriteAction { diff --git a/src/resources/spriteset.cpp b/src/resources/spriteset.cpp index 9b09f1e5..96bcef0c 100644 --- a/src/resources/spriteset.cpp +++ b/src/resources/spriteset.cpp @@ -53,7 +53,7 @@ Spriteset::~Spriteset() Image* Spriteset::get(size_type i) { - if (i > mSpriteset.size()) + if (i >= mSpriteset.size()) { logger->log("Warning: Sprite #%i does not exist in this spriteset", i); return NULL; diff --git a/src/tmw.rc b/src/tmw.rc index 5a3b1649..ee5f99cd 100644 --- a/src/tmw.rc +++ b/src/tmw.rc @@ -1,34 +1,23 @@ #include // include for version info constants +#include "winver.h" A ICON MOVEABLE PURE LOADONCALL DISCARDABLE "data/icons/tmw-icon.ico" -// -// TO CHANGE VERSION INFORMATION, EDIT PROJECT OPTIONS... -// 1 VERSIONINFO -FILEVERSION 0,1,0,0 -PRODUCTVERSION 0,1,0,0 -FILETYPE VFT_APP -{ - BLOCK "StringFileInfo" - { - BLOCK "040904E4" - { - VALUE "CompanyName", "The Mana World Development Team" - VALUE "FileVersion", "0.1.0" - VALUE "FileDescription", "The Mana World" - VALUE "InternalName", "tmw.exe" - VALUE "LegalCopyright", "2004-2006 (C)" - VALUE "LegalTrademarks", "" - VALUE "OriginalFilename", "tmw.exe" - VALUE "ProductName", "The Mana World MMORPG" - VALUE "ProductVersion", "0.1.0" - } - } - BLOCK "VarFileInfo" - { - VALUE "Translation", 0x0409, 1252 - } +FILEVERSION VER_MAJOR,VER_MINOR,VER_RELEASE,VER_BUILD +PRODUCTVERSION VER_MAJOR,VER_MINOR,VER_RELEASE,VER_BUILD +FILETYPE VFT_APP { + BLOCK "StringFileInfo" { + BLOCK "040904E4" { + VALUE "CompanyName", "The Mana World Development Team" + VALUE "FileVersion", PACKAGE_VERSION + VALUE "FileDescription", "The Mana World" + VALUE "LegalCopyright", "2004-2006 (C)" + VALUE "OriginalFilename", "tmw.exe" + VALUE "ProductName", "The Mana World MMORPG" + VALUE "ProductVersion", PACKAGE_VERSION + } + } } diff --git a/src/utils/base64.cpp b/src/utils/base64.cpp new file mode 100644 index 00000000..9a8f6356 --- /dev/null +++ b/src/utils/base64.cpp @@ -0,0 +1,149 @@ +/* + +----------------------------------------------------------------------+ + | PHP HTML Embedded Scripting Language Version 3.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997-2000 PHP Development Team (See Credits file) | + +----------------------------------------------------------------------+ + | This program is free software; you can redistribute it and/or modify | + | it under the terms of one of the following licenses: | + | | + | A) the GNU General Public License as published by the Free Software | + | Foundation; either version 2 of the License, or (at your option) | + | any later version. | + | | + | B) the PHP License as published by the PHP Development Team and | + | included in the distribution in the file: LICENSE | + | | + | This program is distributed in the hope that it will be useful, | + | but WITHOUT ANY WARRANTY; without even the implied warranty of | + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | + | GNU General Public License for more details. | + | | + | You should have received a copy of both licenses referred to here. | + | If you did not, or have any questions about PHP licensing, please | + | contact core@php.net. | + +----------------------------------------------------------------------+ + | Author: Jim Winstead (jimw@php.net) | + +----------------------------------------------------------------------+ + */ +/* $Id$ */ + +#include +#include + +#include "base64.h" + +static char base64_table[] = +{ + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '\0' +}; +static char base64_pad = '='; + +unsigned char *php3_base64_encode(const unsigned char *string, int length, int *ret_length) { + const unsigned char *current = string; + int i = 0; + unsigned char *result = (unsigned char *)malloc(((length + 3 - length % 3) * 4 / 3 + 1) * sizeof(char)); + + while (length > 2) { /* keep going until we have less than 24 bits */ + result[i++] = base64_table[current[0] >> 2]; + result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)]; + result[i++] = base64_table[((current[1] & 0x0f) << 2) + (current[2] >> 6)]; + result[i++] = base64_table[current[2] & 0x3f]; + + current += 3; + length -= 3; /* we just handle 3 octets of data */ + } + + /* now deal with the tail end of things */ + if (length != 0) { + result[i++] = base64_table[current[0] >> 2]; + if (length > 1) { + result[i++] = base64_table[((current[0] & 0x03) << 4) + (current[1] >> 4)]; + result[i++] = base64_table[(current[1] & 0x0f) << 2]; + result[i++] = base64_pad; + } + else { + result[i++] = base64_table[(current[0] & 0x03) << 4]; + result[i++] = base64_pad; + result[i++] = base64_pad; + } + } + if(ret_length) { + *ret_length = i; + } + result[i] = '\0'; + return result; +} + +/* as above, but backwards. :) */ +unsigned char *php3_base64_decode(const unsigned char *string, int length, int *ret_length) { + const unsigned char *current = string; + int ch, i = 0, j = 0, k; + char *chp; + + unsigned char *result = (unsigned char *)malloc(length + 1); + + if (result == NULL) { + return NULL; + } + + /* run through the whole string, converting as we go */ + while ((ch = *current++) != '\0') { + if (ch == base64_pad) break; + + /* When Base64 gets POSTed, all pluses are interpreted as spaces. + This line changes them back. It's not exactly the Base64 spec, + but it is completely compatible with it (the spec says that + spaces are invalid). This will also save many people considerable + headache. - Turadg Aleahmad + */ + + if (ch == ' ') ch = '+'; + + chp = strchr(base64_table, ch); + if (chp == NULL) continue; + ch = chp - base64_table; + + switch(i % 4) { + case 0: + result[j] = ch << 2; + break; + case 1: + result[j++] |= ch >> 4; + result[j] = (ch & 0x0f) << 4; + break; + case 2: + result[j++] |= ch >>2; + result[j] = (ch & 0x03) << 6; + break; + case 3: + result[j++] |= ch; + break; + } + i++; + } + + k = j; + /* mop things up if we ended on a boundary */ + if (ch == base64_pad) { + switch(i % 4) { + case 0: + case 1: + free(result); + return NULL; + case 2: + k++; + case 3: + result[k++] = 0; + } + } + if(ret_length) { + *ret_length = j; + } + result[k] = '\0'; + return result; +} diff --git a/src/utils/base64.h b/src/utils/base64.h new file mode 100644 index 00000000..ff20ac53 --- /dev/null +++ b/src/utils/base64.h @@ -0,0 +1,37 @@ +/* + +----------------------------------------------------------------------+ + | PHP HTML Embedded Scripting Language Version 3.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997,1998 PHP Development Team (See Credits file) | + +----------------------------------------------------------------------+ + | This program is free software; you can redistribute it and/or modify | + | it under the terms of one of the following licenses: | + | | + | A) the GNU General Public License as published by the Free Software | + | Foundation; either version 2 of the License, or (at your option) | + | any later version. | + | | + | B) the PHP License as published by the PHP Development Team and | + | included in the distribution in the file: LICENSE | + | | + | This program is distributed in the hope that it will be useful, | + | but WITHOUT ANY WARRANTY; without even the implied warranty of | + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | + | GNU General Public License for more details. | + | | + | You should have received a copy of both licenses referred to here. | + | If you did not, or have any questions about PHP licensing, please | + | contact core@php.net. | + +----------------------------------------------------------------------+ + | Author: Jim Winstead (jimw@php.net) | + +----------------------------------------------------------------------+ + */ +/* $Id$ */ + +#ifndef _TMW_BASE64_H +#define _TMW_BASE64_H + +extern unsigned char *php3_base64_encode(const unsigned char *, int, int *); +extern unsigned char *php3_base64_decode(const unsigned char *, int, int *); + +#endif /* _TMW_BASE64_H */ diff --git a/src/utils/wingettimeofday.h b/src/utils/wingettimeofday.h index 0f8b767a..a5537f39 100644 --- a/src/utils/wingettimeofday.h +++ b/src/utils/wingettimeofday.h @@ -1,5 +1,5 @@ /* - * The Mana World Server + * The Mana World * Copyright 2004 The Mana World Development Team * * This file is part of The Mana World. @@ -17,10 +17,12 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ */ -#ifndef _TMWSERV_WINGETTIMEOFDAY_H_ -#define _TMWSERV_WINGETTIMEOFDAY_H_ +#ifndef _TMW_WINGETTIMEOFDAY_H_ +#define _TMW_WINGETTIMEOFDAY_H_ #ifdef WIN32 diff --git a/src/winver.h b/src/winver.h new file mode 100644 index 00000000..58f11bea --- /dev/null +++ b/src/winver.h @@ -0,0 +1,6 @@ +/* VERSION DEFINITIONS */ +#define VER_MAJOR 0 +#define VER_MINOR 1 +#define VER_RELEASE 0 +#define VER_BUILD 0 +#define PACKAGE_VERSION "0.1.0" diff --git a/tmw.cbp b/tmw.cbp index d36a8bd0..c81ffb3e 100644 --- a/tmw.cbp +++ b/tmw.cbp @@ -40,16 +40,6 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + -- cgit v1.2.3-70-g09d2 From 457ce3e7b4a869f92d8aef31bdee1b6793587a93 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Sun, 28 Jan 2007 22:49:26 +0000 Subject: Some work on documentation. --- ChangeLog | 10 ++++- INSTALL | 2 +- NEWS | 2 +- docs/SOURCE/tmw.doxcfg | 2 +- docs/SOURCE/tmwdox.sh | 0 src/gui/char_select.h | 2 +- src/main.h | 29 ++++++++++++ src/net/connection.h | 3 ++ src/net/messagehandler.h | 3 ++ src/net/messagein.h | 2 + src/net/messageout.h | 5 ++- src/net/network.h | 7 +++ src/resources/equipmentdb.h | 107 +++++++++++++++++++++++--------------------- src/resources/itemdb.h | 2 +- src/resources/monsterdb.h | 93 +++++++++++++++++++------------------- src/utils/xml.h | 3 ++ 16 files changed, 168 insertions(+), 104 deletions(-) mode change 100644 => 100755 docs/SOURCE/tmwdox.sh (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 44caf16c..1ff45551 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,12 @@ -2007-01-23 Bjørn Lindeijer +2007-01-28 Bjørn Lindeijer + + * src/gui/char_select.h, src/net/messagein.h, + src/net/messagehandler.h, src/net/network.h, src/net/connection.h, + src/net/messageout.h, src/utils/xml.h, src/main.h, + src/resources/monsterdb.h, src/resources/itemdb.h, + src/resources/equipmentdb.h: Some work on documentation. + +2007-01-23 Bjørn Lindeijer * src/gui/shoplistbox.cpp, docs/INSTALL/win32.txt, INSTALL, NEWS: Upgraded to Guichan 0.6.1. diff --git a/INSTALL b/INSTALL index f7e8688e..0f5d53f0 100644 --- a/INSTALL +++ b/INSTALL @@ -20,7 +20,7 @@ and some libraries. The required libraries are: * SDL_mixer http://www.libsdl.org/projects/SDL_mixer/ * SDL_image http://www.libsdl.org/projects/SDL_image/ * SDL_net http://www.libsdl.org/projects/SDL_net/ -* Guichan 0.6.1 http://guichan.sourceforge.net/ +* Guichan 0.6.x http://guichan.sourceforge.net/ * libxml2 http://www.xmlsoft.org/ * physfs 1.0.x http://icculus.org/physfs/ * zlib 1.2.x http://www.gzip.org/zlib/ diff --git a/NEWS b/NEWS index 47421aef..adeca670 100644 --- a/NEWS +++ b/NEWS @@ -1,5 +1,5 @@ 0.0.22.2 (...) -- Updated to work with Guichan 0.6.1 (older versions no longer supported) +- Updated to work with Guichan 0.6.1 0.0.22.1 (15 January 2007) - Updated to work with Guichan 0.6.0 (older versions no longer supported) diff --git a/docs/SOURCE/tmw.doxcfg b/docs/SOURCE/tmw.doxcfg index fe5039fb..19cfb024 100644 --- a/docs/SOURCE/tmw.doxcfg +++ b/docs/SOURCE/tmw.doxcfg @@ -1085,7 +1085,7 @@ CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. -GRAPHICAL_HIERARCHY = YES +GRAPHICAL_HIERARCHY = NO # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif diff --git a/docs/SOURCE/tmwdox.sh b/docs/SOURCE/tmwdox.sh old mode 100644 new mode 100755 diff --git a/src/gui/char_select.h b/src/gui/char_select.h index d6dee8b5..dbce2cbf 100644 --- a/src/gui/char_select.h +++ b/src/gui/char_select.h @@ -94,7 +94,7 @@ class CharSelectDialog : public Window, public gcn::ActionListener /** * Character creation dialog. * - * \ingroup GUI + * \ingroup Interface */ class CharCreateDialog : public Window, public gcn::ActionListener { diff --git a/src/main.h b/src/main.h index 14f52e4d..6ecf628e 100644 --- a/src/main.h +++ b/src/main.h @@ -24,6 +24,35 @@ #ifndef _TMW_MAIN_H #define _TMW_MAIN_H +/** + * \mainpage + * + * \section Introduction Introduction + * + * This is the documentation for the client of The Mana World + * (http://themanaworld.org). It is always a work in progress, with the intent + * to make it easier for new developers to grow familiar with the source code. + * + * \section General General information + * + * During the game, the current Map is displayed by the main Viewport, which + * is the bottom-most widget in the WindowContainer. Aside the viewport, the + * window container keeps track of all the \link Window Windows\endlink + * displayed during the game. + * + * A Map is composed of several layers of \link Image Images\endlink (tiles), + * a layer with collision information and \link Sprite Sprites\endlink. The + * sprites define the visible part of \link Being Beings\endlink and + * \link FloorItem FloorItems\endlink, they are drawn from top to bottom + * by the map, interleaved with the tiles in the fringe layer. + * + * The server is split up into an \link Net::AccountServer account + * server\endlink, a \link Net::ChatServer chat server\endlink and a \link + * Net::GameServer game server\endlink. There may be multiple game servers. + * Handling of incoming messages is spread over several \link MessageHandler + * MessageHanders\endlink. + */ + #include #ifdef HAVE_CONFIG_H diff --git a/src/net/connection.h b/src/net/connection.h index d8ea3124..734c8d65 100644 --- a/src/net/connection.h +++ b/src/net/connection.h @@ -32,6 +32,9 @@ class MessageOut; namespace Net { + /** + * \ingroup Network + */ class Connection { public: diff --git a/src/net/messagehandler.h b/src/net/messagehandler.h index b21abd72..a5fc81b3 100644 --- a/src/net/messagehandler.h +++ b/src/net/messagehandler.h @@ -28,6 +28,9 @@ class MessageIn; +/** + * \ingroup Network + */ class MessageHandler { public: diff --git a/src/net/messagein.h b/src/net/messagein.h index 68bbb933..cb8e44cd 100644 --- a/src/net/messagein.h +++ b/src/net/messagein.h @@ -30,6 +30,8 @@ /** * Used for parsing an incoming message. + * + * \ingroup Network */ class MessageIn { diff --git a/src/net/messageout.h b/src/net/messageout.h index af25e4b4..82412a30 100644 --- a/src/net/messageout.h +++ b/src/net/messageout.h @@ -27,7 +27,10 @@ #include /** - * Used for building an outgoing message. + * Used for building an outgoing message. When finished, the message is sent + * using Net::Connection::send(). + * + * \ingroup Network */ class MessageOut { diff --git a/src/net/network.h b/src/net/network.h index 9ffcbb6d..0701a956 100644 --- a/src/net/network.h +++ b/src/net/network.h @@ -26,9 +26,16 @@ #include +/** + * \defgroup Network Core network layer + */ + class MessageHandler; class MessageOut; +/** + * \ingroup Network + */ namespace Net { class Connection; diff --git a/src/resources/equipmentdb.h b/src/resources/equipmentdb.h index b8618f5f..b43a6145 100644 --- a/src/resources/equipmentdb.h +++ b/src/resources/equipmentdb.h @@ -1,52 +1,55 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: - */ - -#ifndef _TMW_EQUIPMENT_DB_H -#define _TMW_EQUIPMENT_DB_H - -#include - -#include "equipmentinfo.h" - -namespace EquipmentDB -{ - /** - * Loads the equipment info from Items.xml - */ - void load(); - - /** - * Frees equipment data - */ - void unload(); - - void setEquipment(int id, EquipmentInfo* equipmentInfo); - - EquipmentInfo* get(int id); - - // Equipment database types - typedef std::map EquipmentInfos; - typedef EquipmentInfos::iterator EquipmentInfoIterator; -} - -#endif +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: + */ + +#ifndef _TMW_EQUIPMENT_DB_H +#define _TMW_EQUIPMENT_DB_H + +#include + +#include "equipmentinfo.h" + +/** + * Equipment information database. + */ +namespace EquipmentDB +{ + /** + * Loads the equipment info from Items.xml + */ + void load(); + + /** + * Frees equipment data + */ + void unload(); + + void setEquipment(int id, EquipmentInfo* equipmentInfo); + + EquipmentInfo* get(int id); + + // Equipment database types + typedef std::map EquipmentInfos; + typedef EquipmentInfos::iterator EquipmentInfoIterator; +} + +#endif diff --git a/src/resources/itemdb.h b/src/resources/itemdb.h index c080194b..6ead5b22 100644 --- a/src/resources/itemdb.h +++ b/src/resources/itemdb.h @@ -29,7 +29,7 @@ #include /** - * The namespace that holds the item information. + * Item information database. */ namespace ItemDB { diff --git a/src/resources/monsterdb.h b/src/resources/monsterdb.h index b105665a..3b69523d 100644 --- a/src/resources/monsterdb.h +++ b/src/resources/monsterdb.h @@ -1,45 +1,48 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: - */ - -#ifndef _TMW_MONSTER_DB_H -#define _TMW_MONSTER_DB_H - -#include - -#include "monsterinfo.h" - -namespace MonsterDB -{ - void - load(); - - void - unload(); - - const MonsterInfo& get (int id); - - typedef std::map MonsterInfos; - typedef MonsterInfos::iterator MonsterInfoIterator; -} - -#endif +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: + */ + +#ifndef _TMW_MONSTER_DB_H +#define _TMW_MONSTER_DB_H + +#include + +#include "monsterinfo.h" + +/** + * Monster information database. + */ +namespace MonsterDB +{ + void + load(); + + void + unload(); + + const MonsterInfo& get (int id); + + typedef std::map MonsterInfos; + typedef MonsterInfos::iterator MonsterInfoIterator; +} + +#endif diff --git a/src/utils/xml.h b/src/utils/xml.h index 54ed9951..bf01fc96 100644 --- a/src/utils/xml.h +++ b/src/utils/xml.h @@ -28,6 +28,9 @@ #include +/** + * XML helper functions. + */ namespace XML { /** -- cgit v1.2.3-70-g09d2 From 9398626764574fa536dca3806490f88970d2f056 Mon Sep 17 00:00:00 2001 From: Björn Steinbrink Date: Sun, 22 Apr 2007 13:39:22 +0000 Subject: Added a macro for XML child node iterations to make the code more terse and easier to read. --- ChangeLog | 5 +++++ src/configuration.cpp | 7 ++++--- src/resources/equipmentdb.cpp | 9 ++------ src/resources/itemdb.cpp | 6 +++--- src/resources/mapreader.cpp | 48 +++++++++++++++++++++++-------------------- src/resources/monsterdb.cpp | 9 ++------ src/resources/spritedef.cpp | 18 +++++++--------- src/utils/xml.h | 3 +++ 8 files changed, 52 insertions(+), 53 deletions(-) (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index d3736937..754901e6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,11 @@ * CMake/Modules/FindENet.cmake: Fixed ENet status always being set to "found". + * src/configuration.cpp, src/utils/xml.h, src/resources/mapreader.cpp, + src/resources/spritedef.cpp, src/resources/monsterdb.cpp, + src/resources/itemdb.cpp, src/resources/equipmentdb.cpp: Added a macro + for XML child node iterations to make the code more terse and easier + to read. 2007-04-13 Björn Steinbrink diff --git a/src/configuration.cpp b/src/configuration.cpp index 8bb0b8ca..d33df386 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -30,6 +30,7 @@ #include "log.h" #include "utils/tostring.h" +#include "utils/xml.h" void Configuration::init(const std::string &filename) { @@ -48,14 +49,14 @@ void Configuration::init(const std::string &filename) if (!doc) return; - xmlNodePtr node = xmlDocGetRootElement(doc); + xmlNodePtr rootNode = xmlDocGetRootElement(doc); - if (!node || !xmlStrEqual(node->name, BAD_CAST "configuration")) { + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "configuration")) { logger->log("Warning: No configuration file (%s)", filename.c_str()); return; } - for (node = node->xmlChildrenNode; node != NULL; node = node->next) + for_each_xml_child_node(node, rootNode) { if (!xmlStrEqual(node->name, BAD_CAST "option")) continue; diff --git a/src/resources/equipmentdb.cpp b/src/resources/equipmentdb.cpp index a6c26624..64982ce3 100644 --- a/src/resources/equipmentdb.cpp +++ b/src/resources/equipmentdb.cpp @@ -71,11 +71,8 @@ EquipmentDB::load() } //iterate s - for ( xmlNodePtr equipmentNode = rootNode->xmlChildrenNode; - equipmentNode != NULL; - equipmentNode = equipmentNode->next) + for_each_xml_child_node(equipmentNode, rootNode) { - if (!xmlStrEqual(equipmentNode->name, BAD_CAST "equipment")) { continue; @@ -86,9 +83,7 @@ EquipmentDB::load() currentInfo->setSlot (XML::getProperty(equipmentNode, "slot", 0)); //iterate s - for ( xmlNodePtr spriteNode = equipmentNode->xmlChildrenNode; - spriteNode != NULL; - spriteNode = spriteNode->next) + for_each_xml_child_node(spriteNode, equipmentNode) { if (!xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) { diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index f914af47..6e0ecce9 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -65,13 +65,13 @@ void ItemDB::load() logger->error("ItemDB: Error while parsing item database (items.xml)!"); } - xmlNodePtr node = xmlDocGetRootElement(doc); - if (!node || !xmlStrEqual(node->name, BAD_CAST "items")) + xmlNodePtr rootNode = xmlDocGetRootElement(doc); + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "items")) { logger->error("ItemDB: items.xml is not a valid database file!"); } - for (node = node->xmlChildrenNode; node != NULL; node = node->next) + for_each_xml_child_node(node, rootNode) { if (!xmlStrEqual(node->name, BAD_CAST "item")) { continue; diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index 15a88b4d..fda8916d 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -212,24 +212,24 @@ MapReader::readMap(xmlNodePtr node, const std::string &path) int layerNr = 0; Map *map = new Map(w, h, tilew, tileh); - for (node = node->xmlChildrenNode; node != NULL; node = node->next) + for_each_xml_child_node(childNode, node) { - if (xmlStrEqual(node->name, BAD_CAST "tileset")) + if (xmlStrEqual(childNode->name, BAD_CAST "tileset")) { - Tileset *tileset = readTileset(node, pathDir, map); + Tileset *tileset = readTileset(childNode, pathDir, map); if (tileset) { map->addTileset(tileset); } } - else if (xmlStrEqual(node->name, BAD_CAST "layer")) + else if (xmlStrEqual(childNode->name, BAD_CAST "layer")) { logger->log("- Loading layer %d", layerNr); - readLayer(node, map, layerNr); + readLayer(childNode, map, layerNr); layerNr++; } - else if (xmlStrEqual(node->name, BAD_CAST "properties")) + else if (xmlStrEqual(childNode->name, BAD_CAST "properties")) { - readProperties(node, map); + readProperties(childNode, map); } } @@ -241,13 +241,14 @@ MapReader::readMap(xmlNodePtr node, const std::string &path) void MapReader::readProperties(xmlNodePtr node, Properties* props) { - for (node = node->xmlChildrenNode; node; node = node->next) { - if (!xmlStrEqual(node->name, BAD_CAST "property")) + for_each_xml_child_node(childNode, node) + { + if (!xmlStrEqual(childNode->name, BAD_CAST "property")) continue; // Example: - xmlChar *name = xmlGetProp(node, BAD_CAST "name"); - xmlChar *value = xmlGetProp(node, BAD_CAST "value"); + xmlChar *name = xmlGetProp(childNode, BAD_CAST "name"); + xmlChar *value = xmlGetProp(childNode, BAD_CAST "value"); if (name && value) { props->setProperty((const char*)name, (const char*)value); @@ -268,12 +269,13 @@ MapReader::readLayer(xmlNodePtr node, Map *map, int layer) // Load the tile data. Layers are assumed to be map size, with (0,0) as // origin. - for (node = node->xmlChildrenNode; node; node = node->next) { - if (!xmlStrEqual(node->name, BAD_CAST "data")) + for_each_xml_child_node(childNode, node) + { + if (!xmlStrEqual(childNode->name, BAD_CAST "data")) continue; - xmlChar *encoding = xmlGetProp(node, BAD_CAST "encoding"); - xmlChar *compression = xmlGetProp(node, BAD_CAST "compression"); + xmlChar *encoding = xmlGetProp(childNode, BAD_CAST "encoding"); + xmlChar *compression = xmlGetProp(childNode, BAD_CAST "compression"); if (encoding && xmlStrEqual(encoding, BAD_CAST "base64")) { @@ -286,7 +288,7 @@ MapReader::readLayer(xmlNodePtr node, Map *map, int layer) } // Read base64 encoded map file - xmlNodePtr dataChild = node->xmlChildrenNode; + xmlNodePtr dataChild = childNode->xmlChildrenNode; if (!dataChild) continue; @@ -350,11 +352,12 @@ MapReader::readLayer(xmlNodePtr node, Map *map, int layer) } else { // Read plain XML map file - for (xmlNodePtr n2 = node->xmlChildrenNode; n2; n2 = n2->next) { - if (!xmlStrEqual(n2->name, BAD_CAST "tile")) + for_each_xml_child_node(childNode2, childNode) + { + if (!xmlStrEqual(childNode2->name, BAD_CAST "tile")) continue; - int gid = XML::getProperty(n2, "gid", -1); + int gid = XML::getProperty(childNode2, "gid", -1); map->setTileWithGid(x, y, layer, gid); x++; @@ -391,11 +394,12 @@ MapReader::readTileset(xmlNodePtr node, int tw = XML::getProperty(node, "tilewidth", map->getTileWidth()); int th = XML::getProperty(node, "tileheight", map->getTileHeight()); - for (node = node->xmlChildrenNode; node; node = node->next) { - if (!xmlStrEqual(node->name, BAD_CAST "image")) + for_each_xml_child_node(childNode, node) + { + if (!xmlStrEqual(childNode->name, BAD_CAST "image")) continue; - xmlChar* source = xmlGetProp(node, BAD_CAST "source"); + xmlChar* source = xmlGetProp(childNode, BAD_CAST "source"); if (source) { diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index e773911d..ac3ac3bc 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -72,11 +72,8 @@ MonsterDB::load() } //iterate s - for ( xmlNodePtr monsterNode = rootNode->xmlChildrenNode; - monsterNode != NULL; - monsterNode = monsterNode->next) + for_each_xml_child_node(monsterNode, rootNode) { - if (!xmlStrEqual(monsterNode->name, BAD_CAST "monster")) { continue; @@ -87,9 +84,7 @@ MonsterDB::load() currentInfo->setName (XML::getProperty(monsterNode, "name", "unnamed")); //iterate s and s - for ( xmlNodePtr spriteNode = monsterNode->xmlChildrenNode; - spriteNode != NULL; - spriteNode = spriteNode->next) + for_each_xml_child_node(spriteNode, monsterNode) { if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) { diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp index d29bd847..24156be1 100644 --- a/src/resources/spritedef.cpp +++ b/src/resources/spritedef.cpp @@ -76,22 +76,22 @@ SpriteDef::load(const std::string &animationFile, int variant) "Animation: Error while parsing animation definition file!"); } - xmlNodePtr node = xmlDocGetRootElement(doc); - if (!node || !xmlStrEqual(node->name, BAD_CAST "sprite")) { + xmlNodePtr rootNode = xmlDocGetRootElement(doc); + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "sprite")) { logger->error( "Animation: this is not a valid animation definition file!"); } // Get the variant - int variant_num = XML::getProperty(node, "variants", 0); + int variant_num = XML::getProperty(rootNode, "variants", 0); int variant_offset = 0; if (variant_num > 0 && variant < variant_num) { - variant_offset = variant * XML::getProperty(node, "variant_offset", 0); + variant_offset = variant * XML::getProperty(rootNode, "variant_offset", 0); } - for (node = node->xmlChildrenNode; node != NULL; node = node->next) + for_each_xml_child_node(node, rootNode) { if (xmlStrEqual(node->name, BAD_CAST "imageset")) { @@ -177,9 +177,7 @@ SpriteDef::loadAction(xmlNodePtr node, int variant_offset) } // Load animations - for (xmlNodePtr animationNode = node->xmlChildrenNode; - animationNode != NULL; - animationNode = animationNode->next) + for_each_xml_child_node(animationNode, node) { if (xmlStrEqual(animationNode->name, BAD_CAST "animation")) { @@ -208,9 +206,7 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, action->setAnimation(directionType, animation); // Get animation frames - for (xmlNodePtr frameNode = animationNode->xmlChildrenNode; - frameNode != NULL; - frameNode = frameNode->next) + for_each_xml_child_node(frameNode, animationNode) { int delay = XML::getProperty(frameNode, "delay", 0); int offsetX = XML::getProperty(frameNode, "offsetX", 0); diff --git a/src/utils/xml.h b/src/utils/xml.h index bf01fc96..db4c264a 100644 --- a/src/utils/xml.h +++ b/src/utils/xml.h @@ -46,4 +46,7 @@ namespace XML getProperty(xmlNodePtr node, const char *name, const std::string &def); } +#define for_each_xml_child_node(var, parent) \ + for (xmlNodePtr var = parent->xmlChildrenNode; var; var = var->next) + #endif -- cgit v1.2.3-70-g09d2 From a353543dd4da3c489a84f6f17125fdd0e1be2349 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Mon, 4 Jun 2007 21:48:47 +0000 Subject: Merged 0.0 changes from revision 3234 to 3317 to trunk. --- ChangeLog | 465 ++++++++++++++++++++++++++++- NEWS | 16 + README | 3 +- data/graphics/gui/CMakeLists.txt | 8 +- data/graphics/gui/Makefile.am | 6 + data/graphics/gui/target-cursor-blue-l.png | Bin 0 -> 23803 bytes data/graphics/gui/target-cursor-blue-m.png | Bin 0 -> 18439 bytes data/graphics/gui/target-cursor-blue-s.png | Bin 0 -> 8353 bytes data/graphics/gui/target-cursor-blue.png | Bin 8353 -> 0 bytes data/graphics/gui/target-cursor-red-l.png | Bin 0 -> 25586 bytes data/graphics/gui/target-cursor-red-m.png | Bin 0 -> 17950 bytes data/graphics/gui/target-cursor-red-s.png | Bin 0 -> 8361 bytes data/graphics/gui/target-cursor-red.png | Bin 8361 -> 0 bytes data/help/changes.txt | 147 ++++----- data/help/header.txt | 2 +- docs/Makefile.am | 3 +- src/CMakeLists.txt | 14 + src/Makefile.am | 16 +- src/animatedsprite.cpp | 24 ++ src/animatedsprite.h | 12 + src/animationparticle.cpp | 51 ++++ src/animationparticle.h | 49 +++ src/being.cpp | 122 +++++--- src/being.h | 36 ++- src/engine.cpp | 7 + src/game.cpp | 24 +- src/graphics.cpp | 2 - src/gui/buy.cpp | 117 +++----- src/gui/buy.h | 6 + src/gui/chat.cpp | 4 +- src/gui/chat.h | 4 +- src/gui/debugwindow.cpp | 10 + src/gui/debugwindow.h | 1 + src/gui/inventorywindow.cpp | 7 +- src/gui/sell.cpp | 159 +++++----- src/gui/sell.h | 6 + src/gui/updatewindow.cpp | 7 +- src/gui/viewport.cpp | 108 ++++--- src/gui/viewport.h | 20 +- src/gui/widgets/resizegrip.cpp | 65 ++++ src/gui/widgets/resizegrip.h | 61 ++++ src/gui/window.cpp | 185 ++++++++---- src/gui/window.h | 66 ++-- src/imageparticle.cpp | 69 +++++ src/imageparticle.h | 61 ++++ src/main.cpp | 26 +- src/map.cpp | 23 ++ src/map.h | 25 +- src/monster.cpp | 6 + src/monster.h | 3 + src/net/beinghandler.cpp | 17 +- src/openglgraphics.cpp | 24 +- src/particle.cpp | 370 +++++++++++++++++++++++ src/particle.h | 288 ++++++++++++++++++ src/particleemitter.cpp | 327 ++++++++++++++++++++ src/particleemitter.h | 120 ++++++++ src/resources/animation.h | 2 +- src/resources/image.cpp | 25 +- src/resources/mapreader.cpp | 24 ++ src/resources/monsterdb.cpp | 21 ++ src/resources/monsterinfo.h | 14 +- src/simpleanimation.cpp | 85 ++++++ src/simpleanimation.h | 15 +- src/sprite.h | 16 + src/textparticle.cpp | 64 ++++ src/textparticle.h | 53 ++++ src/utils/fastsqrt.h | 24 ++ src/utils/minmax.h | 47 +++ src/utils/wingettimeofday.h | 226 +++++++------- src/utils/xml.cpp | 23 ++ src/utils/xml.h | 11 + 71 files changed, 3240 insertions(+), 602 deletions(-) create mode 100644 data/graphics/gui/target-cursor-blue-l.png create mode 100644 data/graphics/gui/target-cursor-blue-m.png create mode 100644 data/graphics/gui/target-cursor-blue-s.png delete mode 100644 data/graphics/gui/target-cursor-blue.png create mode 100644 data/graphics/gui/target-cursor-red-l.png create mode 100644 data/graphics/gui/target-cursor-red-m.png create mode 100644 data/graphics/gui/target-cursor-red-s.png delete mode 100644 data/graphics/gui/target-cursor-red.png create mode 100644 src/animationparticle.cpp create mode 100644 src/animationparticle.h create mode 100644 src/gui/widgets/resizegrip.cpp create mode 100644 src/gui/widgets/resizegrip.h create mode 100644 src/imageparticle.cpp create mode 100644 src/imageparticle.h create mode 100644 src/particle.cpp create mode 100644 src/particle.h create mode 100644 src/particleemitter.cpp create mode 100644 src/particleemitter.h create mode 100644 src/textparticle.cpp create mode 100644 src/textparticle.h create mode 100644 src/utils/fastsqrt.h create mode 100644 src/utils/minmax.h (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 61aef963..63aaa1eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,162 @@ +2007-06-03 David Athay + + * src/main.cpp, src/game.cpp: Fixed screenshot taking on OSX. + +2007-06-03 Bjørn Lindeijer + + * src/CMakeLists.txt, src/Makefile.am, docs/Makefile.am: Added some + files to be included with the release. + * src/utils/fastsqrt.h: Fixed warning about strict-aliasing rules. + * src/Makefile.am: Don't die on warnings by default. + * src/resources/image.cpp: Fixed image loading in software mode to not + check for alpha layer when images aren't 32-bit. + * src/graphics.cpp, src/graphics.h, src/imageparticle.cpp: Removed + drawImageTransparent from Graphics class, should be set on image. + * src/imageparticle.h, src/particleemitter.h, src/particle.h, + src/particleemitter.cpp, src/particle.cpp, src/imageparticle.cpp: Have + ParticleEmitter load a possible particle image early on and don't + cause a crash when the image can't be found. + +2007-06-02 Bjørn Lindeijer + + * src/winver.h, README, NEWS, CMakeLists.txt, configure.ac, + data/help/changes.txt, data/help/header.txt: Updated version and + release date and summarized changes. + * src/gui/chat.h, src/gui/chat.cpp: Changed color of chat messages in + OpenGL mode from orange to black. + * src/gui/sell.cpp, src/gui/buy.h, src/gui/buy.cpp, src/gui/sell.h: + Some cleanup of buy/sell dialog code. + +2007-06-01 Bjørn Lindeijer + + * data/graphics/gui/CMakeLists.txt, data/graphics/gui/Makefile.am: + Added target cursors to installed files. + +2007-05-31 Philipp Sehmisch + + * data/maps/new_16-1.tmx.gz: Fixed an inconsistency with the neighbor + map (no new walkmap required). + +2007-05-23 Bjørn Lindeijer + + * src/gui/sell.cpp, src/gui/buy.cpp, src/being.cpp: A bunch of + lingering syntactical changes. + * src/gui/viewport.cpp: Added a missing include and fixed a bug with + cleaning up target cursor animations. + +2007-05-23 Philipp Sehmisch + + * src/gui/viewport.cpp, + data/graphics/gui/target-cursor-blue-s.png, + data/graphics/gui/target-cursor-blue-m.png, + data/graphics/gui/target-cursor-blue-l.png, + data/graphics/gui/target-cursor-red-s.png, + data/graphics/gui/target-cursor-red-m.png, + data/graphics/gui/target-cursor-red-l.png: Replaced target cursor + graphics with higher quality ones by Pauan. + * src/particle.cpp: Made bouncing particles immune against death by + ground contact and removed a nonsensical debugging log message. Made + text splash effects fade out. + * src/textparticle.cpp: Implemented fading in and out for text + particles. + * src/being.cpp, src/particle.cpp, src/particle.h, + src/textparticle.cpp, src/textparticle.h: The color values of text + particles are now stored in 3 integers instead of a Guichan color + structure. + +2007-05-20 Eugenio Favalli + + * tmw.cbp: Updated Code::Blocks project file. + +2007-05-20 Philipp Sehmisch + + * src/gui/buy.cpp, src/gui/sell.cpp: Unified some differences between + buy and sell dialog. Money label now shows money after transaction + instead of current money. + * src/gui/sell.cpp: Fixed the amount-not-reset-when-using-scrollwheel + bug. + * src/being.h, src/gui/viewport.cpp, src/gui/viewport.h: Added 3 + different target cursor sizes. + * src/monster.h, src/monster.cpp, src/resources/monsterdb.cpp, + scr/resources/monsterinfo.h, data/monsters.xml: Target cursor size for + monster is read from the monsters.xml. + * data/graphics/gui/target-cursor-blue-s.png, + data/graphics/gui/target-cursor-blue-m.png, + data/graphics/gui/target-cursor-blue-l.png, + data/graphics/gui/target-cursor-red-s.png, + data/graphics/gui/target-cursor-red-m.png, + data/graphics/gui/target-cursor-red-l.png: Added temporary + placeholders for small and large target cursors until better versions + based on the original SVG are available. + +2007-05-08 Philipp Sehmisch + + * data/graphics/sprites/monster-bat.png, + data/graphics/sprites/monster-bat.xml, + data/graphics/sprites/monster-flower.xml, + data/graphics/sprites/monster-fluffy.xml, + data/graphics/sprites/monster-fluffy.png, + data/graphics/sprites/monster-goblin-fire.xml, + data/graphics/sprites/monster-maggot-giant.xml, + data/graphics/sprites/monster-maggot.xml, + data/graphics/sprites/monster-mountsnake.xml, + data/graphics/sprites/monster-mushroom-red.xml, + data/graphics/sprites/monster-mushroom-spiky.xml, + data/graphics/sprites/monster-pinkie.xml, + data/graphics/sprites/monster-scorpion-black.xml, + data/graphics/sprites/monster-scorpion-red.png, + data/graphics/sprites/monster-scorpion-red.xml, + data/graphics/sprites/monster-skull-poison.xml, + data/graphics/sprites/monster-slime-green.xml, + data/graphics/sprites/monster-slime-red.xml, + data/graphics/sprites/monster-slime-rudolph.xml, + data/graphics/sprites/monster-slime-santa.png, + data/graphics/sprites/monster-slime-santa.xml, + data/graphics/sprites/monster-slime-yellow.xml, + data/graphics/sprites/monster-snake-cave.png, + data/graphics/sprites/monster-snake-cave.xml, + data/graphics/sprites/monster-snake.xml, + data/graphics/sprites/monster-spider.xml: + Adjusted offsets of monster sprites (thanks to Pauan for finding out + the correct offsets - I just subtracted 6 of all x offsets to take the + new position of the target circle in account) and committed some + modifications at some monster graphics by Pauan. + +2007-05-02 Philipp Sehmisch + + * src/sprite.h, src/being.cpp, src/being.h, src/animatedsprite.cpp, + src/animatedsprite.h: Added methods to get the width and height of the + graphical representation of a sprite. + * src/gui/viewport.cpp: Fixed positioning of monster names and target + circles. + +2007-05-02 Philipp Sehmisch + + * src/particle.cpp: Fixed a compiler warning. + +2007-05-02 Björn Steinbrink + + * src/Makefile.am: Add the new particle subclasses to the automake + configuration. + * src/imageparticle.h, src/textparticle.h, src/particle.h, + src/animationparticle.h, src/CMakeLists.txt, src/particleemitter.cpp, + src/animationparticle.cpp, src/particle.cpp, src/imageparticle.cpp, + src/textparticle.cpp, src/utils/xml.cpp, src/utils/xml.h: Split the + particle class into subclasses based on their appearance. + +2007-04-24 Philipp Sehmisch + + * src/particle.cpp, src/particle.h: Some minor code cleanups, speed + optimizations and a bit of documentation. + +2007-04-23 Philipp Sehmisch + + * data/graphics/particles/flame.particle.xml, + data/graphics/particles/blaze.png: Added two files I forgot with the + last commit. + * src/resources/mapreader.cpp, src/particle.cpp, + src/particleemitter.cpp: Using XML child node iteration macro. + 2007-04-22 Björn Steinbrink * CMake/Modules/FindENet.cmake: Fixed ENet status always being set to @@ -10,11 +169,74 @@ * src/resources/itemdb.cpp: Made the parameter checks more terse and manageable. +2007-04-19 Philipp Sehmisch + + * src/resources/mapreader.cpp: Emitter positions are now read from map + files. + * src/engine.cpp: Removed the player follow effect used for testing. + * data/maps/new_4-1.tmx.gz, data/maps/new_5-1.tmx.gz: Added flame + effect to all lamps on the cave maps + * data/maps/new_9-1.tmx.gz: Added waterfall effect to the upper right + corner of NW woodland map. + +2007-04-15 Bjørn Lindeijer + + * src/openglgraphics.cpp: Rely on default 0 value for z axis. + * src/CMakeLists.txt, src/gui/window.cpp, src/gui/widgets, + src/gui/widgets/resizegrip.cpp, src/gui/widgets/resizegrip.h, + src/gui/inventorywindow.cpp, src/gui/window.h, src/Makefile.am: + Reimplemented window resizing. It is now once again possible to resize + windows using their borders (except for the top one, since that's the + title bar for Guichan) and the resize grip in the bottom right is much + easier to grab. + * src/gui/window.cpp: Increased minimum window height and fixed a + problem with setting window content size which was introduced with the + new resize grip. + 2007-04-13 Björn Steinbrink * data/graphics/gui/CMakeLists.txt: Added target cursor graphics to the set of files to be installed. +2007-04-05 Eugenio Favalli + + * src/main.cpp: Unified storage of configuration, updates and + screenshots in home directory. + +2007-04-03 Philipp Sehmisch + + * data/graphics/items/generic-easteregg-blue.png, + data/graphics/items/generic-easteregg-green.png, + data/graphics/items/generic-easteregg-pink.png, + data/graphics/items/generic-easteregg-red.png, + data/graphics/items/generic-easteregg-teal.png, + data/graphics/items/generic-easteregg-yellow.png, + data/items.xml: Added six different easter egg item graphics for the + easter event. Item IDs are 1208 - 1213. + * data/graphics/sprites/npcs.png: Added bunny girl npc for the easter + event. + +2007-04-01 Philipp Sehmisch + + * src/game.cpp: Screenshots are no longer saved directly in the users + home directory on UNIX systems but in the sub folder /.tmw/. A chatlog + message about the success of the screenshot saving does appear now. + Based on a patch by Patrick "the-me" Matthäi. + +2007-03-27 Bjørn Lindeijer + + * src/main.cpp: Icon loading doesn't necessarily succeed, so better + not crash when it doesn't. + +2007-03-25 Philipp Sehmisch + + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h: Improved programming style and documentation + and added some small tweaks. + * src/engine.cpp, src/map.cpp, src/map.h, src/resources/mapreader.cpp: + Prepared getting the emitter positions from the map file by storing + them in the Map class and setting them up from the MapReader. + 2007-03-24 Bjørn Lindeijer * src/main.cpp: Changed the order of network message handling and @@ -49,6 +271,16 @@ src/net/charserverhandler.h, src/net/charserverhandler.cpp: Made sure the character creation dialog doesn't close when creation failed. +2007-03-22 Philipp Sehmisch + + * src/simpleanimation.cpp, src/simpleanimation.h: Added new + constructor for simple animation that allows to build the animation + based on an xmlNodePtr pointing to an node. + * src/particle.cpp, src/particle.h: Added support for and + childtags for effect root particles. + * data/graphics/particles/playerglow.particle.xml: New player follow + effect that demonstrates an animated root particle with an emitter. + 2007-03-22 Bjørn Lindeijer * src/gui/login.cpp, src/gui/login.h, src/gui/register.h, @@ -84,6 +316,11 @@ src/resources/resourcemanager.cpp, src/resources/spriteset.cpp, src/resources/spritedef.h: Renamed Spriteset to ImageSet. +2007-03-20 Philipp Sehmisch + + * src/gui/updatewindow.cpp: Cancel button is now disabled after + downloading is finished. + 2007-03-20 David Athay * src/gui/viewport.cpp: Fixed target cursor animation, and changed @@ -160,6 +397,8 @@ * src/simpleanimation.cpp, src/simpleanimation.h, src/CmakeLists.txt, src/Makefile.am: Added a simple animation class that hosts a looping animation without the action and direction stuff from AnimatedSprite. + * src/particle.cpp, src/particle.h, src/particleemitter.cpp: Used said + simple animation class for animated particles. 2007-03-12 Bjørn Lindeijer @@ -171,6 +410,14 @@ * src/map.cpp, src/gui/viewport.cpp: Fixed a bug that made the engine not draw the last row and column of the map. +2007-03-09 Philipp Sehmisch + + * src/particle.cpp: Reimplemented physics mode that uses the default + square root function as fallback for systems where the fastInvSqrt + function doesn't work properly. + * src/particle.cpp, src/particle.h: Some performance optimizations + suggested by Rogier "Avaniel" Polak. + 2007-03-09 Bjørn Lindeijer * data/graphics/gui/target-cursor-blue.png, @@ -221,6 +468,10 @@ data/sfx/pinkie-hit1.ogg, data/sfx/pinkie-miss1.ogg, data/monsters.xml: New sound effects by Cosmostrator. +2007-02-25 Philipp Sehmisch + + * src/particle.h, src/particleemitter.h: Just some documentation work. + 2007-02-25 Bjørn Lindeijer * src/CMakeLists.txt: Updated CMake file. @@ -247,6 +498,12 @@ size and data type. * src/logindata.h: Added a clear function. +2007-02-22 Philipp Sehmisch + + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h: Added new particle property "bounce" that makes + particles bounce off the ground and use it with the damage numbers. + 2007-02-21 Philipp Sehmisch * src/gui/char-server.cpp, src/gui/updatewindow.cpp, src/gui/main.cpp, @@ -286,6 +543,16 @@ * src/winver.h, README, configure.ac, data/help/header.txt, NEWS, CMakeLists.txt: Changed version to 0.0.22.2. +2007-02-15 Philipp Sehmisch + + * src/engine.cpp: The name conflict problem with Guichan seems to be + solved with version 0.6.1. + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h: Added support for animated particles. + * data/graphics/particles/playerglow.particle.xml: Created a new + player follow particle that spawns a swarm of animated bats that + follow the player. + 2007-02-13 Philipp Sehmisch * src/gui/register.cpp, src/logindata.h, src/main.cpp: Fixed the _M/_F @@ -306,8 +573,36 @@ 2007-02-10 Philipp Sehmisch - * src/gui/viewport.cpp: Fixed the bug in the scrolling limitation that made - it possible to scroll outside of the map in the south and east. + * src/gui/viewport.cpp: Fixed the bug in the scrolling limitation that + made it possible to scroll outside of the map in the south and east. + +2007-02-09 Philipp Sehmisch + + * src/particle.cpp: Fixed a misspelled include and another + optimisation at the vector calculation. + +2007-02-08 Philipp Sehmisch + + * src/particle.cpp, src/utils/fastsqrt.h: Added a faster function to + calculate square roots and using it for hypotenuse calculations. + Thanks to Rogier aka Avaniel for finding the function. + +2007-02-07 Philipp Sehmisch + + * src/particle.cpp, src/particle.h, src/particleemitter.cpp: Renamed + Particle::MAX_PARTICLES to Particle::maxCount and read the value from + config ("particleMaxCount") + * src/particle.cpp: Added fast physics mode that replaces the + trigonometric calculations made for calculating the acceleration by + much less cpu intense but also less accurate formulas. To enable it + set the config option "particleFastPhysics" to "1". + * src/particle.cpp: Added the config option "particleEmitterSkip" that + allows to reduces the output of the emitters by making them spawn + particles only every n-th game tick. + * src/graphics.cpp, src/graphics.h: Added a new method + "drawImageTransparent" to the graphic engine that blits an image with + an alpha factor. + * src/particle.cpp: Using new drawImageTransparent method. 2007-02-04 Bjørn Lindeijer @@ -357,6 +652,35 @@ Defence: 12, Weight: 120. * data/graphics/sprites/chest-cotton-female.png: Huh? Shouldn't this be on svn for ages? + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h: Implemented die-distance (particles are deleted + when they reached a certain proximity to their target) + * src/particle.cpp: Fixed a bug in the acceleration vector calculation. + * src/particle.cpp, src/particle.h: Fixed a problem with particles with + unlimited lifetime and fade-in. + * data/graphics/particles/playerglow.particle.xml: And again a new + player follow particle. This time it demonstrates die-distance and the + fixed acceleration vector calculation. + * src/engine.cpp, data/graphics/particles/snow.particle.xml, + data/graphics/particles/snowflake.png: I can't stand the begging + anymore. Now it snows in the snow area... and the forest... and the + desert... and under the earth... and indoors... Are you happy now, + Rotonen and Elven? ;-) + * src/particle.cpp: Removed some debug log messages. + * src/being.cpp: Avoided crash when attempting to control an invalid + particle. + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h: Cleaned the includes up. + +2007-01-31 Philipp Sehmisch + + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h: Changed some variable names. + * data/graphics/particles/waterfall.particle.xml, + data/graphics/particles/waterfall-a.png: New waterfall with Modanungs + waterfall particle. + * src/particle.cpp: forgot to remove a svn conflict marker and changed + the order of initialisations to fix some compiler warnings. 2007-01-30 Eugenio Favalli @@ -373,6 +697,54 @@ src/resources/mapreader.h, src/resources/music.h: Some trivial documentation work. Fixes all Doxygen warnings. +2007-01-30 Philipp Sehmisch + + * src/net/beinghandler.cpp, + data/graphics/particles/skillup.particle.xml: Added different particle + effect for job levelup. + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h: Renamed "alphafade" to "fade-out", added new + property "fade-in". + * data/graphics/particles/playerglow.particle.xml: Added a new player + effect (a fire) demonstrating how to use fade-in and fade-out to fade + one color into another. + +2007-01-29 Philipp Sehmisch + + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h: Added a new particle property "alphafade" that + makes the particles fade into alpha before their lifetime ends. + * src/particle.cpp, src/particle.h: fixed an issue with particles that + have a lifetime of 0 and an issue with the momentum property. + * data/graphics/particles/waterfall.particle.xml, + data/graphics/particles/fog-medium-white-a.png, + data/graphics/particles/fog-medium-white-b.png, + data/graphics/particles/fog-medium-white-c.png: Added fog to the + waterfall effect demonstrating the new alphafade feature. + +2007-01-28 Philipp Sehmisch + + * src/utils/xml.cpp, src/utils/xml.h, src/particleemitter.cpp: Most + values are now read as floating point values from the emitter files. + * data/graphics/particles/fountain.particle.xml, + data/graphics/particles/hit.particle.xml, + data/graphics/particles/playerglow.particle.xml: Changed some values + as floating point values. Made the player follow effect magenta to + improve the visibility of the hit effects. + * src/engine.cpp, data/graphics/particles/waterfall.particle.xml: + Removed the fountain and added a waterfall instead. + * src/particle.h: Corrected the drawing order of the particles in + relation to the other sprites. + * src/gui/debugwindow.cpp, src/gui/debugwindow.h: Added particle count + to debug window. + * src/particle.cpp: Allowed momentum without acceleration and + implement the acceleration properly. + * src/utils/minmax.h, src/particleemitter.cpp, src/particleemitter.h: + Added a structure to hold a pair of numeric minimum and maximum values + and used it to store all numeric emitter properties. + * src/utils/randbetween.h: Removed (the functionality is now in struct + MinMax) + 2007-01-28 Bjørn Lindeijer * src/gui/char_select.h, src/net/messagein.h, @@ -383,6 +755,39 @@ * data/maps/new_8-1.tmx.gz, data/maps/new_11-1.tmx.gz: Map fixes by Pauan. +2007-01-27 Bjørn Lindeijer + + * src/gui/shoplistbox.cpp: Fixed compilation against Guichan 0.6.1. + * src/utils/randbetween.h: Fixed integer overflow causing the + randBetween function not to work properly on Linux. + +2007-01-27 Philipp Sehmisch + + * src/net/beinghandler.cpp: Fixed a compiler issue. + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h, src/engine.cpp: Emitter data is read from + external xml files. Reimplemented target-based particles with the + difference that they don't target beings or locations but other + particles (at the moment the host particle of the effect). + * src/being.cpp: Beings now move controlled particles to their center + instead of their upper left corner. + * data/graphics/particles/orb*: Added a bunch of new particles. + * data/graphics/particles/fountain.particle.xml: Reimplementation of + the fountain effect in XML. + * data/graphics/particles/playerglow.particle.xml: New effect that + spawns orbs that orbit around the origin. + * src/being.cpp, data/graphics/particles/hit.particle.xml: Added + particle effect on hit. + * src/net/beinghandler.cpp, + data/graphics/particles/levelup.particle.xml: Added particle effect on + levelup (own or other player). + +2007-01-24 Philipp Sehmisch + + * src/particle.cpp: Initialized all variables of the particles in the + constructor. + * src/particleemitter.cpp, src/particleemitter.h: minor cleanups. + 2007-01-23 Bjørn Lindeijer * src/gui/shoplistbox.cpp, docs/INSTALL/win32.txt, INSTALL, NEWS: @@ -393,6 +798,39 @@ * src/gui/updatewindow.cpp: Identify ourselves when requesting files from the update server. +2007-01-22 Philipp Sehmisch + + * src/being.cpp, src/being.h, src/particle.cpp, src/particle.h + src/particleemitter.cpp, src/particleemitter.h, src/engine.cpp: + Particle effects are now created in child particles of the root + particle. Particle emitters have no longer a being they check every + frame. Instead beings have the ability to take control of particles. + +2007-01-19 Philipp Sehmisch + + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h: Implemented emitters that follow a being. + * src/engine.cpp: Added an emitter that follows the local player. + * src/particle.cpp: Fixed the crash on exit (reason was that the + mSpriteIterator wasn't initialized in every case) + +2007-01-18 Bjørn Lindeijer + + * src/properties.h, src/being.cpp, src/beingmanager.h, src/sound.h, + src/gui/window.h, src/sound.cpp, src/main.h, src/being.h, + src/resources/soundeffect.h, src/resources/image.h, + src/resources/mapreader.h, src/resources/music.h: Some trivial + documentation work. Fixes all Doxygen warnings. + * src/particle.h, src/particle.cpp, src/CMakeLists.txt, + src/Makefile.am: Fixed compilation issues on Linux. + * src/gui/char_select.h, src/net/messagein.h, + src/net/messagehandler.h, src/net/network.h, src/net/connection.h, + src/net/messageout.h, src/utils/xml.h, src/main.h, + src/resources/monsterdb.h, src/resources/itemdb.h, + src/resources/equipmentdb.h: Some work on documentation. + * data/maps/new_8-1.tmx.gz, data/maps/new_11-1.tmx.gz: Map fixes by + Pauan. + 2007-01-17 Eugenio Favalli * docs/win32-release.txt, src/gui/register.cpp, src/main.cpp: Changed @@ -408,6 +846,12 @@ * data/help/header.txt, NEWS, README: Updated release date. +2007-01-15 Philipp Sehmisch + + * src/game.cpp, src/particle.cpp, src/particle.h, + src/particleemitter.h: Made the particle count global and more + performant. + 2007-01-14 Eugenio Favalli * src/gui/updatewindow.cpp, src/main.cpp, tmw.cbp: Fixed windows @@ -448,6 +892,17 @@ * src/winver.h, configure.ac, data/help/header.txt, NEWS, README, CMakeLists.txt: Updated version to 0.0.22.1. +2007-01-14 Philipp Sehmisch + + * src/particle.cpp, src/particle.h; src/particleemitter.cpp, + src/particleemitter.h, src/utils/randbetween.h: + Implemented particle engine. + * src/engine.cpp, src/game.cpp: added calls to the particle engine + * data/graphics/particles/*: added a bunch of particle graphics for + testing purpose. + * particleengine-todo.txt: Added particle engine todo list (please + omit when merging) + 2007-01-13 Bjørn Lindeijer * data/graphics/sprites/Makefile.am, @@ -1298,7 +1753,7 @@ 2006-10-12 Yohann Ferreira * debian/rules, debian/tmw-data.install, debian/tmw-data.dirs, - debian/tmw-music.install, debian/changelog: Updating debian files for + debian/tmw-music.install, debian/changelog: Updating Debian files for bug fixing. 2006-10-12 Frode Lindeijer @@ -1473,7 +1928,7 @@ * src/animation.h, src/animatedsprite.h, data/graphics/sprites/weapon.xml: Some modifications at the animation system. No more "undefined action foo" warnings in the tmw.log. Not - visible actions must now be declared explicitely. + visible actions must now be declared explicitly. * data/graphics/images/ambient/sandstorm.png, data/graphics/images/ambient/clouds.png: Improved quality of the overlay graphics. @@ -1892,7 +2347,7 @@ with more distinctive names. (no, i won't list all 114) * src/itemmanager.cpp, data/items.xml: Replaced indices on the item spriteset with filenames. added names and descriptions for all missing - items. Changed names and dascriptions of some items. + items. Changed names and descriptions of some items. * src/engine.cpp: Removed global item spriteset. * src/floor_item.cpp, src/floor_item.h, src/iteminfo.cpp, src/iteminfo.h, src/equipmentwindow.cpp, src/equipmentwindow.h, diff --git a/NEWS b/NEWS index 5281cf78..9529ae1b 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,19 @@ +0.0.23 (3 June 2007) +- Added a particle engine along with some particle effects +- Added a cursor to indicate targeted enemy +- Added new program icon +- Added a man page for UNIX like systems +- Added the --version command line parameter +- Improved MacOS X release +- Screenshots are now saved in the .tmw directory on UNIX like systems +- Magic pink is no longer used for transparency (fixes issues with that on Mac) +- Fixed difficulties with resizing windows +- Fixed misleading error message when connecting fails +- Fixed wrong error message when account name already exists +- Fixed crash when deleting a character +- Fixed error message when creating a new character fails +- Fixed updating problem when using scrollwheel to change shop selection + 0.0.22.2 (17 February 2007) - Updated to work with Guichan 0.6.1 - Changed to new default server (server.themanaworld.org) diff --git a/README b/README index 2d6f07b1..39677e1e 100644 --- a/README +++ b/README @@ -1,8 +1,7 @@ THE MANA WORLD ============== - Version: 0.0.22.2 Date: 17/02/2007 - + Version: 0.1.0 Date: XX/XX/2007 Development team: - See AUTHORS file for a list diff --git a/data/graphics/gui/CMakeLists.txt b/data/graphics/gui/CMakeLists.txt index 1549b2b4..5a02d7f1 100644 --- a/data/graphics/gui/CMakeLists.txt +++ b/data/graphics/gui/CMakeLists.txt @@ -30,8 +30,12 @@ SET (FILES sansserif8.png selection.png slider.png - target-cursor-blue.png - target-cursor-red.png + target-cursor-blue-l.png + target-cursor-blue-m.png + target-cursor-blue-s.png + target-cursor-red-l.png + target-cursor-red-m.png + target-cursor-red-s.png thickborder.png vscroll_blue.png vscroll_down_default.png diff --git a/data/graphics/gui/Makefile.am b/data/graphics/gui/Makefile.am index c0e0655b..a37e1196 100644 --- a/data/graphics/gui/Makefile.am +++ b/data/graphics/gui/Makefile.am @@ -33,6 +33,12 @@ gui_DATA = \ sansserif8.png \ selection.png \ slider.png \ + target-cursor-blue-l.png \ + target-cursor-blue-m.png \ + target-cursor-blue-s.png \ + target-cursor-red-l.png \ + target-cursor-red-m.png \ + target-cursor-red-s.png \ thickborder.png \ vscroll_blue.png \ vscroll_down_default.png \ diff --git a/data/graphics/gui/target-cursor-blue-l.png b/data/graphics/gui/target-cursor-blue-l.png new file mode 100644 index 00000000..77cdf4b6 Binary files /dev/null and b/data/graphics/gui/target-cursor-blue-l.png differ diff --git a/data/graphics/gui/target-cursor-blue-m.png b/data/graphics/gui/target-cursor-blue-m.png new file mode 100644 index 00000000..c0107357 Binary files /dev/null and b/data/graphics/gui/target-cursor-blue-m.png differ diff --git a/data/graphics/gui/target-cursor-blue-s.png b/data/graphics/gui/target-cursor-blue-s.png new file mode 100644 index 00000000..3e81c75d Binary files /dev/null and b/data/graphics/gui/target-cursor-blue-s.png differ diff --git a/data/graphics/gui/target-cursor-blue.png b/data/graphics/gui/target-cursor-blue.png deleted file mode 100644 index 3e81c75d..00000000 Binary files a/data/graphics/gui/target-cursor-blue.png and /dev/null differ diff --git a/data/graphics/gui/target-cursor-red-l.png b/data/graphics/gui/target-cursor-red-l.png new file mode 100644 index 00000000..76d2101b Binary files /dev/null and b/data/graphics/gui/target-cursor-red-l.png differ diff --git a/data/graphics/gui/target-cursor-red-m.png b/data/graphics/gui/target-cursor-red-m.png new file mode 100644 index 00000000..e2ab79c2 Binary files /dev/null and b/data/graphics/gui/target-cursor-red-m.png differ diff --git a/data/graphics/gui/target-cursor-red-s.png b/data/graphics/gui/target-cursor-red-s.png new file mode 100644 index 00000000..09195f44 Binary files /dev/null and b/data/graphics/gui/target-cursor-red-s.png differ diff --git a/data/graphics/gui/target-cursor-red.png b/data/graphics/gui/target-cursor-red.png deleted file mode 100644 index 09195f44..00000000 Binary files a/data/graphics/gui/target-cursor-red.png and /dev/null differ diff --git a/data/help/changes.txt b/data/help/changes.txt index f8a3eb67..dd062e49 100644 --- a/data/help/changes.txt +++ b/data/help/changes.txt @@ -3,99 +3,56 @@ ##3 === RECENT CHANGES === - 0.0.21 (17 September 2006) - - Added item pickup messages to the chat dialog - - Added XP bar to ministatus in the top left - - Added configurable smooth and lazy scrolling - - Added option to turn off the joystick - - Added --playername option for automatic character picking - - Added --configfile option for specifying which configuration file to use - - Added shortcut and middle mouse button for targetting nearest monster - - Added support for map effect overlays - - Fixed FPS limiter - - Fixed updating system on Windows - - Fixed player animations going out of sync on changing equipment or hairstyle - - Fixed SDL_image configure check on some systems by first checking for libpng - - Fixed big memory leak when using OpenGL - - Updated to work with Guichan 0.5.0 (older versions no longer supported) - - 0.0.20 (24 July 2006) - - Added new hairstyle, and some fixes to the old ones - - Added slider to set FPS limit - - Added visible equipments - - Added new maps and monsters - - Added female characters - - Implemented a new animation system - - Updated the updating system - - Reduced size of textures to stay within the limits of some OpenGL drivers - - Fixed connection not being shut down completely in case of an error - - Fixed min size of a window when resizing - - Fixed some maps issues - - Some fixes to monsters and player graphics - - Minor bug fixes and lots of code cleanups - - 0.0.19 (6 March 2006) - - - Added --username, --password and --defaults command line options - - Improved login sequence - - Enabled 3 slots to create players - - Improved setup window and added a joystick calibration tool - - Some maps fixes - - Reorganized and improved network code - - Fixed some bugs - - Made the player walk to items prior to picking them up - - Added new playerset - - Lots of cleanups and code re-roganization - - 0.0.18.1 (30 December 2005) - - - Fixed a drawing glitch with high tiles at the bottom of the screen - - Fixed glitches caused by fading out the damage display - - 0.0.18 (20 December 2005) - - - Added new items, npcs, tilesets, maps and monsters - - Non blocking connection at startup - - Enabled monster emotions - - Client version is now displayed during login - - Fixed setup window behaviour - - Fixed a Windows crash issue - - Fixed ScrollArea and BrowserBox behaviour - - Code cleanups - - 0.0.17 (10 October 2005) - - - Added remembering of window position and sizes - - Added taking screenshot with Alt+P - - Added notice about the player being overweight - - Added time to chat messages - - Added messagebox on error for MacOS X - - Added new network layer based on SDL_net - - Added proper error message for when the map server goes offline - - Added more international characters to fixed and rpg fonts - - Improved damage text font, shadow is now translucent - - Improved GUI layout, new profile window - - Improved support for building on FreeBSD and MacOS X - - Improved tile engine to fix graphics glitches and make mapping easier - - Rearranged keyboard shortcuts - - Fixed items on map to be removed on map switch - - Fixed OpenGL checkbox in the setup window to be usable - - Cleaned up a lot of code - - 0.0.16 (04 September 2005) - - - Added inn and casino - - Improved status window - - Improved OpenGL support - - Removed lot of bugs - - Code cleanups - - 0.0.15 (31 July 2005) - - - Added dynamic updating of client data - - Added much better font for chat and names - - Added option not to use the custom mouse cursor - - Added joystick support - - Improved mouse attack by not walking while pressing shift - - Fixed items being shown as equipped in inventory although they are not + 0.0.23 (3 June 2007) + - Added a particle engine along with some particle effects + - Added a cursor to indicate targeted enemy + - Added new program icon + - Added a man page for UNIX like systems + - Added the --version command line parameter + - Improved MacOS X release + - Screenshots are now saved in the .tmw directory on UNIX like systems + - Magic pink is no longer used for transparency (fixes issues with that on Mac) + - Fixed difficulties with resizing windows + - Fixed misleading error message when connecting fails + - Fixed wrong error message when account name already exists + - Fixed crash when deleting a character + - Fixed error message when creating a new character fails + - Fixed updating problem when using scrollwheel to change shop selection + + 0.0.22.2 (17 February 2007) + - Updated to work with Guichan 0.6.1 + - Changed to new default server (server.themanaworld.org) + - Changed custom mouse cursor + - Fixed the issue where _M or _F is appended to the username + - Fixed problem with Cancel button in update dialog + + 0.0.22.1 (15 January 2007) + - Updated to work with Guichan 0.6.0 (older versions no longer supported) + - Fixed mouse coordinates in debug window + - Fixed clicking on GUI to cause the player to start walking sometimes + + 0.0.22 (24 December 2006) + - Added support for female-specific equipment graphics + - Added support for monster sounds + - Added item icons to buy/sell dialogs + - Enhanced character select dialog to show equipment + - Changed to new update host (http://updates.themanaworld.org) + - Worked around a Guichan exception thrown for mice with many buttons + - Changed mouse walk to keep following mouse while button is held down + - Extended font support for Ã¥ and Ã… + - Disabled RLE compression on all surfaces in software mode + - Fixed joystick setting not to show disabled when it's actually enabled + - Fixed money field to no longer hide below the bottom of the window + - Fixed pathfinding to allow walking through beings when they block your path + - Fixed an issue with NPC dialogs staying open after player respawn + + 0.0.21.1 (30 October 2006) + - Reload wallpaper after loading updates + - Added support for gzip compressed map layer data + - Added support for building with CMake + - Added slider to setup dialog for configuring overlay effect + - Fixed excessive unnecessary reloading of sprites + - Fixed problem with OpenGL related redefinition + - Fixed problems with hiding windows using h + - Fixed trade window positioning diff --git a/data/help/header.txt b/data/help/header.txt index 7311c111..b10ed991 100644 --- a/data/help/header.txt +++ b/data/help/header.txt @@ -2,7 +2,7 @@ ##1 T H E M A N A W O R L D ##1 ========================================== - ##2Version:##6 0.0.22.2 ##2Date:##317 February 2007 + ##2Version:##6 0.0.23 ##2Date:##33 June 2007 ##2 Website: http://themanaworld.org diff --git a/docs/Makefile.am b/docs/Makefile.am index 8b57d5bb..1ee9a9a6 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -1,6 +1,7 @@ man6_MANS = tmw.6 -EXTRA_DIST = packages.txt \ +EXTRA_DIST = $(man6_MANS) \ + packages.txt \ FAQ.txt \ HACKING.txt \ SOURCE/tmwdox.sh \ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e28e235e..7a4da70d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -47,6 +47,8 @@ MARK_AS_ADVANCED(SDL_INCLUDE_DIR) MARK_AS_ADVANCED(SDL_LIBRARY) SET(SRCS + gui/widgets/resizegrip.cpp + gui/widgets/resizegrip.h gui/box.cpp gui/box.h gui/browserbox.cpp @@ -275,11 +277,15 @@ SET(SRCS utils/base64.cpp utils/base64.h utils/dtor.h + utils/fastsqrt.h + utils/minmax.h utils/tostring.h utils/xml.cpp utils/xml.h animatedsprite.cpp animatedsprite.h + animationparticle.cpp + animationparticle.h being.cpp being.h beingmanager.cpp @@ -304,6 +310,8 @@ SET(SRCS graphics.cpp graphics.h guichanfwd.h + imageparticle.cpp + imageparticle.h inventory.cpp inventory.h item.cpp @@ -326,6 +334,10 @@ SET(SRCS npc.h openglgraphics.cpp openglgraphics.h + particle.cpp + particle.h + particleemitter.cpp + particleemitter.h player.cpp player.h properties.h @@ -335,6 +347,8 @@ SET(SRCS sound.cpp sound.h sprite.h + textparticle.cpp + textparticle.h tileset.h ) diff --git a/src/Makefile.am b/src/Makefile.am index f1f51b79..92c1b1b2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,6 +3,8 @@ AUTOMAKE_OPTIONS = subdir-objects bin_PROGRAMS = tmw tmw_SOURCES = gui/widgets/dropdown.cpp \ gui/widgets/dropdown.h \ + gui/widgets/resizegrip.cpp \ + gui/widgets/resizegrip.h \ gui/browserbox.cpp \ gui/browserbox.h \ gui/buddywindow.cpp \ @@ -229,11 +231,15 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ utils/base64.cpp \ utils/base64.h \ utils/dtor.h \ + utils/fastsqrt.h \ + utils/minmax.h \ utils/tostring.h \ utils/xml.cpp \ utils/xml.h \ animatedsprite.cpp \ animatedsprite.h \ + animationparticle.cpp \ + animationparticle.h \ being.cpp \ being.h \ beingmanager.cpp \ @@ -258,6 +264,8 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ graphics.cpp \ graphics.h \ guichanfwd.h \ + imageparticle.cpp \ + imageparticle.h \ inventory.cpp \ inventory.h \ item.cpp \ @@ -280,15 +288,21 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ npc.h \ openglgraphics.cpp\ openglgraphics.h \ + particle.cpp \ + particle.h \ + particleemitter.cpp \ + particleemitter.h \ player.cpp \ player.h \ properties.h \ serverinfo.h \ simpleanimation.cpp \ - simpleanimation.h \ + simpleanimation.h \ sound.cpp \ sound.h \ sprite.h \ + textparticle.cpp \ + textparticle.h \ tileset.h # set the include path found by configure diff --git a/src/animatedsprite.cpp b/src/animatedsprite.cpp index 7260a512..c1e89ff0 100644 --- a/src/animatedsprite.cpp +++ b/src/animatedsprite.cpp @@ -197,3 +197,27 @@ AnimatedSprite::setDirection(SpriteDirection direction) } } } + +int +AnimatedSprite::getWidth() const +{ + if (mFrame) + { + return mFrame->image->getWidth(); + } + else { + return 0; + } +} + +int +AnimatedSprite::getHeight() const +{ + if (mFrame) + { + return mFrame->image->getHeight(); + } + else { + return 0; + } +} diff --git a/src/animatedsprite.h b/src/animatedsprite.h index 2257c0f0..42c0a743 100644 --- a/src/animatedsprite.h +++ b/src/animatedsprite.h @@ -85,6 +85,18 @@ class AnimatedSprite bool draw(Graphics* graphics, int posX, int posY) const; + /** + * gets the width in pixels of the image of the current frame + */ + int + getWidth() const; + + /** + * gets the height in pixels of the image of the current frame + */ + int + getHeight() const; + /** * Sets the direction. */ diff --git a/src/animationparticle.cpp b/src/animationparticle.cpp new file mode 100644 index 00000000..30c33da7 --- /dev/null +++ b/src/animationparticle.cpp @@ -0,0 +1,51 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "animationparticle.h" + +#include "graphics.h" +#include "simpleanimation.h" + +AnimationParticle::AnimationParticle(Map *map, Animation *animation): + ImageParticle(map, 0), + mAnimation(new SimpleAnimation(animation)) +{ +} + +AnimationParticle::AnimationParticle(Map *map, xmlNodePtr animationNode): + ImageParticle(map, 0), + mAnimation(new SimpleAnimation(animationNode)) +{ +} + +AnimationParticle::~AnimationParticle() +{ + delete mAnimation; +} + +bool AnimationParticle::update() +{ + mAnimation->update(10); // particle engine is updated every 10ms + mImage = mAnimation->getCurrentImage(); + + return Particle::update(); +} diff --git a/src/animationparticle.h b/src/animationparticle.h new file mode 100644 index 00000000..054b1b73 --- /dev/null +++ b/src/animationparticle.h @@ -0,0 +1,49 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _ANIMATION_PARTICLE +#define _ANIMATION_PARTICLE + +#include + +#include "imageparticle.h" + +class Animation; +class Map; +class SimpleAnimation; + +class AnimationParticle : public ImageParticle +{ + public: + AnimationParticle(Map *map, Animation *animation); + + AnimationParticle(Map *map, xmlNodePtr animationNode); + + ~AnimationParticle(); + + virtual bool update(); + + private: + SimpleAnimation *mAnimation; /**< Used animation for this particle */ +}; + +#endif diff --git a/src/being.cpp b/src/being.cpp index 682daddb..7ba9ddb9 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -32,12 +32,16 @@ #include "graphics.h" #include "log.h" #include "map.h" +#include "particle.h" #include "resources/resourcemanager.h" #include "resources/imageset.h" #include "gui/gui.h" +#include "resources/resourcemanager.h" +#include "resources/imageset.h" + #include "utils/dtor.h" #include "utils/tostring.h" @@ -61,7 +65,6 @@ Being::Being(Uint16 id, Uint16 job, Map *map): mMap(NULL), mHairStyle(0), mHairColor(0), mSpeechTime(0), - mDamageTime(0), mPx(0), mPy(0), mSprites(VECTOREND_SPRITE, NULL), mEquipmentSpriteIDs(VECTOREND_SPRITE, 0) @@ -85,6 +88,13 @@ Being::~Being() clearPath(); setMap(NULL); + for ( std::list::iterator i = mChildParticleEffects.begin(); + i != mChildParticleEffects.end(); + i++) + { + (*i)->kill(); + } + instances--; if (instances == 0) @@ -292,8 +302,32 @@ Being::setSpeech(const std::string &text, Uint32 time) void Being::takeDamage(int amount) { - mDamage = amount ? toString(amount) : "miss"; - mDamageTime = 300; + gcn::Font* font; + std::string damage = amount ? toString(amount) : "miss"; + + // Selecting the right color + if (damage == "miss") + { + font = hitYellowFont; + } + else + { + // hit particle effect + controlParticle(particleEngine->addEffect("graphics/particles/hit.particle.xml", 0, 0)); + + if (getType() == MONSTER) + { + font = hitBlueFont; + } + else + { + font = hitRedFont; + } + } + + // show damage number + particleEngine->addTextSplashEffect(damage, 255, 255, 255, font, + mPx + 16, mPy + 16); } void @@ -318,6 +352,19 @@ Being::setMap(Map *map) { mSpriteIterator = mMap->addSprite(this); } + + //clear particle effect list because child particles became invalid + mChildParticleEffects.clear(); +} + +void +Being::controlParticle(Particle *particle) +{ + if (particle) + { + particle->disableAutoDelete(); //the effect may not die without the beings permission or we segvault + mChildParticleEffects.push_back(particle); + } } void @@ -465,10 +512,6 @@ Being::logic() if (mSpeechTime > 0) mSpeechTime--; - // Reduce the time that damage is still displayed - if (mDamageTime > 0) - mDamageTime--; - // Update pixel coordinates mPx = mX - 16 + getXOffset(); mPy = mY - 16 + getYOffset(); @@ -489,6 +532,14 @@ Being::logic() mSprites[i]->update(tick_time * 10); } } + + //Update particle effects + for ( std::list::iterator i = mChildParticleEffects.begin(); + i != mChildParticleEffects.end(); + i++) + { + (*i)->setPosition((float)mPx + 16.0f, (float)mPy + 32.0f); + } } void @@ -531,37 +582,6 @@ Being::drawSpeech(Graphics *graphics, int offsetX, int offsetY) graphics->setColor(gcn::Color(255, 255, 255)); graphics->drawText(mSpeech, px + 18, py - 60, gcn::Graphics::CENTER); } - - // Draw damage above this being - if (mDamageTime > 0 && mDamageTime < 275) - { - // Selecting the right color - if (mDamage == "miss") - { - graphics->setFont(hitYellowFont); - } - else if (getType() == MONSTER) - { - graphics->setFont(hitBlueFont); - } - else - { - graphics->setFont(hitRedFont); - } - - int textY = (getType() == MONSTER) ? 32 : 70; - int ft = 150 - mDamageTime; - float a = (ft > 0) ? 1.0 - ft / 150.0 : 1.0; - - graphics->setColor(gcn::Color(255, 255, 255, (int)(255 * a))); - graphics->drawText(mDamage, - px + 16, - py - textY - (300 - mDamageTime) / 10, - gcn::Graphics::CENTER); - - // Reset alpha value - graphics->setColor(gcn::Color(255, 255, 255)); - } } Being::Type @@ -632,3 +652,29 @@ int Being::getOffset(int step) const return offset; } + + +int +Being::getWidth() const +{ + if (mSprites[BASE_SPRITE]) + { + return mSprites[BASE_SPRITE]->getWidth(); + } + else { + return 0; + } +} + + +int +Being::getHeight() const +{ + if (mSprites[BASE_SPRITE]) + { + return mSprites[BASE_SPRITE]->getHeight(); + } + else { + return 0; + } +} diff --git a/src/being.h b/src/being.h index 332f1b4a..8820c30a 100644 --- a/src/being.h +++ b/src/being.h @@ -42,6 +42,7 @@ class Item; class Map; class Graphics; class ImageSet; +class Particle; /** * A position along a being's path. @@ -97,6 +98,13 @@ class Being : public Sprite VECTOREND_SPRITE }; + enum TargetCursorSize { + TC_SMALL = 0, + TC_MEDIUM, + TC_LARGE, + NUM_TC + }; + /** * Directions, to be used as bitmask values @@ -359,8 +367,33 @@ class Being : public Sprite int getYOffset() const { return getOffset(mStepY); } + /** + * Returns the horizontal size of the current base sprite of the being + */ + virtual int + getWidth() const; + + /** + * Returns the vertical size of the current base sprite of the being + */ + virtual int + getHeight() const; + + /** + * Returns the required size of a target cursor for this being + */ + virtual Being::TargetCursorSize + getTargetCursorSize() const + { return TC_MEDIUM; } + std::auto_ptr mEquipment; + /** + * Take control of a particle + */ + void + controlParticle(Particle *particle); + protected: /** * Sets the new path for this being. @@ -380,14 +413,13 @@ class Being : public Sprite Path mPath; std::string mSpeech; - std::string mDamage; Uint16 mHairStyle, mHairColor; Uint32 mSpeechTime; - Uint32 mDamageTime; Sint32 mPx, mPy; /**< Pixel coordinates */ std::vector mSprites; std::vector mEquipmentSpriteIDs; + std::list mChildParticleEffects; private: int diff --git a/src/engine.cpp b/src/engine.cpp index 31bec9ff..3b5fb403 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -35,6 +35,7 @@ #include "localplayer.h" #include "log.h" #include "map.h" +#include "particle.h" #include "sound.h" #include "gui/gui.h" @@ -63,6 +64,7 @@ void Engine::changeMap(const std::string &mapPath) floorItemManager->clear(); beingManager->clear(); + particleEngine->clear(); // Store full map path in global var map_path = "maps/" + mapPath; @@ -83,8 +85,12 @@ void Engine::changeMap(const std::string &mapPath) } minimap->setMapImage(mapImage); beingManager->setMap(newMap); + particleEngine->setMap(newMap); viewport->setMap(newMap); + // Initialize map-based particle effects + newMap->initializeParticleEffects(particleEngine); + // Start playing new music file when necessary std::string oldMusic = ""; @@ -106,5 +112,6 @@ void Engine::changeMap(const std::string &mapPath) void Engine::logic() { beingManager->logic(); + particleEngine->update(); gui->logic(); } diff --git a/src/game.cpp b/src/game.cpp index ba4e2b9d..1afc530b 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -41,6 +41,7 @@ #include "localplayer.h" #include "log.h" #include "npc.h" +#include "particle.h" #include "gui/buy.h" #include "gui/buysell.h" @@ -121,6 +122,8 @@ BeingManager *beingManager = NULL; FloorItemManager *floorItemManager = NULL; ChannelManager *channelManager = NULL; +Particle *particleEngine = NULL; + const int MAX_TIME = 10000; /** @@ -242,6 +245,9 @@ Game::Game(): floorItemManager = new FloorItemManager(); channelManager = new ChannelManager(); + particleEngine = new Particle(NULL); + particleEngine->setupEngine(); + // Initialize timers tick_time = 0; mLogicCounterId = SDL_AddTimer(10, nextTick, NULL); //Logic counter @@ -286,6 +292,7 @@ Game::~Game() delete floorItemManager; delete channelManager; delete joystick; + delete particleEngine; beingManager = NULL; floorItemManager = NULL; @@ -308,7 +315,9 @@ bool saveScreenshot(SDL_Surface *screenshot) screenshotCount++; filename.str(""); #if (defined __USE_UNIX98 || defined __FreeBSD__ || defined __APPLE__) - filename << PHYSFS_getUserDir() << "/"; + filename << PHYSFS_getUserDir() << ".tmw/"; +#elif defined __APPLE__ + filename << PHYSFS_getUserDir() << "Desktop/"; #endif filename << "TMW_Screenshot_" << screenshotCount << ".png"; testExists.open(filename.str().c_str(), std::ios::in); @@ -316,7 +325,18 @@ bool saveScreenshot(SDL_Surface *screenshot) testExists.close(); } while (!found); - return ImageWriter::writePNG(screenshot, filename.str()); + if (ImageWriter::writePNG(screenshot, filename.str())) + { + std::stringstream chatlogentry; + chatlogentry << "Screenshot saved to " << filename.str().c_str(); + chatWindow->chatLog(chatlogentry.str(), BY_SERVER); + return true; + } + else + { + chatWindow->chatLog("Saving screenshot failed!", BY_SERVER); + return false; + } } void Game::optionChanged(const std::string &name) diff --git a/src/graphics.cpp b/src/graphics.cpp index f007470a..1e31f903 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -136,8 +136,6 @@ bool Graphics::drawImage(Image *image, int srcX, int srcY, int dstX, int dstY, srcX += image->mBounds.x; srcY += image->mBounds.y; - - SDL_Rect dstRect; SDL_Rect srcRect; dstRect.x = dstX; dstRect.y = dstY; diff --git a/src/gui/buy.cpp b/src/gui/buy.cpp index cb07da22..2a8616f8 100644 --- a/src/gui/buy.cpp +++ b/src/gui/buy.cpp @@ -111,27 +111,21 @@ void BuyDialog::setMoney(int amount) { mMoney = amount; mShopItemList->setPlayersMoney(amount); - mMoneyLabel->setCaption("Price: 0 GP / " + toString(mMoney) + " GP"); - mMoneyLabel->adjustSize(); + + updateButtonsAndLabels(); } void BuyDialog::reset() { mShopItems->clear(); + mShopItemList->adjustSize(); mMoney = 0; mSlider->setValue(0.0); - mAmountItems = 0; // Reset Previous Selected Items to prevent failing asserts mShopItemList->setSelected(-1); - mIncreaseButton->setEnabled(false); - mDecreaseButton->setEnabled(false); - mQuantityLabel->setCaption("0"); - mQuantityLabel->adjustSize(); - mMoneyLabel->setCaption("Price: 0 GP / " + toString(mMoney) + " GP"); - mMoneyLabel->adjustSize(); - mItemDescLabel->setCaption(""); - mItemEffectLabel->setCaption(""); + + updateButtonsAndLabels(); } void BuyDialog::addItem(short id, int price) @@ -151,45 +145,36 @@ void BuyDialog::action(const gcn::ActionEvent &event) } // The following actions require a valid selection - if (selectedItem < 0 || selectedItem >= int(mShopItems->getNumberOfElements())) + if (selectedItem < 0 || + selectedItem >= (int) mShopItems->getNumberOfElements()) { return; } - bool updateButtonsAndLabels = false; - if (event.getId() == "slider") { mAmountItems = (int)(mSlider->getValue() * mMaxItems); - updateButtonsAndLabels = true; + updateButtonsAndLabels(); } - else if (event.getId() == "+") + else if (event.getId() == "+" && mAmountItems < mMaxItems) { - if (mAmountItems < mMaxItems) { - mAmountItems++; - } else { - mAmountItems = mMaxItems; - } + mAmountItems++; - mSlider->setValue(double(mAmountItems)/double(mMaxItems)); - updateButtonsAndLabels = true; + mSlider->setValue((double) mAmountItems / (double) mMaxItems); + updateButtonsAndLabels(); } - else if (event.getId() == "-") + else if (event.getId() == "-" && mAmountItems > 0) { - if (mAmountItems > 0) { - mAmountItems--; - } else { - mAmountItems = 0; - } + mAmountItems--; - mSlider->setValue(double(mAmountItems)/double(mMaxItems)); - updateButtonsAndLabels = true; + mSlider->setValue((double) mAmountItems / (double) mMaxItems); + updateButtonsAndLabels(); } // TODO: Actually we'd have a bug elsewhere if this check for the number // of items to be bought ever fails, Bertram removed the assertions, is // there a better way to ensure this fails in an _obivous_ way in C++? - else if (event.getId() == "buy" && (mAmountItems > 0 && - mAmountItems <= mMaxItems)) + else if (event.getId() == "buy" && mAmountItems > 0 && + mAmountItems <= mMaxItems) { // XXX Convert for new server /* @@ -199,38 +184,15 @@ void BuyDialog::action(const gcn::ActionEvent &event) outMsg.writeShort(mShopItems->at(selectedItem).id); */ - // update money ! + // Update money and adjust the max number of items that can be bought mMoney -= mAmountItems * mShopItems->at(selectedItem).price; - // Update number of items that can be bought at max mMaxItems -= mAmountItems; - if (!mMaxItems) { - mSlider->setEnabled(false); - } - // Reset selection mAmountItems = 0; - mSlider->setValue(0); - - updateButtonsAndLabels = true; - } + mSlider->setValue(0.0); - // If anything has changed, we have to update the buttons and labels - if (updateButtonsAndLabels) - { - // Update buttons - mIncreaseButton->setEnabled(mAmountItems < mMaxItems); - mDecreaseButton->setEnabled(mAmountItems > 0); - mBuyButton->setEnabled(mAmountItems > 0); - - // Update labels - mQuantityLabel->setCaption(toString(mAmountItems)); - mQuantityLabel->adjustSize(); - - int price = mAmountItems * mShopItems->at(selectedItem).price; - mMoneyLabel->setCaption("Price: " + toString(price) + " GP / " - + toString(mMoney) + " GP" ); - mMoneyLabel->adjustSize(); + updateButtonsAndLabels(); } } @@ -238,17 +200,16 @@ void BuyDialog::selectionChanged(const SelectionEvent &event) { // Reset amount of items and update labels mAmountItems = 0; - mSlider->setValue(0); - mQuantityLabel->setCaption("0"); - mQuantityLabel->adjustSize(); - mMoneyLabel->setCaption("Price: 0 GP / " + toString(mMoney) + " GP"); - mMoneyLabel->adjustSize(); + mSlider->setValue(0.0); - // Disable buttons for buying and decreasing - mBuyButton->setEnabled(false); - mDecreaseButton->setEnabled(false); + updateButtonsAndLabels(); +} +void +BuyDialog::updateButtonsAndLabels() +{ int selectedItem = mShopItemList->getSelected(); + int price = 0; if (selectedItem > -1) { @@ -259,16 +220,32 @@ void BuyDialog::selectionChanged(const SelectionEvent &event) // Calculate how many the player can afford mMaxItems = mMoney / mShopItems->at(selectedItem).price; + if (mAmountItems > mMaxItems) + { + mAmountItems = mMaxItems; + } + + // Calculate price of pending purchase + price = mAmountItems * mShopItems->at(selectedItem).price; } else { mItemDescLabel->setCaption("Description:"); mItemEffectLabel->setCaption("Effect:"); mMaxItems = 0; + mAmountItems = 0; } - // When at least one item can be bought, enable the slider and the - // increase button - mIncreaseButton->setEnabled(mMaxItems > 0); + // Enable or disable buttons and slider + mIncreaseButton->setEnabled(mAmountItems < mMaxItems); + mDecreaseButton->setEnabled(mAmountItems > 0); + mBuyButton->setEnabled(mAmountItems > 0); mSlider->setEnabled(mMaxItems > 0); + + // Update quantity and money labels + mQuantityLabel->setCaption(toString(mAmountItems)); + mQuantityLabel->adjustSize(); + mMoneyLabel->setCaption("Price: " + toString(price) + " GP / " + + toString(mMoney - price) + " GP" ); + mMoneyLabel->adjustSize(); } diff --git a/src/gui/buy.h b/src/gui/buy.h index 13116b6e..7834a434 100644 --- a/src/gui/buy.h +++ b/src/gui/buy.h @@ -92,6 +92,12 @@ class BuyDialog : public Window, public gcn::ActionListener, SelectionListener */ std::string getElementAt(int i); + /** + * Updates the state of buttons and labels. + */ + void + updateButtonsAndLabels(); + private: gcn::Button *mBuyButton; gcn::Button *mQuitButton; diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index eb6b7612..48df9efe 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -160,7 +160,7 @@ ChatWindow::chatLog(std::string line, int own, std::string channelName) break; case BY_OTHER: tmp.nick += CAT_NORMAL; - lineColor = "##4"; // Equiv. to BrowserBox::ORANGE + lineColor = "##0"; // Equiv. to BrowserBox::BLACK break; case BY_SERVER: tmp.nick += std::string("Server: "); @@ -195,7 +195,7 @@ ChatWindow::chatLog(std::string line, int own, std::string channelName) // We look if the Vertical Scroll Bar is set at the max before // adding a row, otherwise the max will always be a row higher // at comparison. - if (mScrollArea->getVerticalScrollAmount() == mScrollArea->getVerticalMaxScroll() ) + if (mScrollArea->getVerticalScrollAmount() == mScrollArea->getVerticalMaxScroll()) { mTextOutput->addRow(line); mScrollArea->setVerticalScrollAmount(mScrollArea->getVerticalMaxScroll()); diff --git a/src/gui/chat.h b/src/gui/chat.h index c7e51ebf..6f9b91fe 100644 --- a/src/gui/chat.h +++ b/src/gui/chat.h @@ -168,13 +168,13 @@ class ChatWindow : public Window, public gcn::ActionListener, /* * Determines whether to send a command or an ordinary message, then - * contructs packets & sends them + * contructs packets & sends them. * * @param nick The character's name to display in front. * @param msg The message text which is to be send. * * NOTE: - * the nickname is required by the server, if not specified + * The nickname is required by the server, if not specified * the message may not be sent unless a command was intended * which requires another packet to be constructed! you can * achieve this by putting a slash ("/") infront of the diff --git a/src/gui/debugwindow.cpp b/src/gui/debugwindow.cpp index 563f380f..ebf7d974 100644 --- a/src/gui/debugwindow.cpp +++ b/src/gui/debugwindow.cpp @@ -33,6 +33,7 @@ #include "../game.h" #include "../engine.h" +#include "../particle.h" #include "../map.h" #include "../utils/tostring.h" @@ -58,6 +59,9 @@ DebugWindow::DebugWindow(): mTileMouseLabel = new gcn::Label("[Mouse: 0, 0]"); mTileMouseLabel->setPosition(100, 0); + mParticleCountLabel = new gcn::Label("[Particle count: 0]"); + mParticleCountLabel->setPosition(100, 60); + Button *closeButton = new Button("Close", "close", this); closeButton->setPosition(5, 60); @@ -65,6 +69,7 @@ DebugWindow::DebugWindow(): add(mMusicFileLabel); add(mMapFileLabel); add(mTileMouseLabel); + add(mParticleCountLabel); add(closeButton); } @@ -97,6 +102,11 @@ DebugWindow::logic() mMapFileLabel->setCaption(minimap); mMapFileLabel->adjustSize(); } + + mParticleCountLabel->setCaption("[Particle count: " + + toString(Particle::particleCount) + +"]"); + mParticleCountLabel->adjustSize(); } void diff --git a/src/gui/debugwindow.h b/src/gui/debugwindow.h index 4fd33d83..d082b2ca 100644 --- a/src/gui/debugwindow.h +++ b/src/gui/debugwindow.h @@ -58,6 +58,7 @@ class DebugWindow : public Window, public gcn::ActionListener private: gcn::Label *mMusicFileLabel, *mMapFileLabel; gcn::Label *mTileMouseLabel, *mFPSLabel; + gcn::Label *mParticleCountLabel; }; #endif diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp index 44d042a6..2018c75a 100644 --- a/src/gui/inventorywindow.cpp +++ b/src/gui/inventorywindow.cpp @@ -165,8 +165,8 @@ void InventoryWindow::mouseClicked(gcn::MouseEvent &event) if (!item) return; - /* Convert relative to the window coordinates to - * absolute screen coordinates. + /* Convert relative to the window coordinates to absolute screen + * coordinates. */ int mx = event.getX() + getX(); int my = event.getY() + getY(); @@ -178,7 +178,8 @@ void InventoryWindow::mouseDragged(gcn::MouseEvent &event) { int tmpWidth = getWidth(), tmpHeight = getHeight(); Window::mouseDragged(event); - if (getWidth() != tmpWidth || getHeight() != tmpHeight) { + if (getWidth() != tmpWidth || getHeight() != tmpHeight) + { updateWidgets(); } } diff --git a/src/gui/sell.cpp b/src/gui/sell.cpp index c9878c84..478371b1 100644 --- a/src/gui/sell.cpp +++ b/src/gui/sell.cpp @@ -88,7 +88,7 @@ SellDialog::SellDialog(): quitButton->setPosition(208, 186); mShopItemList->setActionEventId("item"); - mSlider->setActionEventId("mSlider"); + mSlider->setActionEventId("slider"); mShopItemList->setPriceCheck(false); @@ -119,20 +119,11 @@ void SellDialog::reset() { mShopItems->clear(); mSlider->setValue(0.0); - mAmountItems = 0; - - mQuantityLabel->setCaption("0"); - mQuantityLabel->adjustSize(); - mMoneyLabel->setCaption("Money: 0 GP / Total: " - + toString(mPlayerMoney) + " GP"); - mMoneyLabel->adjustSize(); - mItemDescLabel->setCaption(""); - mItemEffectLabel->setCaption(""); - // Reset Previous Selected Items to prevent failing asserts + // Reset previous selected item to prevent failing asserts mShopItemList->setSelected(-1); - mIncreaseButton->setEnabled(false); - mDecreaseButton->setEnabled(false); + + updateButtonsAndLabels(); } void SellDialog::addItem(Item *item, int price) @@ -162,25 +153,7 @@ void SellDialog::action(const gcn::ActionEvent &event) { mAmountItems = 0; mSlider->setValue(0); - mDecreaseButton->setEnabled(false); - mSellButton->setEnabled(false); - - mQuantityLabel->adjustSize(); - mMoneyLabel->setCaption("Money: 0 GP / Total: " - + toString(mPlayerMoney) + " GP"); - mMoneyLabel->adjustSize(); - - if (selectedItem > -1) { - mSlider->setEnabled(true); - mIncreaseButton->setEnabled(true); - mMaxItems = mShopItems->at(selectedItem).quantity; - mQuantityLabel->setCaption("0 / " + toString(mMaxItems)); - } else { - mSlider->setEnabled(false); - mIncreaseButton->setEnabled(false); - mQuantityLabel->setCaption("0"); - } - mQuantityLabel->adjustSize(); + updateButtonsAndLabels(); } else if (event.getId() == "quit") { @@ -189,40 +162,35 @@ void SellDialog::action(const gcn::ActionEvent &event) } // The following actions require a valid item selection - if (selectedItem == -1 || selectedItem >= int(mShopItems->getNumberOfElements())) { + if (selectedItem == -1 || + selectedItem >= (int) mShopItems->getNumberOfElements()) + { return; } - bool updateButtonsAndLabels = false; - - if (event.getId() == "mSlider") + if (event.getId() == "slider") { - mAmountItems = (int)(mSlider->getValue() * mMaxItems); - - updateButtonsAndLabels = true; + mAmountItems = (int) (mSlider->getValue() * mMaxItems); + updateButtonsAndLabels(); } - else if (event.getId() == "+") + else if (event.getId() == "+" && mAmountItems < mMaxItems) { - assert(mAmountItems < mMaxItems); mAmountItems++; - mSlider->setValue(double(mAmountItems)/double(mMaxItems)); - updateButtonsAndLabels = true; + mSlider->setValue((double) mAmountItems /(double) mMaxItems); + updateButtonsAndLabels(); } - else if (event.getId() == "-") + else if (event.getId() == "-" && mAmountItems > 0) { - assert(mAmountItems > 0); mAmountItems--; - mSlider->setValue(double(mAmountItems)/double(mMaxItems)); - - updateButtonsAndLabels = true; + mSlider->setValue((double) mAmountItems / (double) mMaxItems); + updateButtonsAndLabels(); } - else if (event.getId() == "sell") + else if (event.getId() == "sell" && mAmountItems > 0 + && mAmountItems <= mMaxItems) { // Attempt sell - assert(mAmountItems > 0 && mAmountItems <= mMaxItems); - // XXX Convert for new server /* MessageOut outMsg(CMSG_NPC_SELL_REQUEST); @@ -236,60 +204,77 @@ void SellDialog::action(const gcn::ActionEvent &event) mPlayerMoney += (mAmountItems * mShopItems->at(selectedItem).price); mAmountItems = 0; mSlider->setValue(0); - mSlider->setEnabled(mMaxItems != 0); - - // All were sold - if (!mMaxItems) { + if (!mMaxItems) + { + // All were sold mShopItemList->setSelected(-1); - mShopItems->getShop()->erase(mShopItems->getShop()->begin() + selectedItem); + mShopItems->getShop()->erase( + mShopItems->getShop()->begin() + selectedItem); + } + else + { + // Update only when there are items left, the entry doesn't exist + // otherwise and can't be updated + updateButtonsAndLabels(); } - - // Update only when there are items left, the entry doesn't exist - // otherwise and can't be updated - updateButtonsAndLabels = bool(mMaxItems); - } - - // If anything changed, we need to update the buttons and labels - if (updateButtonsAndLabels) - { - // Update labels - mQuantityLabel->setCaption(toString(mAmountItems) + " / " + toString(mMaxItems)); - mQuantityLabel->adjustSize(); - - int price = mAmountItems * mShopItems->at(selectedItem).price; - mMoneyLabel->setCaption("Money: " + toString(price) + " GP / Total: " - + toString(price + mPlayerMoney) + " GP"); - mMoneyLabel->adjustSize(); - - // Update Buttons - mSellButton->setEnabled(mAmountItems > 0); - mDecreaseButton->setEnabled(mAmountItems > 0); - mIncreaseButton->setEnabled(mAmountItems < mMaxItems); } } void SellDialog::selectionChanged(const SelectionEvent &event) +{ + // Reset amount of items and update labels + mAmountItems = 0; + mSlider->setValue(0); + + updateButtonsAndLabels(); +} + +void SellDialog::setMoney(int amount) +{ + mPlayerMoney = amount; + mShopItemList->setPlayersMoney(amount); +} + +void +SellDialog::updateButtonsAndLabels() { int selectedItem = mShopItemList->getSelected(); + int income = 0; if (selectedItem > -1) { - const ItemInfo &info = - ItemDB::get(mShopItems->at(selectedItem).id); + mMaxItems = mShopItems->at(selectedItem).quantity; + if (mAmountItems > mMaxItems) + { + mAmountItems = mMaxItems; + } + income = mAmountItems * mShopItems->at(selectedItem).price; + + const ItemInfo &info = ItemDB::get(mShopItems->at(selectedItem).id); mItemDescLabel->setCaption("Description: " + info.getDescription()); mItemEffectLabel->setCaption("Effect: " + info.getEffect()); } else { - mItemDescLabel->setCaption("Description"); - mItemEffectLabel->setCaption("Effect"); + mMaxItems = 0; + mAmountItems = 0; + mItemDescLabel->setCaption("Description:"); + mItemEffectLabel->setCaption("Effect:"); } -} -void SellDialog::setMoney(int amount) -{ - mPlayerMoney = amount; - mShopItemList->setPlayersMoney(amount); + // Update Buttons and slider + mSellButton->setEnabled(mAmountItems > 0); + mDecreaseButton->setEnabled(mAmountItems > 0); + mIncreaseButton->setEnabled(mAmountItems < mMaxItems); + mSlider->setEnabled(selectedItem > -1); + + // Update the quantity and money labels + mQuantityLabel->setCaption( + toString(mAmountItems) + " / " + toString(mMaxItems)); + mQuantityLabel->adjustSize(); + mMoneyLabel->setCaption("Money: " + toString(income) + " GP / Total: " + + toString(mPlayerMoney + income) + " GP"); + mMoneyLabel->adjustSize(); } diff --git a/src/gui/sell.h b/src/gui/sell.h index 68bd7b8b..b8385a6f 100644 --- a/src/gui/sell.h +++ b/src/gui/sell.h @@ -82,6 +82,12 @@ class SellDialog : public Window, gcn::ActionListener, SelectionListener */ void setMoney(int amount); + /** + * Updates the state of buttons and labels. + */ + void + updateButtonsAndLabels(); + private: gcn::Button *mSellButton; gcn::Button *mIncreaseButton; diff --git a/src/gui/updatewindow.cpp b/src/gui/updatewindow.cpp index d8130cd3..ed75e5b3 100644 --- a/src/gui/updatewindow.cpp +++ b/src/gui/updatewindow.cpp @@ -157,6 +157,7 @@ void UpdaterWindow::setLabel(const std::string &str) void UpdaterWindow::enable() { + mCancelButton->setEnabled(false); mPlayButton->setEnabled(true); mPlayButton->requestFocus(); } @@ -168,11 +169,7 @@ void UpdaterWindow::action(const gcn::ActionEvent &event) // Register the user cancel mUserCancel = true; // Skip the updating process - if (mDownloadStatus == UPDATE_COMPLETE) - { - state = STATE_EXIT; - } - else + if (mDownloadStatus != UPDATE_COMPLETE) { mDownloadStatus = UPDATE_ERROR; } diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index f3e9031c..2af1d960 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -41,10 +41,13 @@ #include "../resources/animation.h" #include "../resources/monsterinfo.h" #include "../resources/resourcemanager.h" +#include "../resources/image.h" #include "../resources/imageset.h" #include "../utils/tostring.h" +#include + Viewport::Viewport(): mMap(0), mViewX(0.0f), @@ -67,37 +70,62 @@ Viewport::Viewport(): mPopupMenu = new PopupMenu(); // Load target cursors + loadTargetCursor("graphics/gui/target-cursor-blue-s.png", 44, 35, + false, Being::TC_SMALL); + loadTargetCursor("graphics/gui/target-cursor-red-s.png", 44, 35, + true, Being::TC_SMALL); + loadTargetCursor("graphics/gui/target-cursor-blue-m.png", 62, 44, + false, Being::TC_MEDIUM); + loadTargetCursor("graphics/gui/target-cursor-red-m.png", 62, 44, + true, Being::TC_MEDIUM); + loadTargetCursor("graphics/gui/target-cursor-blue-l.png", 82, 60, + false, Being::TC_LARGE); + loadTargetCursor("graphics/gui/target-cursor-red-l.png", 82, 60, + true, Being::TC_LARGE); +} + +void +Viewport::loadTargetCursor(std::string filename, int width, int height, + bool outRange, Being::TargetCursorSize size) +{ + assert(size > -1); + assert(size < 3); + + ImageSet* currentImageSet; + SimpleAnimation* currentCursor; + ResourceManager *resman = ResourceManager::getInstance(); - mInRangeImages = resman->getImageSet( - "graphics/gui/target-cursor-blue.png", 44, 35); - mOutRangeImages = resman->getImageSet( - "graphics/gui/target-cursor-red.png", 44, 35); - Animation *animInRange = new Animation(); - Animation *animOutRange = new Animation(); - - for (unsigned int i = 0; i < mInRangeImages->size(); ++i) + + currentImageSet = resman->getImageSet(filename, width, height); + Animation *anim = new Animation(); + for (unsigned int i = 0; i < currentImageSet->size(); ++i) { - animInRange->addFrame(mInRangeImages->get(i), 75, 0, 0); + anim->addFrame(currentImageSet->get(i), 75, 0, 0); } + currentCursor = new SimpleAnimation(anim); - for (unsigned int j = 0; j < mOutRangeImages->size(); ++j) + if (outRange) { - animOutRange->addFrame(mOutRangeImages->get(j), 75, 0, 0); + mOutRangeImages[size] = currentImageSet; + mTargetCursorOutRange[size] = currentCursor; + } + else { + mInRangeImages[size] = currentImageSet; + mTargetCursorInRange[size] = currentCursor; } - - mTargetCursorInRange = new SimpleAnimation(animInRange); - mTargetCursorOutRange = new SimpleAnimation(animOutRange); } Viewport::~Viewport() { delete mPopupMenu; - delete mTargetCursorInRange; - delete mTargetCursorOutRange; - - mInRangeImages->decRef(); - mOutRangeImages->decRef(); + for (int i = Being::TC_SMALL; i < Being::NUM_TC; i++) + { + delete mTargetCursorInRange[i]; + delete mTargetCursorOutRange[i]; + mInRangeImages[i]->decRef(); + mOutRangeImages[i]->decRef(); + } } void @@ -259,8 +287,11 @@ Viewport::logic() mWalkTime = player_node->mWalkTime; } - mTargetCursorInRange->update(10); - mTargetCursorOutRange->update(10); + for (int i = 0; i < 3; i++) + { + mTargetCursorInRange[i]->update(10); + mTargetCursorOutRange[i]->update(10); + } } void @@ -270,26 +301,31 @@ Viewport::drawTargetCursor(Graphics *graphics) Being *target = player_node->getTarget(); if (target) { + // Calculate target circle position + // Find whether target is in range int rangeX = abs(target->mX - player_node->mX); int rangeY = abs(target->mY - player_node->mY); int attackRange = player_node->getAttackRange(); - // Draw the target cursor, which one depends if the target is in range + // Get the correct target cursors graphic + Being::TargetCursorSize cursorSize = target->getTargetCursorSize(); + Image* targetCursor; if (rangeX > attackRange || rangeY > attackRange) { - // Draw the out of range cursor - graphics->drawImage(mTargetCursorOutRange->getCurrentImage(), - target->getPixelX() - mCameraX, - target->getPixelY() - mCameraY); + targetCursor = mTargetCursorOutRange[cursorSize]->getCurrentImage(); } - else - { - // Draw the in range cursor - graphics->drawImage(mTargetCursorInRange->getCurrentImage(), - target->getPixelX() - mCameraX, - target->getPixelY() - mCameraY); + else { + targetCursor = mTargetCursorInRange[cursorSize]->getCurrentImage(); } + + // Draw the target cursor at the correct position + int posX = target->getPixelX() + 16 - + targetCursor->getWidth() / 2 - mCameraX; + int posY = target->getPixelY() + 16 - + targetCursor->getHeight() / 2 - mCameraY; + + graphics->drawImage(targetCursor, posX, posY); } } @@ -304,10 +340,10 @@ Viewport::drawTargetName(Graphics *graphics) graphics->setColor(gcn::Color(255, 32, 32)); const MonsterInfo &mi = static_cast(target)->getInfo(); - graphics->drawText(mi.getName(), - target->getPixelX() - mCameraX + 15, - target->getPixelY() - mCameraY - 42, - gcn::Graphics::CENTER); + int posX = target->getPixelX() + 16 - mCameraX; + int posY = target->getPixelY() + 16 - target->getHeight() - mCameraY; + + graphics->drawText(mi.getName(), posX, posY, gcn::Graphics::CENTER); } } diff --git a/src/gui/viewport.h b/src/gui/viewport.h index 84efeff3..22d0f249 100644 --- a/src/gui/viewport.h +++ b/src/gui/viewport.h @@ -29,9 +29,9 @@ #include "windowcontainer.h" #include "../configlistener.h" +#include "../being.h" class Map; -class Being; class FloorItem; class ImageSet; class Item; @@ -141,6 +141,13 @@ class Viewport : public WindowContainer, public gcn::MouseListener, */ void showPopup(int x, int y, Being *being); + /** + * Helper function for loading target cursors + */ + void + loadTargetCursor(std::string filename, int width, int height, + bool outRange, Being::TargetCursorSize size); + /** * Draws range based target cursor */ @@ -164,14 +171,17 @@ class Viewport : public WindowContainer, public gcn::MouseListener, int mCameraY; /**< Current viewpoint in tiles. */ bool mShowDebugPath; /**< Show a path from player to pointer. */ - ImageSet *mInRangeImages; /**< Images of in range target cursor. */ - ImageSet *mOutRangeImages; /**< Images of out of range target cursor.*/ + /** Images of in range target cursor. */ + ImageSet *mInRangeImages[Being::NUM_TC]; + + /** Images of out of range target cursor. */ + ImageSet *mOutRangeImages[Being::NUM_TC]; /** Animated in range target cursor. */ - SimpleAnimation *mTargetCursorInRange; + SimpleAnimation *mTargetCursorInRange[Being::NUM_TC]; /** Animated out of range target cursor. */ - SimpleAnimation *mTargetCursorOutRange; + SimpleAnimation *mTargetCursorOutRange[Being::NUM_TC]; bool mPlayerFollowMouse; int mWalkTime; diff --git a/src/gui/widgets/resizegrip.cpp b/src/gui/widgets/resizegrip.cpp new file mode 100644 index 00000000..50a6fce4 --- /dev/null +++ b/src/gui/widgets/resizegrip.cpp @@ -0,0 +1,65 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "resizegrip.h" + +#include + +#include "../../graphics.h" + +#include "../../resources/image.h" +#include "../../resources/resourcemanager.h" + +Image *ResizeGrip::gripImage = 0; +int ResizeGrip::mInstances = 0; + +ResizeGrip::ResizeGrip() +{ + if (mInstances == 0) + { + // Load the grip image + ResourceManager *resman = ResourceManager::getInstance(); + gripImage = resman->getImage("graphics/gui/resize.png"); + } + + mInstances++; + + setWidth(gripImage->getWidth() + 2); + setHeight(gripImage->getHeight() + 2); +} + +ResizeGrip::~ResizeGrip() +{ + mInstances--; + + if (mInstances == 0) + { + gripImage->decRef(); + } +} + +void +ResizeGrip::draw(gcn::Graphics *graphics) +{ + dynamic_cast(graphics)->drawImage(gripImage, 0, 0); +} diff --git a/src/gui/widgets/resizegrip.h b/src/gui/widgets/resizegrip.h new file mode 100644 index 00000000..04be3db3 --- /dev/null +++ b/src/gui/widgets/resizegrip.h @@ -0,0 +1,61 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_RESIZEGRIP_H +#define _TMW_RESIZEGRIP_H + +#include + +class Image; + +/** + * Resize grip. The resize grip is part of a resizable Window. It relies on the + * fact that uncaught mouse events are automatically routed to the parent + * window. + * + * \ingroup GUI + */ +class ResizeGrip : public gcn::Widget +{ + public: + /** + * Constructor. + */ + ResizeGrip(); + + /** + * Destructor. + */ + ~ResizeGrip(); + + /** + * Draws the resize grip. + */ + void draw(gcn::Graphics *graphics); + + private: + static Image *gripImage; /**< Resize grip image */ + static int mInstances; /**< Number of resize grip instances */ +}; + +#endif diff --git a/src/gui/window.cpp b/src/gui/window.cpp index bb60c6ff..8a052bba 100644 --- a/src/gui/window.cpp +++ b/src/gui/window.cpp @@ -24,10 +24,13 @@ #include "window.h" #include +#include #include "gccontainer.h" #include "windowcontainer.h" +#include "widgets/resizegrip.h" + #include "../configlistener.h" #include "../configuration.h" #include "../graphics.h" @@ -36,11 +39,10 @@ #include "../resources/image.h" #include "../resources/resourcemanager.h" -ConfigListener *Window::windowConfigListener = NULL; -WindowContainer *Window::windowContainer = NULL; +ConfigListener *Window::windowConfigListener = 0; +WindowContainer *Window::windowContainer = 0; int Window::instances = 0; ImageRect Window::border; -Image *Window::resizeGrip; class WindowConfigListener : public ConfigListener { @@ -54,16 +56,16 @@ class WindowConfigListener : public ConfigListener Window::Window(const std::string& caption, bool modal, Window *parent): gcn::Window(caption), + mGrip(0), mParent(parent), mWindowName("window"), - mSnapSize(8), mShowTitle(true), mModal(modal), mResizable(false), - mMouseResize(false), + mMouseResize(0), mSticky(false), mMinWinWidth(100), - mMinWinHeight(28), + mMinWinHeight(40), mMaxWinWidth(INT_MAX), mMaxWinHeight(INT_MAX) { @@ -87,7 +89,6 @@ Window::Window(const std::string& caption, bool modal, Window *parent): border.grid[6] = dBorders->getSubImage(0, 15, 4, 4); border.grid[7] = dBorders->getSubImage(4, 15, 3, 4); border.grid[8] = dBorders->getSubImage(7, 15, 4, 4); - resizeGrip = resman->getImage("graphics/gui/resize.png"); dBorders->decRef(); windowConfigListener = new WindowConfigListener(); // Send GUI alpha changed for initialization @@ -151,10 +152,10 @@ Window::~Window() delete border.grid[6]; delete border.grid[7]; delete border.grid[8]; - resizeGrip->decRef(); } delete mChrome; + delete mGrip; } void Window::setWindowContainer(WindowContainer *wc) @@ -162,22 +163,15 @@ void Window::setWindowContainer(WindowContainer *wc) windowContainer = wc; } -void Window::draw(gcn::Graphics* graphics) +void Window::draw(gcn::Graphics *graphics) { - Graphics *g = (Graphics*)graphics; + Graphics *g = static_cast(graphics); g->drawImageRect(0, 0, getWidth(), getHeight(), border); - // Draw grip - if (mResizable) - { - g->drawImage(Window::resizeGrip, - getWidth() - resizeGrip->getWidth(), - getHeight() - resizeGrip->getHeight()); - } - // Draw title - if (mShowTitle) { + if (mShowTitle) + { graphics->setFont(getFont()); graphics->drawText(getCaption(), 7, 5, gcn::Graphics::LEFT); } @@ -188,13 +182,13 @@ void Window::draw(gcn::Graphics* graphics) void Window::setContentWidth(int width) { mChrome->setWidth(width); - resizeToContent(); + setWidth(width + 2 * getPadding()); } void Window::setContentHeight(int height) { mChrome->setHeight(height); - resizeToContent(); + setHeight(height + getPadding() + getTitleBarHeight()); } void Window::setContentSize(int width, int height) @@ -203,6 +197,37 @@ void Window::setContentSize(int width, int height) setContentHeight(height); } +void Window::setWidth(int width) +{ + gcn::Window::setWidth(width); + + if (mGrip) + { + mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x); + } +} + +void Window::setHeight(int height) +{ + gcn::Window::setHeight(height); + + if (mGrip) + { + mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y); + } +} + +void Window::setDimension(const gcn::Rectangle &dimension) +{ + gcn::Window::setDimension(dimension); + + if (mGrip) + { + mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x); + mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y); + } +} + void Window::setLocationRelativeTo(gcn::Widget *widget) { int wx, wy; @@ -238,6 +263,19 @@ void Window::setMaxHeight(unsigned int height) void Window::setResizable(bool r) { mResizable = r; + + if (mResizable) + { + mGrip = new ResizeGrip(); + mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x); + mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y); + gcn::Window::add(mGrip); + } + else + { + delete mGrip; + mGrip = 0; + } } bool Window::isResizable() @@ -287,15 +325,27 @@ void Window::mousePressed(gcn::MouseEvent &event) // Let Guichan move window to top and figure out title bar drag gcn::Window::mousePressed(event); - int x = event.getX(); - int y = event.getY(); + const int x = event.getX(); + const int y = event.getY(); + mMouseResize = 0; - // Activate resizing if the left mouse button was pressed on the grip - mMouseResize = - isResizable() && - event.getButton() == gcn::MouseEvent::LEFT && - getGripDimension().isPointInRect(x, y) && - !getChildrenArea().isPointInRect(x, y); + // Activate resizing handles as appropriate + if (event.getSource() == this && isResizable() && + event.getButton() == gcn::MouseEvent::LEFT && + !getChildrenArea().isPointInRect(x, y)) + { + mMouseResize |= (x > getWidth() - resizeBorderWidth) ? RIGHT : + (x < resizeBorderWidth) ? LEFT : 0; + mMouseResize |= (y > getHeight() - resizeBorderWidth) ? BOTTOM : + (y < resizeBorderWidth) ? TOP : 0; + } + else if (event.getSource() == mGrip) + { + mDragOffsetX = x + mGrip->getX(); + mDragOffsetY = y + mGrip->getY(); + mMouseResize |= BOTTOM | RIGHT; + mIsMoving = false; + } } void Window::mouseDragged(gcn::MouseEvent &event) @@ -303,20 +353,47 @@ void Window::mouseDragged(gcn::MouseEvent &event) // Let Guichan handle title bar drag gcn::Window::mouseDragged(event); - // Keep guichan window inside screen - int newX = std::max(0, getX()); - int newY = std::max(0, getY()); - newX = std::min(windowContainer->getWidth() - getWidth(), newX); - newY = std::min(windowContainer->getHeight() - getHeight(), newY); - setPosition(newX, newY); + // Keep guichan window inside screen when it may be moved + if (isMovable() && mIsMoving) + { + int newX = std::max(0, getX()); + int newY = std::max(0, getY()); + newX = std::min(windowContainer->getWidth() - getWidth(), newX); + newY = std::min(windowContainer->getHeight() - getHeight(), newY); + setPosition(newX, newY); + } if (mMouseResize && !mIsMoving) { + const int dx = event.getX() - mDragOffsetX + + ((event.getSource() == mGrip) ? mGrip->getX() : 0); + const int dy = event.getY() - mDragOffsetY + + ((event.getSource() == mGrip) ? mGrip->getY() : 0); gcn::Rectangle newDim = getDimension(); - // We're dragging bottom right - newDim.width += event.getX() - mDragOffsetX; - newDim.height += event.getY() - mDragOffsetY; + if (mMouseResize & (TOP | BOTTOM)) + { + int newHeight = newDim.height + ((mMouseResize & TOP) ? -dy : dy); + newDim.height = std::min(mMaxWinHeight, + std::max(mMinWinHeight, newHeight)); + + if (mMouseResize & TOP) + { + newDim.y -= newDim.height - getHeight(); + } + } + + if (mMouseResize & (LEFT | RIGHT)) + { + int newWidth = newDim.width + ((mMouseResize & LEFT) ? -dx : dx); + newDim.width = std::min(mMaxWinWidth, + std::max(mMinWinWidth, newWidth)); + + if (mMouseResize & LEFT) + { + newDim.x -= newDim.width - getWidth(); + } + } // Keep guichan window inside screen (supports resizing any side) if (newDim.x < 0) @@ -338,29 +415,16 @@ void Window::mouseDragged(gcn::MouseEvent &event) newDim.height = windowContainer->getHeight() - newDim.y; } - // Keep the window at least its minimum size - if (newDim.width < mMinWinWidth) - { - newDim.width = mMinWinWidth; - } - else if (newDim.width > mMaxWinWidth) - { - newDim.width = mMaxWinWidth; - } - - if (newDim.height < mMinWinHeight) + // Update mouse offset when dragging bottom or right border + if (mMouseResize & BOTTOM) { - newDim.height = mMinWinHeight; + mDragOffsetY += newDim.height - getHeight(); } - else if (newDim.height > mMaxWinHeight) + if (mMouseResize & RIGHT) { - newDim.height = mMaxWinHeight; + mDragOffsetX += newDim.width - getWidth(); } - // Update mouse offset when dragging bottom or right border - mDragOffsetX += newDim.width - getWidth(); - mDragOffsetY += newDim.height - getHeight(); - // Set the new window and content dimensions setDimension(newDim); const gcn::Rectangle area = getChildrenArea(); @@ -368,15 +432,6 @@ void Window::mouseDragged(gcn::MouseEvent &event) } } -gcn::Rectangle -Window::getGripDimension() -{ - return gcn::Rectangle(getWidth() - resizeGrip->getWidth(), - getHeight() - resizeGrip->getHeight(), - getWidth(), - getHeight()); -} - void Window::loadWindowState() { diff --git a/src/gui/window.h b/src/gui/window.h index 31c260cf..03248908 100644 --- a/src/gui/window.h +++ b/src/gui/window.h @@ -30,11 +30,10 @@ class ConfigListener; class GCContainer; -class Image; class ImageRect; +class ResizeGrip; class WindowContainer; - /** * A window. This window can be dragged around and has a title bar. Windows are * invisible by default. @@ -99,6 +98,21 @@ class Window : public gcn::Window */ void setContentSize(int width, int height); + /** + * Sets the width of this window. + */ + void setWidth(int width); + + /** + * Sets the height of this window. + */ + void setHeight(int height); + + /** + * Sets the position and size of this window. + */ + void setDimension(const gcn::Rectangle &dimension); + /** * Sets the location relative to the given widget. */ @@ -168,16 +182,15 @@ class Window : public gcn::Window void scheduleDelete(); /** - * Window dragging and resizing mouse related. These methods also makes - * sure the window is not dragged/resized outside of the screen. + * Starts window resizing when appropriate. */ void mousePressed(gcn::MouseEvent &event); - void mouseDragged(gcn::MouseEvent &event); /** - * Gets the position of the resize grip. + * Implements window resizing and makes sure the window is not + * dragged/resized outside of the screen. */ - gcn::Rectangle getGripDimension(); + void mouseDragged(gcn::MouseEvent &event); /** * Sets the name of the window. This is not the window title. @@ -214,37 +227,50 @@ class Window : public gcn::Window */ virtual void resetToDefaultSize(); + enum ResizeHandles + { + TOP = 0x01, + RIGHT = 0x02, + BOTTOM = 0x04, + LEFT = 0x08 + }; + protected: - GCContainer *mChrome; /**< Contained container */ + GCContainer *mChrome; /**< Contained container */ + ResizeGrip *mGrip; /**< Resize grip */ Window *mParent; /**< The parent window */ std::string mWindowName; /**< Name of the window */ - int mSnapSize; /**< Snap distance to window edge */ bool mShowTitle; /**< Window has a title bar */ bool mModal; /**< Window is modal */ - bool mResizable; /**< Window can be resized */ - bool mMouseResize; /**< Window is being resized */ - bool mSticky; /**< Window resists minimzation */ - int mMinWinWidth; /**< Minimum window width */ - int mMinWinHeight; /**< Minimum window height */ - int mMaxWinWidth; /**< Maximum window width */ - int mMaxWinHeight; /**< Maximum window height */ + bool mResizable; /**< Window can be resized */ + int mMouseResize; /**< Window is being resized */ + bool mSticky; /**< Window resists minimization */ + int mMinWinWidth; /**< Minimum window width */ + int mMinWinHeight; /**< Minimum window height */ + int mMaxWinWidth; /**< Maximum window width */ + int mMaxWinHeight; /**< Maximum window height */ int mDefaultX; /**< Default window X position */ int mDefaultY; /**< Default window Y position */ int mDefaultWidth; /**< Default window width */ int mDefaultHeight; /**< Default window height */ /** The window container windows add themselves to. */ - static WindowContainer* windowContainer; + static WindowContainer *windowContainer; /** - * The config listener that listens to changes relevant to all - * windows + * The config listener that listens to changes relevant to all windows. */ static ConfigListener *windowConfigListener; static int instances; /**< Number of Window instances */ static ImageRect border; /**< The window border and background */ - static Image *resizeGrip; /**< The grip to resize window */ + + /** + * The width of the resize border. Is independent of the actual window + * border width, and determines mostly the size of the corner area + * where two borders are moved at the same time. + */ + static const int resizeBorderWidth = 10; }; #endif diff --git a/src/imageparticle.cpp b/src/imageparticle.cpp new file mode 100644 index 00000000..35cc21ad --- /dev/null +++ b/src/imageparticle.cpp @@ -0,0 +1,69 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "imageparticle.h" + +#include "graphics.h" + +#include "resources/image.h" + +ImageParticle::ImageParticle(Map *map, Image *image): + Particle(map), + mImage(image) +{ + mImage->incRef(); +} + +ImageParticle::~ImageParticle() +{ + mImage->decRef(); +} + +void ImageParticle::draw(Graphics *graphics, int offsetX, int offsetY) const +{ + if (!mAlive) + return; + + int screenX = (int) mPosX + offsetX - mImage->getWidth() / 2; + int screenY = (int) mPosY - (int) mPosZ + offsetY - mImage->getHeight()/2; + + // Check if on screen + if (screenX + mImage->getWidth() < 0 || + screenX > graphics->getWidth() || + screenY + mImage->getHeight() < 0 || + screenY > graphics->getHeight()) + { + return; + } + + float alphafactor = 1.0f; + + if (mLifetimeLeft > -1 && mLifetimeLeft < mFadeOut) + alphafactor *= (float) mLifetimeLeft / (float) mFadeOut; + + if (mLifetimePast < mFadeIn) + alphafactor *= (float) mLifetimePast / (float) mFadeIn; + + mImage->setAlpha(alphafactor); + graphics->drawImage(mImage, screenX, screenY); +} diff --git a/src/imageparticle.h b/src/imageparticle.h new file mode 100644 index 00000000..0ad515cc --- /dev/null +++ b/src/imageparticle.h @@ -0,0 +1,61 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _IMAGEPARTICLE_H +#define _IMAGEPARTICLE_H + +#include "particle.h" + +class Image; +class Map; + +/** + * A particle that uses an image for its visualization. + */ +class ImageParticle : public Particle +{ + public: + /** + * Constructor. The image is reference counted by this particle. + * + * @param map the map this particle appears on + * @param image an Image instance, may not be NULL + */ + ImageParticle(Map *map, Image *image); + + /** + * Destructor. + */ + ~ImageParticle(); + + /** + * Draws the particle image + */ + virtual void + draw(Graphics *graphics, int offsetX, int offsetY) const; + + protected: + Image *mImage; /**< The image used for this particle. */ +}; + +#endif diff --git a/src/main.cpp b/src/main.cpp index bbbf0fd1..58c563ab 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -40,7 +40,7 @@ #include -#if (defined __USE_UNIX98 || defined __FreeBSD__ || defined __APPLE__) +#ifndef WIN32 #include #include #endif @@ -148,21 +148,21 @@ struct Options */ void initHomeDir() { -#if !(defined __USE_UNIX98 || defined __FreeBSD__ || defined __APPLE__) - homeDir = "."; -#else homeDir = std::string(PHYSFS_getUserDir()) + "/.tmw"; - +#if defined WIN32 + if (!CreateDirectory(homeDir.c_str(), 0) && + GetLastError() != ERROR_ALREADY_EXISTS) +#else // Checking if /home/user/.tmw folder exists. if ((mkdir(homeDir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) && (errno != EEXIST)) +#endif { std::cout << homeDir - << " can't be made, but it doesn't exist! Exiting." + << " can't be created, but it doesn't exist! Exiting." << std::endl; exit(1); } -#endif } /** @@ -236,11 +236,17 @@ void initEngine() static SDL_SysWMinfo pInfo; SDL_GetWMInfo(&pInfo); HICON icon = LoadIcon(GetModuleHandle(NULL), "A"); - SetClassLong(pInfo.window, GCL_HICON, (LONG) icon); + if (icon) + { + SetClassLong(pInfo.window, GCL_HICON, (LONG) icon); + } #else SDL_Surface *icon = IMG_Load(TMW_DATADIR "data/icons/tmw.png"); - SDL_SetAlpha(icon, SDL_SRCALPHA, SDL_ALPHA_OPAQUE); - SDL_WM_SetIcon(icon, NULL); + if (icon) + { + SDL_SetAlpha(icon, SDL_SRCALPHA, SDL_ALPHA_OPAQUE); + SDL_WM_SetIcon(icon, NULL); + } #endif ResourceManager *resman = ResourceManager::getInstance(); diff --git a/src/map.cpp b/src/map.cpp index a6beb951..ac570627 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -29,6 +29,7 @@ #include "beingmanager.h" #include "game.h" #include "graphics.h" +#include "particle.h" #include "sprite.h" #include "tileset.h" @@ -530,3 +531,25 @@ Map::findPath(int startX, int startY, int destX, int destY) return path; } + +void +Map::addParticleEffect (std::string effectFile, int x, int y) +{ + ParticleEffectData newEffect; + newEffect.file = effectFile; + newEffect.x = x; + newEffect.y = y; + particleEffects.push_back(newEffect); +} + +void +Map::initializeParticleEffects(Particle* particleEngine) +{ + for (std::list::iterator i = particleEffects.begin(); + i != particleEffects.end(); + i++ + ) + { + particleEngine->addEffect(i->file, i->x, i->y); + } +} diff --git a/src/map.h b/src/map.h index c8a6fdb3..17772847 100644 --- a/src/map.h +++ b/src/map.h @@ -32,8 +32,9 @@ class AmbientOverlay; class Graphics; class Image; -class Tileset; +class Particle; class Sprite; +class Tileset; struct PATH_NODE; @@ -185,6 +186,17 @@ class Map : public Properties void removeSprite(SpriteIterator iterator); + /** + * Adds a particle effect + */ + void addParticleEffect (std::string effectFile, int x, int y); + + /** + * Initializes all added particle effects + */ + void + initializeParticleEffects(Particle* particleEngine); + private: /** * Converts a global tile id to the Image* pointing to the associated @@ -220,10 +232,19 @@ class Map : public Properties // Pathfinding members int mOnClosedList, mOnOpenList; - //overlay Data + // Overlay Data std::list mOverlays; float mLastScrollX; float mLastScrollY; + + // Particle effect data + struct ParticleEffectData + { + std::string file; + int x; + int y; + }; + std::list particleEffects; }; #endif diff --git a/src/monster.cpp b/src/monster.cpp index bea5b7a5..768bf16a 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -93,6 +93,12 @@ Monster::handleAttack() sound.playSfx(mi.getSound(EVENT_HIT)); } +Being::TargetCursorSize +Monster::getTargetCursorSize() const +{ + return getInfo().getTargetCursorSize(); +} + const MonsterInfo& Monster::getInfo() const { diff --git a/src/monster.h b/src/monster.h index 39bbf3d7..4915520d 100644 --- a/src/monster.h +++ b/src/monster.h @@ -37,6 +37,9 @@ class Monster : public Being virtual Type getType() const; + virtual TargetCursorSize + getTargetCursorSize() const; + /** * Handles an attack of another being by this monster. Plays a hit or * miss sound when appropriate. diff --git a/src/net/beinghandler.cpp b/src/net/beinghandler.cpp index 53746671..f82a0fa8 100644 --- a/src/net/beinghandler.cpp +++ b/src/net/beinghandler.cpp @@ -34,6 +34,7 @@ #include "../localplayer.h" #include "../log.h" #include "../main.h" +#include "../particle.h" #include "../sound.h" const int EMOTION_TIME = 150; /**< Duration of emotion icon */ @@ -240,13 +241,23 @@ void BeingHandler::handleMessage(MessageIn &msg) break; case SMSG_BEING_LEVELUP: - if ((Uint32) msg.readLong() == player_node->getId()) { + id = (Uint32) msg->readLong(); + + if (id == player_node->getId()) { logger->log("Level up"); sound.playSfx("sfx/levelup.ogg"); - } else { + } + else { logger->log("Someone else went level up"); } - msg.readLong(); // type + Particle *levelupFX; + if (msg->readLong() == 0) { // type + levelupFX = particleEngine->addEffect("graphics/particles/levelup.particle.xml", 0, 0); + } + else { + levelupFX = particleEngine->addEffect("graphics/particles/skillup.particle.xml", 0, 0); + } + beingManager->findBeing(id)->controlParticle(levelupFX); break; case SMSG_BEING_EMOTION: diff --git a/src/openglgraphics.cpp b/src/openglgraphics.cpp index ec6c1ee3..f4cda0b9 100644 --- a/src/openglgraphics.cpp +++ b/src/openglgraphics.cpp @@ -261,7 +261,7 @@ void OpenGLGraphics::drawPoint(int x, int y) setTexturingAndBlending(false); glBegin(GL_POINTS); - glVertex3i(x, y, 0); + glVertex2i(x, y); glEnd(); } @@ -270,12 +270,12 @@ void OpenGLGraphics::drawLine(int x1, int y1, int x2, int y2) setTexturingAndBlending(false); glBegin(GL_LINES); - glVertex3f(x1 + 0.5f, y1 + 0.5f, 0); - glVertex3f(x2 + 0.5f, y2 + 0.5f, 0); + glVertex2f(x1 + 0.5f, y1 + 0.5f); + glVertex2f(x2 + 0.5f, y2 + 0.5f); glEnd(); glBegin(GL_POINTS); - glVertex3f(x2 + 0.5f, y2 + 0.5f, 0); + glVertex2f(x2 + 0.5f, y2 + 0.5f); glEnd(); } @@ -329,10 +329,10 @@ void OpenGLGraphics::drawRectangle(const gcn::Rectangle& rect, bool filled) setTexturingAndBlending(false); glBegin(filled ? GL_QUADS : GL_LINE_LOOP); - glVertex3f(rect.x + offset, rect.y + offset, 0); - glVertex3f(rect.x + rect.width - offset, rect.y + offset, 0); - glVertex3f(rect.x + rect.width - offset, rect.y + rect.height - offset, 0); - glVertex3f(rect.x + offset, rect.y + rect.height - offset, 0); + glVertex2f(rect.x + offset, rect.y + offset); + glVertex2f(rect.x + rect.width - offset, rect.y + offset); + glVertex2f(rect.x + rect.width - offset, rect.y + rect.height - offset); + glVertex2f(rect.x + offset, rect.y + rect.height - offset); glEnd(); } @@ -344,16 +344,16 @@ void OpenGLGraphics::drawTexedQuad(int x, int y, int w, int h, // Draw a textured quad glBegin(GL_QUADS); glTexCoord2f(texX1, texY1); - glVertex3i(x, y, 0); + glVertex2i(x, y); glTexCoord2f(texX2, texY1); - glVertex3i(x + w, y, 0); + glVertex2i(x + w, y); glTexCoord2f(texX2, texY2); - glVertex3i(x + w, y + h, 0); + glVertex2i(x + w, y + h); glTexCoord2f(texX1, texY2); - glVertex3i(x, y + h, 0); + glVertex2i(x, y + h); glEnd(); } diff --git a/src/particle.cpp b/src/particle.cpp new file mode 100644 index 00000000..509c20ee --- /dev/null +++ b/src/particle.cpp @@ -0,0 +1,370 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "particle.h" + +#include + +#include "animationparticle.h" +#include "configuration.h" +#include "imageparticle.h" +#include "log.h" +#include "map.h" +#include "particleemitter.h" +#include "textparticle.h" + +#include "resources/resourcemanager.h" + +#include "utils/dtor.h" +#include "utils/fastsqrt.h" +#include "utils/xml.h" + +class Graphics; +class Image; + +int Particle::particleCount = 0; +int Particle::maxCount = 0; +int Particle::fastPhysics = 0; +int Particle::emitterSkip = 1; +const float Particle::PARTICLE_SKY = 800.0f; + +Particle::Particle(Map *map): + mAlive(true), + mPosX(0.0f), mPosY(0.0f), mPosZ(0.0f), + mLifetimeLeft(-1), + mLifetimePast(0), + mFadeOut(0), + mFadeIn(0), + mAutoDelete(true), + mMap(map), + mVectorX(0.0f), mVectorY(0.0f), mVectorZ(0.0f), + mGravity(0.0f), + mRandomnes(0), + mBounce(0.0f), + mTarget(NULL), + mAcceleration(0.0f), + mInvDieDistance(-1.0f), + mMomentum(1.0f) +{ + Particle::particleCount++; + if (mMap) setSpriteIterator(mMap->addSprite(this)); +} + + +void +Particle::setupEngine() +{ + Particle::maxCount = (int)config.getValue("particleMaxCount", 3000); + Particle::fastPhysics = (int)config.getValue("particleFastPhysics", 0); + Particle::emitterSkip = (int)config.getValue("particleEmitterSkip", 0) + 1; + disableAutoDelete(); + logger->log("Particle engine set up"); +} + +bool +Particle::update() +{ + if (!mMap) return false; + + if (mLifetimeLeft == 0) + { + mAlive = false; + } + + if (mAlive) + { + // Update child emitters + if (mLifetimePast%Particle::emitterSkip == 0) + { + for ( EmitterIterator e = mChildEmitters.begin(); + e != mChildEmitters.end(); + e++ + ) + { + Particles newParticles = (*e)->createParticles(); + for ( ParticleIterator p = newParticles.begin(); + p != newParticles.end(); + p++ + ) + { + (*p)->moveBy(mPosX, mPosY, mPosZ); + mChildParticles.push_back (*p); + } + } + } + + if (mMomentum != 1.0f) + { + mVectorX *= mMomentum; + mVectorY *= mMomentum; + mVectorZ *= mMomentum; + } + + if (mTarget && mAcceleration != 0.0f) + { + float distX = mPosX - mTarget->getPosX(); + float distY = mPosY - mTarget->getPosY(); + float distZ = mPosZ - mTarget->getPosZ(); + float invHypotenuse; + + switch(Particle::fastPhysics) + { + case 1: + invHypotenuse = fastInvSqrt( + distX * distX + distY * distY + distZ * distZ); + break; + case 2: + invHypotenuse = 2.0f / + fabs(distX) + fabs(distY) + fabs(distZ); + break; + default: + invHypotenuse = 1.0f / sqrt( + distX * distX + distY * distY + distZ * distZ); + break; + } + + if (invHypotenuse) + { + if (mInvDieDistance > 0.0f && invHypotenuse > mInvDieDistance) + { + mAlive = false; + } + float accFactor = invHypotenuse * mAcceleration; + mVectorX -= distX * accFactor; + mVectorY -= distY * accFactor; + mVectorZ -= distZ * accFactor; + } + } + + if (mRandomnes > 0) + { + mVectorX += (rand()%mRandomnes - rand()%mRandomnes) / 1000.0f; + mVectorY += (rand()%mRandomnes - rand()%mRandomnes) / 1000.0f; + mVectorZ += (rand()%mRandomnes - rand()%mRandomnes) / 1000.0f; + } + + mVectorZ -= mGravity; + + // Update position + mPosX += mVectorX; + mPosY += mVectorY; + mPosZ += mVectorZ; + + // Update other stuff + if (mLifetimeLeft > 0) + { + mLifetimeLeft--; + } + mLifetimePast++; + + if (mPosZ > PARTICLE_SKY || mPosZ < 0.0f) + { + if (mBounce > 0.0f) + { + mPosZ *= -mBounce; + mVectorX *= mBounce; + mVectorY *= mBounce; + mVectorZ *= -mBounce; + } + else { + mAlive = false; + } + } + } + + // Update child particles + for ( ParticleIterator p = mChildParticles.begin(); + p != mChildParticles.end(); + + ) + { + if ((*p)->update()) + { + p++; + } else { + delete (*p); + p = mChildParticles.erase(p); + } + } + + if (!mAlive && mChildParticles.empty() && mAutoDelete) + { + return false; + } + + return true; +} + + +void Particle::draw(Graphics *graphics, int offsetX, int offsetY) const +{ +} + + +Particle* +Particle::addEffect(std::string particleEffectFile, int pixelX, int pixelY) +{ + Particle *newParticle = NULL; + + // XML parser initialisation stuff + int size; + ResourceManager *resman = ResourceManager::getInstance(); + char *data = (char*) resman->loadFile(particleEffectFile.c_str(), size); + + if (!data) { + logger->log("Warning: Particle engine could not find %s !", + particleEffectFile.c_str()); + return NULL; + } + + xmlDocPtr doc = xmlParseMemory(data, size); + free(data); + + if (!doc) { + logger->log("Warning: Particle engine found syntax error in %s!", + particleEffectFile.c_str()); + return NULL; + } + + xmlNodePtr rootNode = xmlDocGetRootElement(doc); + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "effect")) + { + logger->log("Warning: %s is not a valid particle effect definition file!", + particleEffectFile.c_str()); + return NULL; + } + + // Parse particles + for_each_xml_child_node(effectChildNode, rootNode) + { + // We're only interested in particles + if (!xmlStrEqual(effectChildNode->name, BAD_CAST "particle")) + continue; + + // Determine the exact particle type + xmlNodePtr node; + + // Animation + if ((node = XML::findFirstChildByName( + effectChildNode, "animation"))) { + newParticle = new AnimationParticle(mMap, node); + } + // Image + else if ((node = XML::findFirstChildByName( + effectChildNode, "image"))) { + Image *img= resman->getImage((const char*) + node->xmlChildrenNode->content); + + newParticle = new ImageParticle(mMap, img); + } + // Other + else { + newParticle = new Particle(mMap); + } + + // Read and set the basic properties of the particle + int offsetX = XML::getProperty(effectChildNode, "position-x", 0); + int offsetY = XML::getProperty(effectChildNode, "position-y", 0); + int offsetZ = XML::getProperty(effectChildNode, "position-z", 0); + + int particleX = (int)mPosX + pixelX + offsetX; + int particleY = (int)mPosY + pixelY + offsetY; + int particleZ = (int)mPosZ + offsetZ; + + int lifetime = XML::getProperty(effectChildNode, "lifetime", -1); + + newParticle->setPosition(particleX, particleY, particleZ); + newParticle->setLifetime(lifetime); + + // Look for additional emitters for this particle + for_each_xml_child_node(emitterNode, effectChildNode) + { + if (!xmlStrEqual(emitterNode->name, BAD_CAST "emitter")) + continue; + + ParticleEmitter *newEmitter; + newEmitter = new ParticleEmitter(emitterNode, newParticle, mMap); + newParticle->addEmitter(newEmitter); + } + + mChildParticles.push_back(newParticle); + } + + return newParticle; +} + + +Particle* +Particle::addTextSplashEffect(std::string text, + int colorR, int colorG, int colorB, + gcn::Font *font, int x, int y) +{ + Particle *newParticle = new TextParticle(mMap, text, colorR, colorG, colorB, + font); + newParticle->setPosition(x, y, 0); + newParticle->setVector ( ((rand()%100) - 50) / 200.0f, // X vector + ((rand()%100) - 50) / 200.0f, // Y vector + ((rand()%100) / 200.0f) + 4.0f // Z vector + ); + newParticle->setGravity(0.1f); + newParticle->setBounce(0.5f); + newParticle->setLifetime(200); + newParticle->setFadeOut(100); + + mChildParticles.push_back(newParticle); + + return newParticle; +} + + +void +Particle::setMap(Map *map) +{ + mMap = map; + if (mMap) setSpriteIterator(mMap->addSprite(this)); + + // TODO: Create map emitters based on emitter data in map data +} + + +Particle::~Particle() +{ + // Remove from map sprite list + if (mMap) mMap->removeSprite(mSpriteIterator); + // Delete child emitters and child particles + clear(); + Particle::particleCount--; +} + + +void +Particle::clear() +{ + std::for_each(mChildEmitters.begin(), mChildEmitters.end(), + make_dtor(mChildEmitters)); + mChildEmitters.clear(); + + std::for_each(mChildParticles.begin(), mChildParticles.end(), + make_dtor(mChildParticles)); + mChildParticles.clear(); +} diff --git a/src/particle.h b/src/particle.h new file mode 100644 index 00000000..7a747a5f --- /dev/null +++ b/src/particle.h @@ -0,0 +1,288 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _PARTICLE_H +#define _PARTICLE_H + +#include +#include + +#include + +#include "guichanfwd.h" +#include "sprite.h" + + +class Map; +class Particle; +class ParticleEmitter; + +typedef std::list Particles; +typedef Particles::iterator ParticleIterator; +typedef std::list Emitters; +typedef Emitters::iterator EmitterIterator; + +/** + * A particle spawned by a ParticleEmitter. + */ +class Particle : public Sprite +{ + public: + static const float PARTICLE_SKY; /**< Maximum Z position of particles */ + static int fastPhysics; /**< Mode of squareroot calculation */ + static int particleCount; /**< Current number of particles */ + static int maxCount; /**< Maximum number of particles */ + static int emitterSkip; /**< Duration of pause between two emitter updates in ticks */ + + /** + * Constructor. + * + * @param map the map this particle will add itself to, may be NULL + */ + Particle(Map *map); + + /** + * Destructor. + */ + ~Particle(); + + /** + * Deletes all child particles and emitters + */ + void + clear(); + + /** + * Gives a particle the properties of an engine root particle and loads + * the particle-related config settings + */ + void + setupEngine(); + + /** + * Updates particle position, returns false when the particle should + * be deleted + */ + virtual bool + update(); + + /** + * Draws the particle image + */ + virtual void + draw(Graphics *graphics, int offsetX, int offsetY) const; + + /** + * Necessary for sorting with the other sprites + */ + virtual int + getPixelY() const + { + return (int)(mPosY + mPosZ) - 64; + }; + + /* + Basic Particle properties: + */ + + /** + * Sets the map the particle is on. + */ + void setMap(Map *map); + + /** + * Creates a child particle that hosts some emitters described in the + * particleEffectFile. + */ + Particle* + addEffect(std::string particleEffectFile, int pixelX, int pixelY); + + /** + * Creates a standalone text particle. + */ + Particle* + addTextSplashEffect(std::string text, int colorR, int colorG, int colorB, + gcn::Font *font, int x, int y); + + /** + * Adds an emitter to the particle. + */ + void + addEmitter (ParticleEmitter* emitter) + { mChildEmitters.push_back(emitter); } + + /** + * Sets the position in 3 dimensional space in pixels relative to map + */ + void + setPosition(float x, float y, float z) + { mPosX = x; mPosY = y; mPosZ = z; } + + /** + * Sets the position in 2 dimensional space in pixels relative to map + */ + void + setPosition(float x, float y) + { mPosX = x; mPosY = y; } + + float getPosX() const + { return mPosX; } + + float getPosY() const + { return mPosY; } + + float getPosZ() const + { return mPosZ; } + + /** + * Changes the particle position relative + */ + void + moveBy(float x, float y, float z) + { mPosX += x; mPosY += y; mPosZ += z; } + + /** + * Sets the time in game ticks until the particle is destroyed. + */ + void + setLifetime(int lifetime) + { mLifetimeLeft = lifetime; mLifetimePast = 0; } + + /** + * Sets the age of the pixel in game ticks where the particle has + * faded in completely + */ + void + setFadeOut (int fadeOut) + { mFadeOut = fadeOut; } + + /** + * Sets the remaining particle lifetime where the particle starts to + * fade out + */ + void + setFadeIn (int fadeIn) + { mFadeIn = fadeIn; } + + /** + * Sets the sprite iterator of the particle on the current map to make + * it easier to remove the particle from the map when it is destroyed + */ + void + setSpriteIterator(std::list::iterator spriteIterator) + { mSpriteIterator = spriteIterator; } + + /** + * Gets the sprite iterator of the particle on the current map + */ + std::list::iterator + getSpriteIterator() const + { return mSpriteIterator; } + + /** + * Sets the current velocity in 3 dimensional space + */ + void + setVector(float x, float y, float z) + { mVectorX = x; mVectorY = y; mVectorZ = z; } + + /** + * Sets the downward acceleration + */ + void + setGravity(float g) + { mGravity = g; } + + /** + * Sets the ammount of random vector changes + */ + void + setRandomnes(int r) + { mRandomnes = r; } + + /** + * Sets the ammount of velocity particles retain after + * hitting the ground. + */ + void + setBounce(float bouncieness) + { mBounce = bouncieness; } + + /** + * Makes the particle move toward another particle with a + * given acceleration and momentum + */ + void setDestination(Particle *target, float accel, float moment) + { mTarget = target; mAcceleration = accel; mMomentum = moment; } + + /** + * Sets the distance in pixel the particle can come near the target + * particle before it is destroyed. Does only make sense after a + * target particle has been set using setDestination. + */ + void setDieDistance(float dist) + { mInvDieDistance = 1.0f / dist; } + + /** + * Manually marks the particle for deletion + */ + void kill() + { mAlive = false; mAutoDelete = true; } + + /** + * After calling this function the particle will only request + * deletion when kill() is called + */ + void disableAutoDelete() + { mAutoDelete = false; } + + protected: + bool mAlive; /**< Is the particle supposed to be drawn and updated?*/ + float mPosX, mPosY, mPosZ; /**< Position in 3 dimensonal space - pixel based relative to map */ + int mLifetimeLeft; /**< Lifetime left in game ticks*/ + int mLifetimePast; /**< Age of the particle in game ticks*/ + int mFadeOut; /**< Lifetime in game ticks left where fading out begins*/ + int mFadeIn; /**< Age in game ticks where fading in is finished*/ + + private: + // generic properties + bool mAutoDelete; /**< May the particle request its deletion by the parent particle?*/ + Map *mMap; /**< Map the particle is on*/ + std::list::iterator mSpriteIterator; /**< iterator of the particle on the current map */ + Emitters mChildEmitters; /**< List of child emitters*/ + Particles mChildParticles; /**< List of particles controlled by this particle*/ + //dynamic particle + float mVectorX, mVectorY, mVectorZ; /**< Speed in 3 dimensional space in pixels per game-tick */ + float mGravity; /**< Downward acceleration in pixels per game-tick²*/ + int mRandomnes; /**< Ammount of random vector change*/ + float mBounce; /**< How much the particle bounces off when hitting the ground*/ + //follow-point particles + Particle *mTarget; /**< The particle that attracts this particle*/ + float mAcceleration; /**< Acceleration towards the target particle in pixels per game-tick²*/ + float mInvDieDistance; /**< Distance in pixels from the target particle that causes the destruction of the particle*/ + float mMomentum; /**< How much speed the particle retains after each game tick*/ +}; + +extern Particle *particleEngine; + +#endif diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp new file mode 100644 index 00000000..2387c652 --- /dev/null +++ b/src/particleemitter.cpp @@ -0,0 +1,327 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "particleemitter.h" + +#include "animationparticle.h" +#include "imageparticle.h" +#include "log.h" +#include "particle.h" + +#include "resources/animation.h" +#include "resources/image.h" +#include "resources/resourcemanager.h" +#include "resources/imageset.h" + +#include + +#define SIN45 0.707106781f +#define DEG_RAD_FACTOR 0.017453293f + +ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map): + mParticleImage(0) +{ + mMap = map; + mParticleTarget = target; + + //initializing default values + mParticlePosX.set(0.0f); + mParticlePosY.set(0.0f); + mParticlePosZ.set(0.0f); + mParticleAngleHorizontal.set(0.0f); + mParticleAngleVertical.set(0.0f); + mParticlePower.set(0.0f); + mParticleGravity.set(0.0f); + mParticleRandomnes.set(0); + mParticleBounce.set(0.0f); + mParticleAcceleration.set(0.0f); + mParticleDieDistance.set(-1.0f); + mParticleMomentum.set(1.0f); + mParticleLifetime.set(-1); + mParticleFadeOut.set(0); + mParticleFadeIn.set(0); + mOutput.set(1); + + for_each_xml_child_node(propertyNode, emitterNode) + { + if (xmlStrEqual(propertyNode->name, BAD_CAST "property")) + { + std::string name = XML::getProperty(propertyNode, "name", ""); + + if (name == "position-x") + { + mParticlePosX = readMinMax(propertyNode, 0.0f); + } + else if (name == "position-y") + { + + mParticlePosY = readMinMax(propertyNode, 0.0f); + } + else if (name == "position-z") + { + mParticlePosZ = readMinMax(propertyNode, 0.0f); + } + else if (name == "image") + { + std::string image = XML::getProperty(propertyNode, "value", ""); + // Don't leak when multiple images are defined + if (image != "" && !mParticleImage) + { + ResourceManager *resman = ResourceManager::getInstance(); + mParticleImage = resman->getImage(image); + } + } + else if (name == "horizontal-angle") + { + mParticleAngleHorizontal = readMinMax(propertyNode, 0.0f); + mParticleAngleHorizontal.minVal *= DEG_RAD_FACTOR; + mParticleAngleHorizontal.maxVal *= DEG_RAD_FACTOR; + } + else if (name == "vertical-angle") + { + mParticleAngleVertical = readMinMax(propertyNode, 0.0f); + mParticleAngleVertical.minVal *= DEG_RAD_FACTOR; + mParticleAngleVertical.maxVal *= DEG_RAD_FACTOR; + } + else if (name == "power") + { + mParticlePower = readMinMax(propertyNode, 0.0f); + } + else if (name == "gravity") + { + mParticleGravity = readMinMax(propertyNode, 0.0f); + } + else if (name == "randomnes") + { + mParticleRandomnes = readMinMax(propertyNode, 0); + } + else if (name == "bounce") + { + mParticleBounce = readMinMax(propertyNode, 0.0f); + } + else if (name == "lifetime") + { + mParticleLifetime = readMinMax(propertyNode, 0); + mParticleLifetime.minVal += 1; + } + else if (name == "output") + { + mOutput = readMinMax(propertyNode, 0); + mOutput.maxVal +=1; + } + else if (name == "acceleration") + { + mParticleAcceleration = readMinMax(propertyNode, 0.0f); + } + else if (name == "die-distance") + { + mParticleDieDistance = readMinMax(propertyNode, 0.0f); + } + else if (name == "momentum") + { + mParticleMomentum = readMinMax(propertyNode, 1.0f); + } + else if (name == "fade-out") + { + mParticleFadeOut = readMinMax(propertyNode, 0); + } + else if (name == "fade-in") + { + mParticleFadeIn = readMinMax(propertyNode, 0); + } + else + { + logger->log("Particle Engine: Warning, unknown emitter property \"%s\"", + name.c_str() + ); + } + } + else if (xmlStrEqual(propertyNode->name, BAD_CAST "emitter")) + { + ParticleEmitter newEmitter(propertyNode, mParticleTarget, map); + mParticleChildEmitters.push_back(newEmitter); + } + else if (xmlStrEqual(propertyNode->name, BAD_CAST "animation")) + { + ImageSet *imageset = ResourceManager::getInstance()->getImageSet( + XML::getProperty(propertyNode, "imageset", ""), + XML::getProperty(propertyNode, "width", 0), + XML::getProperty(propertyNode, "height", 0) + ); + + // Get animation frames + for_each_xml_child_node(frameNode, propertyNode) + { + int delay = XML::getProperty(frameNode, "delay", 0); + int offsetX = XML::getProperty(frameNode, "offsetX", 0); + int offsetY = XML::getProperty(frameNode, "offsetY", 0); + offsetY -= imageset->getHeight() - 32; + offsetX -= imageset->getWidth() / 2 - 16; + + if (xmlStrEqual(frameNode->name, BAD_CAST "frame")) + { + int index = XML::getProperty(frameNode, "index", -1); + + if (index < 0) + { + logger->log("No valid value for 'index'"); + continue; + } + + Image *img = imageset->get(index); + + if (!img) + { + logger->log("No image at index " + (index)); + continue; + } + + mParticleAnimation.addFrame(img, delay, offsetX, offsetY); + } + else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) + { + int start = XML::getProperty(frameNode, "start", -1); + int end = XML::getProperty(frameNode, "end", -1); + + if (start < 0 || end < 0) + { + logger->log("No valid value for 'start' or 'end'"); + continue; + } + + while (end >= start) + { + Image *img = imageset->get(start); + + if (!img) + { + logger->log("No image at index " + + (start)); + continue; + } + + mParticleAnimation.addFrame(img, delay, offsetX, offsetY); + start++; + } + } + else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) + { + mParticleAnimation.addTerminator(); + } + } // for frameNode + } + } +} + + +ParticleEmitter::~ParticleEmitter() +{ + if (mParticleImage) + { + mParticleImage->decRef(); + } +} + + +template MinMax +ParticleEmitter::readMinMax(xmlNodePtr propertyNode, T def) +{ + MinMax retval; + + def = (T)XML::getFloatProperty(propertyNode, "value", (double)def); + retval.set ( (T)XML::getFloatProperty(propertyNode, "min", (double)def), + (T)XML::getFloatProperty(propertyNode, "max", (double)def) + ); + + return retval; +} + + +std::list +ParticleEmitter::createParticles() +{ + std::list newParticles; + + for (int i = mOutput.value(); i > 0; i--) + { + // Limit maximum particles + if (Particle::particleCount > Particle::maxCount) break; + + Particle *newParticle; + if (mParticleImage) + { + newParticle = new ImageParticle(mMap, mParticleImage); + } + else if (mParticleAnimation.getLength() > 0) + { + Animation *newAnimation = new Animation(mParticleAnimation); + newParticle = new AnimationParticle(mMap, newAnimation); + } + else + { + newParticle = new Particle(mMap); + } + + + newParticle->setPosition( + mParticlePosX.value(), + mParticlePosY.value(), + mParticlePosZ.value() + ); + + float angleH = mParticleAngleHorizontal.value(); + float angleV = mParticleAngleVertical.value(); + float power = mParticlePower.value(); + newParticle->setVector( + cos(angleH) * cos(angleV) * power, + sin(angleH) * cos(angleV) * SIN45 * power, + sin(angleV) * SIN45 * power + ); + + newParticle->setRandomnes(mParticleRandomnes.value()); + newParticle->setGravity(mParticleGravity.value()); + newParticle->setBounce(mParticleBounce.value()); + + newParticle->setDestination(mParticleTarget, + mParticleAcceleration.value(), + mParticleMomentum.value() + ); + newParticle->setDieDistance(mParticleDieDistance.value()); + + newParticle->setLifetime(mParticleLifetime.value()); + newParticle->setFadeOut(mParticleFadeOut.value()); + newParticle->setFadeIn(mParticleFadeIn.value()); + + for ( std::list::iterator i = mParticleChildEmitters.begin(); + i != mParticleChildEmitters.end(); + i++ + ) + { + newParticle->addEmitter(new ParticleEmitter(*i)); + } + + newParticles.push_back(newParticle); + } + + return newParticles; +} diff --git a/src/particleemitter.h b/src/particleemitter.h new file mode 100644 index 00000000..ca6d8622 --- /dev/null +++ b/src/particleemitter.h @@ -0,0 +1,120 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _PARTICLEEMITTER_H +#define _PARTICLEEMITTER_H + +#include + +#include "utils/xml.h" +#include "utils/minmax.h" + +#include "resources/animation.h" + +class Image; +class Map; +class Particle; + +/** + * Every Particle can have one or more particle emitters that create new + * particles when they are updated + */ +class ParticleEmitter +{ + public: + /** + * Constructor. + */ + ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map); + + /** + * Destructor. + */ + ~ParticleEmitter(); + + /** + * Spawns new particles + * @return: a list of created particles + */ + std::list createParticles(); + + /** + * Sets the target of the particles that are created + */ + void + setTarget(Particle *target) + { mParticleTarget = target; }; + + private: + template MinMax readMinMax(xmlNodePtr propertyNode, T def); + + /** + * initial position of particles: + */ + MinMax mParticlePosX, mParticlePosY, mParticlePosZ; + + /** + * initial vector of particles: + */ + MinMax mParticleAngleHorizontal, mParticleAngleVertical; + + /** + * Initial velocity of particles + */ + MinMax mParticlePower; + + /* + * Vector changing of particles: + */ + MinMax mParticleGravity; + MinMax mParticleRandomnes; + MinMax mParticleBounce; + + /* + * Properties of targeting particles: + */ + Particle *mParticleTarget; + MinMax mParticleAcceleration; + MinMax mParticleDieDistance; + MinMax mParticleMomentum; + + /* + * Behavior over time of the particles: + */ + MinMax mParticleLifetime; + MinMax mParticleFadeOut; + MinMax mParticleFadeIn; + + Map *mMap; /**< Map the particles are spawned on */ + + MinMax mOutput; /**< Number of particles spawned per update */ + + Image *mParticleImage; /**< Particle image, if used */ + + /** Filename of particle animation file */ + Animation mParticleAnimation; + + /** List of emitters the spawned particles are equipped with */ + std::list mParticleChildEmitters; +}; +#endif diff --git a/src/resources/animation.h b/src/resources/animation.h index d0d11c69..aad93cda 100644 --- a/src/resources/animation.h +++ b/src/resources/animation.h @@ -54,7 +54,7 @@ class Animation Animation(); /** - * Appends a new animation at the end of the sequence + * Appends a new animation at the end of the sequence. */ void addFrame(Image *image, unsigned int delay, int offsetX, int offsetY); diff --git a/src/resources/image.cpp b/src/resources/image.cpp index a27783d4..d7d4e64b 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -187,19 +187,22 @@ Image* Image::load(void *buffer, unsigned int bufferSize, bool hasAlpha = false; - // Figure out whether the image uses its alpha layer - for (int i = 0; i < tmpImage->w * tmpImage->h; ++i) + if (tmpImage->format->BitsPerPixel == 32) { - Uint8 r, g, b, a; - SDL_GetRGBA( - ((Uint32*) tmpImage->pixels)[i], - tmpImage->format, - &r, &g, &b, &a); - - if (a != 255) + // Figure out whether the image uses its alpha layer + for (int i = 0; i < tmpImage->w * tmpImage->h; ++i) { - hasAlpha = true; - break; + Uint8 r, g, b, a; + SDL_GetRGBA( + ((Uint32*) tmpImage->pixels)[i], + tmpImage->format, + &r, &g, &b, &a); + + if (a != 255) + { + hasAlpha = true; + break; + } } } diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index fda8916d..2230cb6a 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -231,6 +231,30 @@ MapReader::readMap(xmlNodePtr node, const std::string &path) { readProperties(childNode, map); } + else if (xmlStrEqual(childNode->name, BAD_CAST "objectgroup")) + { + for_each_xml_child_node(objectNode, childNode) + { + if (xmlStrEqual(objectNode->name, BAD_CAST "object")) + { + std::string objName = XML::getProperty(objectNode, "name", ""); + std::string objType = XML::getProperty(objectNode, "type", ""); + int objX = XML::getProperty(objectNode, "x", 0); + int objY = XML::getProperty(objectNode, "y", 0); + + logger->log("- Loading object name: %s type: %s at %d:%d", + objName.c_str(), objType.c_str(), objX, objY); + if (objType == "PARTICLE_EFFECT") + { + map->addParticleEffect(objName, objX, objY); + } + else + { + logger->log(" Warning: Unknown object type"); + } + } + } + } } map->initializeOverlays(); diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index ac3ac3bc..89afc549 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -83,6 +83,27 @@ MonsterDB::load() currentInfo->setName (XML::getProperty(monsterNode, "name", "unnamed")); + std::string targetCursor; + targetCursor = XML::getProperty(monsterNode, "targetCursor", "medium"); + if (targetCursor == "small") + { + currentInfo->setTargetCursorSize(Being::TC_SMALL); + } + else if (targetCursor == "medium") + { + currentInfo->setTargetCursorSize(Being::TC_MEDIUM); + } + else if (targetCursor == "large") + { + currentInfo->setTargetCursorSize(Being::TC_LARGE); + } + else + { + logger->log("MonsterDB: Unknown target cursor type \"%s\" for %s - using medium sized one", + targetCursor.c_str(), currentInfo->getName().c_str()); + currentInfo->setTargetCursorSize(Being::TC_MEDIUM); + } + //iterate s and s for_each_xml_child_node(spriteNode, monsterNode) { diff --git a/src/resources/monsterinfo.h b/src/resources/monsterinfo.h index 05d4c014..d2a0a2c8 100644 --- a/src/resources/monsterinfo.h +++ b/src/resources/monsterinfo.h @@ -28,6 +28,9 @@ #include #include +#include "../being.h" + + enum SoundEvent { EVENT_HIT, @@ -62,7 +65,11 @@ class MonsterInfo setSprite(std::string filename) { mSprite = filename; } void - addSound (SoundEvent event, std::string filename); + setTargetCursorSize(Being::TargetCursorSize targetCursorSize) + { mTargetCursorSize = targetCursorSize; } + + void + addSound(SoundEvent event, std::string filename); const std::string& getName () const { return mName; }; @@ -70,13 +77,16 @@ class MonsterInfo const std::string& getSprite () const { return mSprite; }; + const Being::TargetCursorSize + getTargetCursorSize() const { return mTargetCursorSize; } + std::string getSound (SoundEvent event) const; private: std::string mName; std::string mSprite; - + Being::TargetCursorSize mTargetCursorSize; std::map* > mSounds; }; diff --git a/src/simpleanimation.cpp b/src/simpleanimation.cpp index 5fc35bcd..18e732ef 100644 --- a/src/simpleanimation.cpp +++ b/src/simpleanimation.cpp @@ -23,6 +23,91 @@ #include "simpleanimation.h" +#include "graphics.h" +#include "log.h" + +#include "resources/image.h" +#include "resources/resourcemanager.h" +#include "resources/imageset.h" + + +SimpleAnimation::SimpleAnimation(xmlNodePtr animationNode): + mAnimationTime(0), + mAnimationPhase(0) +{ + mAnimation = new Animation(); + + ImageSet *imageset = ResourceManager::getInstance()->getImageSet( + XML::getProperty(animationNode, "imageset", ""), + XML::getProperty(animationNode, "width", 0), + XML::getProperty(animationNode, "height", 0) + ); + + // Get animation frames + for ( xmlNodePtr frameNode = animationNode->xmlChildrenNode; + frameNode != NULL; + frameNode = frameNode->next) + { + int delay = XML::getProperty(frameNode, "delay", 0); + int offsetX = XML::getProperty(frameNode, "offsetX", 0); + int offsetY = XML::getProperty(frameNode, "offsetY", 0); + offsetY -= imageset->getHeight() - 32; + offsetX -= imageset->getWidth() / 2 - 16; + + if (xmlStrEqual(frameNode->name, BAD_CAST "frame")) + { + int index = XML::getProperty(frameNode, "index", -1); + + if (index < 0) + { + logger->log("No valid value for 'index'"); + continue; + } + + Image *img = imageset->get(index); + + if (!img) + { + logger->log("No image at index " + (index)); + continue; + } + + mAnimation->addFrame(img, delay, offsetX, offsetY); + } + else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) + { + int start = XML::getProperty(frameNode, "start", -1); + int end = XML::getProperty(frameNode, "end", -1); + + if (start < 0 || end < 0) + { + logger->log("No valid value for 'start' or 'end'"); + continue; + } + + while (end >= start) + { + Image *img = imageset->get(start); + + if (!img) + { + logger->log("No image at index " + + (start)); + continue; + } + + mAnimation->addFrame(img, delay, offsetX, offsetY); + start++; + } + } + else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) + { + mAnimation->addTerminator(); + } + } + + mCurrentFrame = mAnimation->getFrame(0); +} void SimpleAnimation::update(unsigned int timePassed) { diff --git a/src/simpleanimation.h b/src/simpleanimation.h index a56c31da..561c540d 100644 --- a/src/simpleanimation.h +++ b/src/simpleanimation.h @@ -26,7 +26,10 @@ #include "resources/animation.h" +#include "utils/xml.h" + class Frame; +class Graphics; /** * This class is a leightweight alternative to the AnimatedSprite class. @@ -35,6 +38,9 @@ class Frame; class SimpleAnimation { public: + /** + * Creates a simple animation with an already created animation. + */ SimpleAnimation(Animation *animation): mAnimation(animation), mAnimationTime(0), @@ -42,6 +48,11 @@ class SimpleAnimation mCurrentFrame(mAnimation->getFrame(0)) {}; + /** + * Creates a simple animation that creates its animation from XML Data. + */ + SimpleAnimation(xmlNodePtr animationNode); + ~SimpleAnimation(); void update(unsigned int timePassed); @@ -55,10 +66,10 @@ class SimpleAnimation /** Time in game ticks the current frame is shown. */ unsigned int mAnimationTime; - /** Index of current animation frame. */ + /** Index of current animation phase. */ unsigned int mAnimationPhase; - /** Current animation frame. */ + /** Current animation phase. */ Frame *mCurrentFrame; }; diff --git a/src/sprite.h b/src/sprite.h index 51811149..89780519 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -49,6 +49,22 @@ class Sprite virtual void draw(Graphics *graphics, int offsetX, int offsetY) const = 0; + /** + * Returns the horizontal size of the sprites graphical representation + * in pixels or 0 when it is undefined. + */ + virtual int + getWidth() const + { return 0; } + + /** + * Returns the vertical size of the sprites graphical representation + * in pixels or 0 when it is undefined. + */ + virtual int + getHeight() const + { return 0; } + /** * Returns the pixel Y coordinate of the sprite. */ diff --git a/src/textparticle.cpp b/src/textparticle.cpp new file mode 100644 index 00000000..dd01d2fe --- /dev/null +++ b/src/textparticle.cpp @@ -0,0 +1,64 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "textparticle.h" + +#include "graphics.h" + +TextParticle::TextParticle(Map *map, const std::string &text, + int colorR, int colorG, int colorB, gcn::Font *font): + Particle(map), + mText(text), + mTextFont(font), + mColorR(colorR), + mColorG(colorG), + mColorB(colorB) +{ +} + +void TextParticle::draw(Graphics *graphics, int offsetX, int offsetY) const +{ + if (!mAlive) + return; + + int screenX = (int)mPosX + offsetX; + int screenY = (int)mPosY - int(mPosZ) + offsetY; + + int alpha = 255; + + if (mLifetimeLeft > -1 && mLifetimeLeft < mFadeOut) + { + alpha *= mLifetimeLeft; + alpha /= mFadeOut; + }; + + if (mLifetimePast < mFadeIn) + { + alpha *= mLifetimePast; + alpha /= mFadeIn; + } + + graphics->setFont(mTextFont); + graphics->setColor(gcn::Color (mColorR, mColorG, mColorB, alpha)); + graphics->drawText(mText, screenX, screenY, gcn::Graphics::CENTER); +} diff --git a/src/textparticle.h b/src/textparticle.h new file mode 100644 index 00000000..b365c885 --- /dev/null +++ b/src/textparticle.h @@ -0,0 +1,53 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TEXTPARTICLE_H +#define _TEXTPARTICLE_H + +#include "particle.h" + +#include + +#include "guichanfwd.h" + +class TextParticle : public Particle +{ + public: + TextParticle(Map *map, const std::string &text, + int colorR, int colorG, int colorB, gcn::Font *font); + /** + * Draws the particle image + */ + virtual void + draw(Graphics *graphics, int offsetX, int offsetY) const; + + // hack to improve text visibility + virtual int getPixelY() const { return (int)(mPosY + mPosZ); } + + private: + std::string mText; /**< Text of the particle */ + gcn::Font *mTextFont; /**< Font used for drawing the text */ + int mColorR, mColorG, mColorB; /**< Color used for drawing the text */ +}; + +#endif diff --git a/src/utils/fastsqrt.h b/src/utils/fastsqrt.h new file mode 100644 index 00000000..8da1d354 --- /dev/null +++ b/src/utils/fastsqrt.h @@ -0,0 +1,24 @@ +/* A very fast function to calculate the approximate inverse square root of a + * floating point value and a helper function that uses it for getting the + * normal squareroot. For an explanation of the inverse squareroot function + * read: + * http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf + * + * Unfortunately the original creator of this function seems to be unknown. + */ + +float fastInvSqrt(float x) +{ + union { int i; float x; } tmp; + float xhalf = 0.5f * x; + tmp.x = x; + tmp.i = 0x5f375a86 - (tmp.i >> 1); + x = tmp.x; + x = x * (1.5f - xhalf * x * x); + return x; +} + +float fastSqrt(float x) +{ + return 1.0f / fastInvSqrt(x); +} diff --git a/src/utils/minmax.h b/src/utils/minmax.h new file mode 100644 index 00000000..1add2b7e --- /dev/null +++ b/src/utils/minmax.h @@ -0,0 +1,47 @@ +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/** + * Returns a random numeric value that is larger than or equal min and smaller + * than max + */ + +template struct MinMax +{ + void set(T min, T max) + { + minVal=min; maxVal=max; + } + + void set(T val) + { + set(val, val); + } + + T value() + { + return (T)(minVal + (maxVal - minVal) * (rand() / ((double) RAND_MAX + 1))); + } + + T minVal; + T maxVal; +}; diff --git a/src/utils/wingettimeofday.h b/src/utils/wingettimeofday.h index a5537f39..28afb7e5 100644 --- a/src/utils/wingettimeofday.h +++ b/src/utils/wingettimeofday.h @@ -1,113 +1,113 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#ifndef _TMW_WINGETTIMEOFDAY_H_ -#define _TMW_WINGETTIMEOFDAY_H_ - -#ifdef WIN32 - -#include - -/* - * the function gettimeofday() is available on UNIX but not on windows. - * this header defines a windows implementation as a - * GetSystemTimeAsFileTime() wrapper. - */ - -int gettimeofday(struct timeval* tv, void *tz) -/*--------------------------------------------------------------- - * Copyright (c) 1999,2000,2001,2002,2003 - * The Board of Trustees of the University of Illinois - * All Rights Reserved. - *--------------------------------------------------------------- - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software (Iperf) and associated - * documentation files (the "Software"), to deal in the Software - * without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, - * sublicense, and/or sell copies of the Software, and to permit - * persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * - * Redistributions of source code must retain the above - * copyright notice, this list of conditions and - * the following disclaimers. - * - * - * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimers in the documentation and/or other materials - * provided with the distribution. - * - * - * Neither the names of the University of Illinois, NCSA, - * nor the names of its contributors may be used to endorse - * or promote products derived from this Software without - * specific prior written permission. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * ________________________________________________________________ - * National Laboratory for Applied Network Research - * National Center for Supercomputing Applications - * University of Illinois at Urbana-Champaign - * http://www.ncsa.uiuc.edu - * ________________________________________________________________ - * - * gettimeofday.c - * by Mark Gates - * ------------------------------------------------------------------- - * A (hack) implementation of gettimeofday for Windows. - * Since I send sec/usec in UDP packets, this made the most sense. - * ------------------------------------------------------------------- */ -{ - FILETIME time; - double timed; - - GetSystemTimeAsFileTime( &time ); - - // Apparently Win32 has units of 1e-7 sec (tenths of microsecs) - // 4294967296 is 2^32, to shift high word over - // 11644473600 is the number of seconds between - // the Win32 epoch 1601-Jan-01 and the Unix epoch 1970-Jan-01 - // Tests found floating point to be 10x faster than 64bit int math. - - timed = ((time.dwHighDateTime * 4294967296e-7) - 11644473600.0) + - (time.dwLowDateTime * 1e-7); - - tv->tv_sec = (long) timed; - tv->tv_usec = (long) ((timed - tv->tv_sec) * 1e6); - - return 0; -} - - -#endif // WIN32 -#endif +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_WINGETTIMEOFDAY_H_ +#define _TMW_WINGETTIMEOFDAY_H_ + +#ifdef WIN32 + +#include + +/* + * the function gettimeofday() is available on UNIX but not on windows. + * this header defines a windows implementation as a + * GetSystemTimeAsFileTime() wrapper. + */ + +int gettimeofday(struct timeval* tv, void *tz) +/*--------------------------------------------------------------- + * Copyright (c) 1999,2000,2001,2002,2003 + * The Board of Trustees of the University of Illinois + * All Rights Reserved. + *--------------------------------------------------------------- + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software (Iperf) and associated + * documentation files (the "Software"), to deal in the Software + * without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit + * persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * + * Redistributions of source code must retain the above + * copyright notice, this list of conditions and + * the following disclaimers. + * + * + * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimers in the documentation and/or other materials + * provided with the distribution. + * + * + * Neither the names of the University of Illinois, NCSA, + * nor the names of its contributors may be used to endorse + * or promote products derived from this Software without + * specific prior written permission. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ________________________________________________________________ + * National Laboratory for Applied Network Research + * National Center for Supercomputing Applications + * University of Illinois at Urbana-Champaign + * http://www.ncsa.uiuc.edu + * ________________________________________________________________ + * + * gettimeofday.c + * by Mark Gates + * ------------------------------------------------------------------- + * A (hack) implementation of gettimeofday for Windows. + * Since I send sec/usec in UDP packets, this made the most sense. + * ------------------------------------------------------------------- */ +{ + FILETIME time; + double timed; + + GetSystemTimeAsFileTime( &time ); + + // Apparently Win32 has units of 1e-7 sec (tenths of microsecs) + // 4294967296 is 2^32, to shift high word over + // 11644473600 is the number of seconds between + // the Win32 epoch 1601-Jan-01 and the Unix epoch 1970-Jan-01 + // Tests found floating point to be 10x faster than 64bit int math. + + timed = ((time.dwHighDateTime * 4294967296e-7) - 11644473600.0) + + (time.dwLowDateTime * 1e-7); + + tv->tv_sec = (long) timed; + tv->tv_usec = (long) ((timed - tv->tv_sec) * 1e6); + + return 0; +} + + +#endif // WIN32 +#endif diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp index 7c917dc0..e30450f0 100644 --- a/src/utils/xml.cpp +++ b/src/utils/xml.cpp @@ -39,6 +39,20 @@ namespace XML return ret; } + double + getFloatProperty(xmlNodePtr node, const char* name, double def) + { + double &ret = def; + + xmlChar *prop = xmlGetProp(node, BAD_CAST name); + if (prop) { + ret = atof((char*)prop); + xmlFree(prop); + } + + return ret; + } + std::string getProperty(xmlNodePtr node, const char *name, const std::string &def) { @@ -51,4 +65,13 @@ namespace XML return def; } + + xmlNodePtr findFirstChildByName(xmlNodePtr parent, const char *name) + { + for_each_xml_child_node(child, parent) + if (xmlStrEqual(child->name, BAD_CAST name)) + return child; + + return NULL; + } } diff --git a/src/utils/xml.h b/src/utils/xml.h index db4c264a..ef3bad3d 100644 --- a/src/utils/xml.h +++ b/src/utils/xml.h @@ -39,11 +39,22 @@ namespace XML int getProperty(xmlNodePtr node, const char *name, int def); + /** + * Gets an floating point property from an xmlNodePtr. + */ + double + getFloatProperty(xmlNodePtr node, const char *name, double def); + /** * Gets a string property from an xmlNodePtr. */ std::string getProperty(xmlNodePtr node, const char *name, const std::string &def); + + /** + * Finds the first child node with the given name + */ + xmlNodePtr findFirstChildByName(xmlNodePtr parent, const char *name); } #define for_each_xml_child_node(var, parent) \ -- cgit v1.2.3-70-g09d2 From 0bd2a74378b01204876ec8d92c03959f3b3a287e Mon Sep 17 00:00:00 2001 From: Guillaume Melquiond Date: Mon, 6 Aug 2007 06:20:14 +0000 Subject: Added support for translating variable strings. --- ChangeLog | 10 +++++++++ po/fr.po | 33 +++++++++++++++++++++++----- po/tmw.pot | 30 ++++++++++++++++++++----- src/Makefile.am | 2 ++ src/gui/inventorywindow.cpp | 50 ++++++++++++++++-------------------------- src/utils/strprintf.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++ src/utils/strprintf.h | 37 +++++++++++++++++++++++++++++++ 7 files changed, 173 insertions(+), 42 deletions(-) create mode 100644 src/utils/strprintf.cpp create mode 100644 src/utils/strprintf.h (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 267e0e5e..7602a9df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2007-08-06 Guillaume Melquiond + + * src/Makefile.am, src/utils/strprintf.h, src/utils/strprintf.cpp: + Added a helper function for printf-formatting a (gettext) C string into + a dynamically-sized C++ string. + * src/gui/inventory.cpp: Completed marking of translatable strings for + inventory window. + * po/tmw.pot: Updated with new translatable strings. + * po/fr.po: Completed translation of inventory window in french. + 2007-08-05 Guillaume Melquiond * configure.ac, Makefile.am, po, src/Makefile.am, src/main.cpp, diff --git a/po/fr.po b/po/fr.po index d6c07b78..c23f558b 100644 --- a/po/fr.po +++ b/po/fr.po @@ -9,25 +9,46 @@ msgid "" msgstr "" "Project-Id-Version: The Mana World 0.1.0\n" "Report-Msgid-Bugs-To: themanaworld-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2007-08-05 18:09+0200\n" -"PO-Revision-Date: 2007-08-05 17:42+0200\n" +"POT-Creation-Date: 2007-08-06 08:03+0200\n" +"PO-Revision-Date: 2007-08-06 08:04+0200\n" +"Last-Translator: Guillaume Melquiond \n" "Language-Team: French\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: src/gui/inventorywindow.cpp:48 +#: src/gui/inventorywindow.cpp:49 msgid "Inventory" msgstr "Inventaire" -#: src/gui/inventorywindow.cpp:56 src/gui/inventorywindow.cpp:216 +#: src/gui/inventorywindow.cpp:57 src/gui/inventorywindow.cpp:205 msgid "Use" msgstr "Utiliser" -#: src/gui/inventorywindow.cpp:57 +#: src/gui/inventorywindow.cpp:58 msgid "Drop" msgstr "Lâcher" -#: src/gui/inventorywindow.cpp:213 +#: src/gui/inventorywindow.cpp:67 src/gui/inventorywindow.cpp:131 +#, c-format +msgid "Name: %s" +msgstr "Nom : %s" + +#: src/gui/inventorywindow.cpp:68 src/gui/inventorywindow.cpp:135 +#, c-format +msgid "Description: %s" +msgstr "Description : %s" + +#: src/gui/inventorywindow.cpp:69 src/gui/inventorywindow.cpp:133 +#, c-format +msgid "Effect: %s" +msgstr "Effet : %s" + +#: src/gui/inventorywindow.cpp:70 src/gui/inventorywindow.cpp:97 +#, c-format +msgid "Total Weight: %d - Maximum Weight: %d" +msgstr "Poids total : %d - Poids maximal : %d" + +#: src/gui/inventorywindow.cpp:202 msgid "Equip" msgstr "Équiper" diff --git a/po/tmw.pot b/po/tmw.pot index 7fa6e432..e12b7d81 100644 --- a/po/tmw.pot +++ b/po/tmw.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: themanaworld-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2007-08-05 18:09+0200\n" +"POT-Creation-Date: 2007-08-06 08:03+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,18 +16,38 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: src/gui/inventorywindow.cpp:48 +#: src/gui/inventorywindow.cpp:49 msgid "Inventory" msgstr "" -#: src/gui/inventorywindow.cpp:56 src/gui/inventorywindow.cpp:216 +#: src/gui/inventorywindow.cpp:57 src/gui/inventorywindow.cpp:205 msgid "Use" msgstr "" -#: src/gui/inventorywindow.cpp:57 +#: src/gui/inventorywindow.cpp:58 msgid "Drop" msgstr "" -#: src/gui/inventorywindow.cpp:213 +#: src/gui/inventorywindow.cpp:67 src/gui/inventorywindow.cpp:131 +#, c-format +msgid "Name: %s" +msgstr "" + +#: src/gui/inventorywindow.cpp:68 src/gui/inventorywindow.cpp:135 +#, c-format +msgid "Description: %s" +msgstr "" + +#: src/gui/inventorywindow.cpp:69 src/gui/inventorywindow.cpp:133 +#, c-format +msgid "Effect: %s" +msgstr "" + +#: src/gui/inventorywindow.cpp:70 src/gui/inventorywindow.cpp:97 +#, c-format +msgid "Total Weight: %d - Maximum Weight: %d" +msgstr "" + +#: src/gui/inventorywindow.cpp:202 msgid "Equip" msgstr "" diff --git a/src/Makefile.am b/src/Makefile.am index b3142582..5866205e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -232,6 +232,8 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ utils/dtor.h \ utils/fastsqrt.h \ utils/minmax.h \ + utils/strprintf.h \ + utils/strprintf.cpp \ utils/tostring.h \ utils/xml.cpp \ utils/xml.h \ diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp index 95a669a9..e31c87f6 100644 --- a/src/gui/inventorywindow.cpp +++ b/src/gui/inventorywindow.cpp @@ -42,7 +42,7 @@ #include "../resources/gettext.h" #include "../resources/iteminfo.h" -#include "../utils/tostring.h" +#include "../utils/strprintf.h" InventoryWindow::InventoryWindow(): Window(_("Inventory")) @@ -63,10 +63,10 @@ InventoryWindow::InventoryWindow(): mInvenScroll->setPosition(8, 8); mInvenScroll->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER); - mItemNameLabel = new gcn::Label("Name:"); - mItemDescriptionLabel = new gcn::Label("Description:"); - mItemEffectLabel = new gcn::Label("Effect:"); - mWeightLabel = new gcn::Label("Total Weight: - Maximum Weight: "); + mItemNameLabel = new gcn::Label(strprintf(_("Name: %s"), "")); + mItemDescriptionLabel = new gcn::Label(strprintf(_("Description: %s"), "")); + mItemEffectLabel = new gcn::Label(strprintf(_("Effect: %s"), "")); + mWeightLabel = new gcn::Label(strprintf(_("Total Weight: %d - Maximum Weight: %d"), 0, 0)); mWeightLabel->setPosition(8, 8); mInvenScroll->setPosition(8, mWeightLabel->getY() + mWeightLabel->getHeight() + 5); @@ -93,9 +93,8 @@ void InventoryWindow::logic() updateButtons(); // Update weight information - mWeightLabel->setCaption( - "Total Weight: " + toString(player_node->getTotalWeight()) + " - " - "Maximum Weight: " + toString(player_node->getMaxWeight())); + mWeightLabel->setCaption(strprintf(_("Total Weight: %d - Maximum Weight: %d"), + player_node->getTotalWeight(), player_node->getMaxWeight())); mWeightLabel->adjustSize(); } @@ -125,29 +124,18 @@ void InventoryWindow::action(const gcn::ActionEvent &event) void InventoryWindow::selectionChanged(const SelectionEvent &event) { Item *item = mItems->getItem(); - - // Update name, effect and description - if (!item) - { - mItemNameLabel->setCaption("Name:"); - mItemEffectLabel->setCaption("Effect:"); - mItemDescriptionLabel->setCaption("Description:"); - } - else - { - const ItemInfo& itemInfo = item->getInfo(); - std::string SomeText; - SomeText = "Name: " + itemInfo.getName(); - mItemNameLabel->setCaption(SomeText); - SomeText = "Effect: " + itemInfo.getEffect(); - mItemEffectLabel->setCaption(SomeText); - SomeText = "Description: " + itemInfo.getDescription(); - mItemDescriptionLabel->setCaption(SomeText); - - mItemNameLabel->adjustSize(); - mItemEffectLabel->adjustSize(); - mItemDescriptionLabel->adjustSize(); - } + ItemInfo const *info = item ? &item->getInfo() : NULL; + + mItemNameLabel->setCaption + (strprintf(_("Name: %s"), info ? info->getName().c_str() : "")); + mItemEffectLabel->setCaption + (strprintf(_("Effect: %s"), info ? info->getEffect().c_str() : "")); + mItemDescriptionLabel->setCaption + (strprintf(_("Description: %s"), info ? info->getDescription().c_str() : "")); + + mItemNameLabel->adjustSize(); + mItemEffectLabel->adjustSize(); + mItemDescriptionLabel->adjustSize(); } void InventoryWindow::mouseClicked(gcn::MouseEvent &event) diff --git a/src/utils/strprintf.cpp b/src/utils/strprintf.cpp new file mode 100644 index 00000000..27dd5462 --- /dev/null +++ b/src/utils/strprintf.cpp @@ -0,0 +1,53 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_UTILS_TOSTRING_H +#define _TMW_UTISL_TOSTRING_H + +#include + +#include "strprintf.h" + +std::string strprintf(char const *format, ...) +{ + char buf[256]; + va_list(args); + va_start(args, format); + int nb = vsnprintf(buf, 256, format, args); + va_end(args); + if (nb < 256) + { + return buf; + } + // The static size was not big enough, try again with a dynamic allocation. + ++nb; + char *buf2 = new char[nb]; + va_start(args, format); + vsnprintf(buf2, nb, format, args); + va_end(args); + std::string res(buf2); + delete [] buf2; + return res; +} + +#endif diff --git a/src/utils/strprintf.h b/src/utils/strprintf.h new file mode 100644 index 00000000..4b5974a6 --- /dev/null +++ b/src/utils/strprintf.h @@ -0,0 +1,37 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_UTILS_STRPRINTF_H +#define _TMW_UTISL_STRPRINTF_H + +#include + +std::string strprintf(char const *, ...) +#ifdef __GNUC__ + /* This attribute is nice: it even works through gettext invokation. For + example, gcc will complain that strprintf(_("%s"), 42) is ill-formed. */ + __attribute__((format(printf, 1, 2))) +#endif +; + +#endif -- cgit v1.2.3-70-g09d2 From 1389fc06cc578bdddd6d92cf3a239e33bb892026 Mon Sep 17 00:00:00 2001 From: Guillaume Melquiond Date: Mon, 6 Aug 2007 11:14:45 +0000 Subject: Fixed some header typos. Moved gettext.h to utils directory. Removed redundant HAS_CONFIG_H macro. Used autopoint for generating gettext environment. Removed auto-generated file from po directory. --- ChangeLog | 6 + Makefile.am | 3 + autogen.sh | 3 +- configure.ac | 1 + po/Makefile.in.in | 403 -------------------------------------------- po/remove-potcdate.sin | 19 --- src/Makefile.am | 3 +- src/gui/inventorywindow.cpp | 2 +- src/main.cpp | 2 +- src/resources/gettext.h | 46 ----- src/utils/gettext.h | 46 +++++ src/utils/strprintf.h | 2 +- src/utils/tostring.h | 2 +- 13 files changed, 63 insertions(+), 475 deletions(-) delete mode 100644 po/Makefile.in.in delete mode 100644 po/remove-potcdate.sin delete mode 100644 src/resources/gettext.h create mode 100644 src/utils/gettext.h (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 7602a9df..cb5cb144 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,12 @@ inventory window. * po/tmw.pot: Updated with new translatable strings. * po/fr.po: Completed translation of inventory window in french. + * src/resources/gettext.h, src/main.cpp: Moved header to utils + directory. + * src/utils/tostring.h: Fixed typo in macro guard. + * po/Makefile.in.in, po/remove-potcdate.sin, configure.ac, Makefile.am, + autogen.sh: Used autopoint for generating gettext environment, and + removed conflicting files. 2007-08-05 Guillaume Melquiond diff --git a/Makefile.am b/Makefile.am index ea85bb48..2d7250cc 100644 --- a/Makefile.am +++ b/Makefile.am @@ -7,3 +7,6 @@ desktop_DATA = tmw.desktop # Extra files to include EXTRA_DIST = $(desktop_DATA) + +# Autopoint m4 stuff +ACLOCAL_AMFLAGS = -I m4 diff --git a/autogen.sh b/autogen.sh index 8f047c99..69533296 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,9 +1,10 @@ #!/bin/sh -echo "Generating build information using aclocal, autoheader, automake and autoconf." +echo "Generating build information using autopoint, aclocal, autoheader, automake, and autoconf." echo # Regerate configuration files +autopoint aclocal autoheader automake --gnu --add-missing --copy diff --git a/configure.ac b/configure.ac index b6803c11..5e106045 100755 --- a/configure.ac +++ b/configure.ac @@ -21,6 +21,7 @@ AC_CHECK_FUNCS([atexit floor getcwd gethostbyname memset mkdir select socket]) # Checks for internationalization support AM_GNU_GETTEXT([external]) +AM_GNU_GETTEXT_VERSION([0.16.1]) # Search for *-config AC_PATH_PROG(SDL_CONFIG, sdl-config) diff --git a/po/Makefile.in.in b/po/Makefile.in.in deleted file mode 100644 index 5022b8b1..00000000 --- a/po/Makefile.in.in +++ /dev/null @@ -1,403 +0,0 @@ -# Makefile for PO directory in any package using GNU gettext. -# Copyright (C) 1995-1997, 2000-2006 by Ulrich Drepper -# -# This file can be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU General Public -# License but which still want to provide support for the GNU gettext -# functionality. -# Please note that the actual code of GNU gettext is covered by the GNU -# General Public License and is *not* in the public domain. -# -# Origin: gettext-0.16 - -PACKAGE = @PACKAGE@ -VERSION = @VERSION@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ - -SHELL = /bin/sh -@SET_MAKE@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -datarootdir = @datarootdir@ -datadir = @datadir@ -localedir = @localedir@ -gettextsrcdir = $(datadir)/gettext/po - -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ - -# We use $(mkdir_p). -# In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as -# "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, -# @install_sh@ does not start with $(SHELL), so we add it. -# In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined -# either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake -# versions, $(mkinstalldirs) and $(install_sh) are unused. -mkinstalldirs = $(SHELL) @install_sh@ -d -install_sh = $(SHELL) @install_sh@ -MKDIR_P = @MKDIR_P@ -mkdir_p = @mkdir_p@ - -GMSGFMT_ = @GMSGFMT@ -GMSGFMT_no = @GMSGFMT@ -GMSGFMT_yes = @GMSGFMT_015@ -GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) -MSGFMT_ = @MSGFMT@ -MSGFMT_no = @MSGFMT@ -MSGFMT_yes = @MSGFMT_015@ -MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) -XGETTEXT_ = @XGETTEXT@ -XGETTEXT_no = @XGETTEXT@ -XGETTEXT_yes = @XGETTEXT_015@ -XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) -MSGMERGE = msgmerge -MSGMERGE_UPDATE = @MSGMERGE@ --update -MSGINIT = msginit -MSGCONV = msgconv -MSGFILTER = msgfilter - -POFILES = @POFILES@ -GMOFILES = @GMOFILES@ -UPDATEPOFILES = @UPDATEPOFILES@ -DUMMYPOFILES = @DUMMYPOFILES@ -DISTFILES.common = Makefile.in.in remove-potcdate.sin \ -$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) -DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ -$(POFILES) $(GMOFILES) \ -$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) - -POTFILES = \ - -CATALOGS = @CATALOGS@ - -# Makevars gets inserted here. (Don't remove this line!) - -.SUFFIXES: -.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update - -.po.mo: - @echo "$(MSGFMT) -c -o $@ $<"; \ - $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ - -.po.gmo: - @lang=`echo $* | sed -e 's,.*/,,'`; \ - test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ - echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ - cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo - -.sin.sed: - sed -e '/^#/d' $< > t-$@ - mv t-$@ $@ - - -all: all-@USE_NLS@ - -all-yes: stamp-po -all-no: - -# $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no -# internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because -# we don't want to bother translators with empty POT files). We assume that -# LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. -# In this case, stamp-po is a nop (i.e. a phony target). - -# stamp-po is a timestamp denoting the last time at which the CATALOGS have -# been loosely updated. Its purpose is that when a developer or translator -# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, -# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent -# invocations of "make" will do nothing. This timestamp would not be necessary -# if updating the $(CATALOGS) would always touch them; however, the rule for -# $(POFILES) has been designed to not touch files that don't need to be -# changed. -stamp-po: $(srcdir)/$(DOMAIN).pot - test ! -f $(srcdir)/$(DOMAIN).pot || \ - test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) - @test ! -f $(srcdir)/$(DOMAIN).pot || { \ - echo "touch stamp-po" && \ - echo timestamp > stamp-poT && \ - mv stamp-poT stamp-po; \ - } - -# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', -# otherwise packages like GCC can not be built if only parts of the source -# have been downloaded. - -# This target rebuilds $(DOMAIN).pot; it is an expensive operation. -# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. -$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed - if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ - msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ - else \ - msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ - fi; \ - $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ - --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ - --files-from=$(srcdir)/POTFILES.in \ - --copyright-holder='$(COPYRIGHT_HOLDER)' \ - --msgid-bugs-address="$$msgid_bugs_address" - test ! -f $(DOMAIN).po || { \ - if test -f $(srcdir)/$(DOMAIN).pot; then \ - sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ - sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ - if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ - rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ - else \ - rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ - mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ - fi; \ - else \ - mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ - fi; \ - } - -# This rule has no dependencies: we don't need to update $(DOMAIN).pot at -# every "make" invocation, only create it when it is missing. -# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. -$(srcdir)/$(DOMAIN).pot: - $(MAKE) $(DOMAIN).pot-update - -# This target rebuilds a PO file if $(DOMAIN).pot has changed. -# Note that a PO file is not touched if it doesn't need to be changed. -$(POFILES): $(srcdir)/$(DOMAIN).pot - @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ - if test -f "$(srcdir)/$${lang}.po"; then \ - test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ - echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ - cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ - else \ - $(MAKE) $${lang}.po-create; \ - fi - - -install: install-exec install-data -install-exec: -install-data: install-data-@USE_NLS@ - if test "$(PACKAGE)" = "gettext-tools"; then \ - $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ - for file in $(DISTFILES.common) Makevars.template; do \ - $(INSTALL_DATA) $(srcdir)/$$file \ - $(DESTDIR)$(gettextsrcdir)/$$file; \ - done; \ - for file in Makevars; do \ - rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ - done; \ - else \ - : ; \ - fi -install-data-no: all -install-data-yes: all - $(mkdir_p) $(DESTDIR)$(datadir) - @catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ - dir=$(localedir)/$$lang/LC_MESSAGES; \ - $(mkdir_p) $(DESTDIR)$$dir; \ - if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ - $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ - echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ - for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ - if test -n "$$lc"; then \ - if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ - link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ - mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ - mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ - (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ - for file in *; do \ - if test -f $$file; then \ - ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ - fi; \ - done); \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ - else \ - if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ - :; \ - else \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ - mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ - fi; \ - fi; \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ - ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ - ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ - cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ - echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ - fi; \ - done; \ - done - -install-strip: install - -installdirs: installdirs-exec installdirs-data -installdirs-exec: -installdirs-data: installdirs-data-@USE_NLS@ - if test "$(PACKAGE)" = "gettext-tools"; then \ - $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ - else \ - : ; \ - fi -installdirs-data-no: -installdirs-data-yes: - $(mkdir_p) $(DESTDIR)$(datadir) - @catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ - dir=$(localedir)/$$lang/LC_MESSAGES; \ - $(mkdir_p) $(DESTDIR)$$dir; \ - for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ - if test -n "$$lc"; then \ - if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ - link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ - mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ - mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ - (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ - for file in *; do \ - if test -f $$file; then \ - ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ - fi; \ - done); \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ - else \ - if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ - :; \ - else \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ - mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ - fi; \ - fi; \ - fi; \ - done; \ - done - -# Define this as empty until I found a useful application. -installcheck: - -uninstall: uninstall-exec uninstall-data -uninstall-exec: -uninstall-data: uninstall-data-@USE_NLS@ - if test "$(PACKAGE)" = "gettext-tools"; then \ - for file in $(DISTFILES.common) Makevars.template; do \ - rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ - done; \ - else \ - : ; \ - fi -uninstall-data-no: -uninstall-data-yes: - catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ - for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ - rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ - done; \ - done - -check: all - -info dvi ps pdf html tags TAGS ctags CTAGS ID: - -mostlyclean: - rm -f remove-potcdate.sed - rm -f stamp-poT - rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po - rm -fr *.o - -clean: mostlyclean - -distclean: clean - rm -f Makefile Makefile.in POTFILES *.mo - -maintainer-clean: distclean - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - rm -f stamp-po $(GMOFILES) - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) -dist distdir: - $(MAKE) update-po - @$(MAKE) dist2 -# This is a separate target because 'update-po' must be executed before. -dist2: stamp-po $(DISTFILES) - dists="$(DISTFILES)"; \ - if test "$(PACKAGE)" = "gettext-tools"; then \ - dists="$$dists Makevars.template"; \ - fi; \ - if test -f $(srcdir)/$(DOMAIN).pot; then \ - dists="$$dists $(DOMAIN).pot stamp-po"; \ - fi; \ - if test -f $(srcdir)/ChangeLog; then \ - dists="$$dists ChangeLog"; \ - fi; \ - for i in 0 1 2 3 4 5 6 7 8 9; do \ - if test -f $(srcdir)/ChangeLog.$$i; then \ - dists="$$dists ChangeLog.$$i"; \ - fi; \ - done; \ - if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ - for file in $$dists; do \ - if test -f $$file; then \ - cp -p $$file $(distdir) || exit 1; \ - else \ - cp -p $(srcdir)/$$file $(distdir) || exit 1; \ - fi; \ - done - -update-po: Makefile - $(MAKE) $(DOMAIN).pot-update - test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) - $(MAKE) update-gmo - -# General rule for creating PO files. - -.nop.po-create: - @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ - echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ - exit 1 - -# General rule for updating PO files. - -.nop.po-update: - @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ - if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ - tmpdir=`pwd`; \ - echo "$$lang:"; \ - test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ - echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ - cd $(srcdir); \ - if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ - if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ - rm -f $$tmpdir/$$lang.new.po; \ - else \ - if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ - :; \ - else \ - echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ - exit 1; \ - fi; \ - fi; \ - else \ - echo "msgmerge for $$lang.po failed!" 1>&2; \ - rm -f $$tmpdir/$$lang.new.po; \ - fi - -$(DUMMYPOFILES): - -update-gmo: Makefile $(GMOFILES) - @: - -Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ - cd $(top_builddir) \ - && $(SHELL) ./config.status $(subdir)/$@.in po-directories - -force: - -# Tell versions [3.59,3.63) of GNU make not to export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/po/remove-potcdate.sin b/po/remove-potcdate.sin deleted file mode 100644 index 2436c49e..00000000 --- a/po/remove-potcdate.sin +++ /dev/null @@ -1,19 +0,0 @@ -# Sed script that remove the POT-Creation-Date line in the header entry -# from a POT file. -# -# The distinction between the first and the following occurrences of the -# pattern is achieved by looking at the hold space. -/^"POT-Creation-Date: .*"$/{ -x -# Test if the hold space is empty. -s/P/P/ -ta -# Yes it was empty. First occurrence. Remove the line. -g -d -bb -:a -# The hold space was nonempty. Following occurrences. Do nothing. -x -:b -} diff --git a/src/Makefile.am b/src/Makefile.am index 5866205e..ea40d5de 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -194,7 +194,6 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ resources/equipmentdb.cpp \ resources/equipmentdb.h \ resources/equipmentinfo.h \ - resources/gettext.h \ resources/image.cpp \ resources/image.h \ resources/imagewriter.cpp \ @@ -231,6 +230,7 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ utils/base64.h \ utils/dtor.h \ utils/fastsqrt.h \ + utils/gettext.h \ utils/minmax.h \ utils/strprintf.h \ utils/strprintf.cpp \ @@ -309,6 +309,5 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ # set the include path found by configure INCLUDES = \ $(all_includes) \ - -DHAS_CONFIG_H \ -DTMW_DATADIR=\""$(pkgdatadir)/"\" \ -DLOCALEDIR=\""$(localedir)"\" diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp index e31c87f6..2822faaa 100644 --- a/src/gui/inventorywindow.cpp +++ b/src/gui/inventorywindow.cpp @@ -39,9 +39,9 @@ #include "../item.h" #include "../localplayer.h" -#include "../resources/gettext.h" #include "../resources/iteminfo.h" +#include "../utils/gettext.h" #include "../utils/strprintf.h" InventoryWindow::InventoryWindow(): diff --git a/src/main.cpp b/src/main.cpp index 018d93dd..bde0877e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -85,13 +85,13 @@ #include "net/gameserver/gameserver.h" #include "resources/equipmentdb.h" -#include "resources/gettext.h" #include "resources/image.h" #include "resources/itemdb.h" #include "resources/monsterdb.h" #include "resources/resourcemanager.h" #include "utils/dtor.h" +#include "utils/gettext.h" #include "utils/tostring.h" std::string token; //used to store magic_token diff --git a/src/resources/gettext.h b/src/resources/gettext.h deleted file mode 100644 index 9abb5771..00000000 --- a/src/resources/gettext.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * The Mana World - * Copyright 2007 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#ifndef _TMW_RESOURCES_GETTEXT_H -#define _TMW_RESOURCES_GETTEXT_H - -#ifdef HAS_CONFIG_H -#include "../../config.h" -#endif - -#if ENABLE_NLS - -#include - -#define _(s) ((char const *)gettext(s)) -#define N_(s) ((char const *)s) - -#else - -#define gettext(s) ((char const *)s) -#define _(s) ((char const *)s) -#define N_(s) ((char const *)s) - -#endif - -#endif diff --git a/src/utils/gettext.h b/src/utils/gettext.h new file mode 100644 index 00000000..72533850 --- /dev/null +++ b/src/utils/gettext.h @@ -0,0 +1,46 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_UTILS_GETTEXT_H +#define _TMW_UTILS_GETTEXT_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#if ENABLE_NLS + +#include + +#define _(s) ((char const *)gettext(s)) +#define N_(s) ((char const *)s) + +#else + +#define gettext(s) ((char const *)s) +#define _(s) ((char const *)s) +#define N_(s) ((char const *)s) + +#endif + +#endif diff --git a/src/utils/strprintf.h b/src/utils/strprintf.h index 4b5974a6..a1fb0f13 100644 --- a/src/utils/strprintf.h +++ b/src/utils/strprintf.h @@ -22,7 +22,7 @@ */ #ifndef _TMW_UTILS_STRPRINTF_H -#define _TMW_UTISL_STRPRINTF_H +#define _TMW_UTILS_STRPRINTF_H #include diff --git a/src/utils/tostring.h b/src/utils/tostring.h index 8fc6d105..95b8985f 100644 --- a/src/utils/tostring.h +++ b/src/utils/tostring.h @@ -22,7 +22,7 @@ */ #ifndef _TMW_UTILS_TOSTRING_H -#define _TMW_UTISL_TOSTRING_H +#define _TMW_UTILS_TOSTRING_H #include -- cgit v1.2.3-70-g09d2 From 68f069fea3182c6d5720df03f1d63de38f14c31d Mon Sep 17 00:00:00 2001 From: Guillaume Melquiond Date: Mon, 13 Aug 2007 21:09:12 +0000 Subject: Fixed svn properties. --- src/channel.cpp | 120 +++--- src/channel.h | 82 ++--- src/channelmanager.cpp | 172 ++++----- src/channelmanager.h | 88 ++--- src/gui/serverdialog.cpp | 2 +- src/gui/serverdialog.h | 2 +- src/particleemitter.cpp | 654 ++++++++++++++++----------------- src/particleemitter.h | 240 ++++++------ src/resources/equipmentdb.cpp | 312 ++++++++-------- src/resources/equipmentinfo.h | 104 +++--- src/resources/itemdb.cpp | 298 +++++++-------- src/resources/itemdb.h | 106 +++--- src/resources/monsterdb.cpp | 350 +++++++++--------- src/resources/monsterinfo.cpp | 140 +++---- src/resources/monsterinfo.h | 2 +- src/resources/openglsdlimageloader.cpp | 2 +- src/resources/openglsdlimageloader.h | 2 +- src/utils/fastsqrt.h | 48 +-- src/utils/minmax.h | 94 ++--- 19 files changed, 1409 insertions(+), 1409 deletions(-) (limited to 'src/utils') diff --git a/src/channel.cpp b/src/channel.cpp index ae79d7a7..170dbf5e 100644 --- a/src/channel.cpp +++ b/src/channel.cpp @@ -1,60 +1,60 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - - -#include "channel.h" - -Channel::Channel(short id) : -mID(id) -{ - -} - -std::string Channel::getName() const -{ - return mName; -} - -void Channel::setName(const std::string &channelName) -{ - mName = channelName; -} - -const short Channel::getId() const -{ - return mID; -} - -const int Channel::getUserListSize() const -{ - return userList.size(); -} - -std::string Channel::getUser(unsigned int id) const -{ - if(id <= userList.size()) - { - return userList[id]; - } - return ""; -} +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + + +#include "channel.h" + +Channel::Channel(short id) : +mID(id) +{ + +} + +std::string Channel::getName() const +{ + return mName; +} + +void Channel::setName(const std::string &channelName) +{ + mName = channelName; +} + +const short Channel::getId() const +{ + return mID; +} + +const int Channel::getUserListSize() const +{ + return userList.size(); +} + +std::string Channel::getUser(unsigned int id) const +{ + if(id <= userList.size()) + { + return userList[id]; + } + return ""; +} diff --git a/src/channel.h b/src/channel.h index 2845eb39..0a62e073 100644 --- a/src/channel.h +++ b/src/channel.h @@ -1,41 +1,41 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include -#include - -class Channel -{ - public: - Channel(short id); - std::string getName() const; - void setName(const std::string &channelName); - const short getId() const; - const int getUserListSize() const; - std::string getUser(unsigned int i) const; - private: - typedef std::vector Users; - std::string mName; - short mID; - Users userList; -}; +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include +#include + +class Channel +{ + public: + Channel(short id); + std::string getName() const; + void setName(const std::string &channelName); + const short getId() const; + const int getUserListSize() const; + std::string getUser(unsigned int i) const; + private: + typedef std::vector Users; + std::string mName; + short mID; + Users userList; +}; diff --git a/src/channelmanager.cpp b/src/channelmanager.cpp index 352b3ab5..07dc2bbf 100644 --- a/src/channelmanager.cpp +++ b/src/channelmanager.cpp @@ -1,86 +1,86 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include - -#include "channelmanager.h" -#include "channel.h" - -#include "utils/dtor.h" - -ChannelManager::ChannelManager() -{ - -} - -ChannelManager::~ChannelManager() -{ - for_each(mChannels.begin(), mChannels.end(), make_dtor(mChannels)); - mChannels.clear(); -} - -Channel* ChannelManager::findById(int id) -{ - Channel* channel; - for(std::list::iterator itr = mChannels.begin(); - itr != mChannels.end(); - itr++) - { - channel = (*itr); - if(channel->getId() == id) - { - return channel; - } - } - return NULL; -} - -Channel* ChannelManager::findByName(std::string name) -{ - Channel* channel; - if(name != "") - { - for(std::list::iterator itr = mChannels.begin(); - itr != mChannels.end(); - itr++) - { - channel = (*itr); - if(channel->getName() == name) - { - return channel; - } - } - } - return NULL; -} - -void ChannelManager::addChannel(Channel *channel) -{ - mChannels.push_back(channel); -} - -void ChannelManager::removeChannel(Channel *channel) -{ - mChannels.remove(channel); - delete channel; -} +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include + +#include "channelmanager.h" +#include "channel.h" + +#include "utils/dtor.h" + +ChannelManager::ChannelManager() +{ + +} + +ChannelManager::~ChannelManager() +{ + for_each(mChannels.begin(), mChannels.end(), make_dtor(mChannels)); + mChannels.clear(); +} + +Channel* ChannelManager::findById(int id) +{ + Channel* channel; + for(std::list::iterator itr = mChannels.begin(); + itr != mChannels.end(); + itr++) + { + channel = (*itr); + if(channel->getId() == id) + { + return channel; + } + } + return NULL; +} + +Channel* ChannelManager::findByName(std::string name) +{ + Channel* channel; + if(name != "") + { + for(std::list::iterator itr = mChannels.begin(); + itr != mChannels.end(); + itr++) + { + channel = (*itr); + if(channel->getName() == name) + { + return channel; + } + } + } + return NULL; +} + +void ChannelManager::addChannel(Channel *channel) +{ + mChannels.push_back(channel); +} + +void ChannelManager::removeChannel(Channel *channel) +{ + mChannels.remove(channel); + delete channel; +} diff --git a/src/channelmanager.h b/src/channelmanager.h index 75c86a93..3ad8f0b8 100644 --- a/src/channelmanager.h +++ b/src/channelmanager.h @@ -1,44 +1,44 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#ifndef _TMW_CHANNELMANAGER_H -#define _TMW_CHANNELMANAGER_H - -class Channel; - -class ChannelManager -{ -public: - ChannelManager(); - ~ChannelManager(); - Channel* findById(int id); - Channel* findByName(std::string name); - void addChannel(Channel *channel); - void removeChannel(Channel *channel); -private: - std::list mChannels; -}; - -extern ChannelManager *channelManager; - -#endif +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_CHANNELMANAGER_H +#define _TMW_CHANNELMANAGER_H + +class Channel; + +class ChannelManager +{ +public: + ChannelManager(); + ~ChannelManager(); + Channel* findById(int id); + Channel* findByName(std::string name); + void addChannel(Channel *channel); + void removeChannel(Channel *channel); +private: + std::list mChannels; +}; + +extern ChannelManager *channelManager; + +#endif diff --git a/src/gui/serverdialog.cpp b/src/gui/serverdialog.cpp index 2eada7ad..292e8fca 100644 --- a/src/gui/serverdialog.cpp +++ b/src/gui/serverdialog.cpp @@ -18,7 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: login.cpp 2550 2006-08-20 00:56:23Z b_lindeijer $ + * $Id$ */ #include "serverdialog.h" diff --git a/src/gui/serverdialog.h b/src/gui/serverdialog.h index 2bb0609f..ae81cb2d 100644 --- a/src/gui/serverdialog.h +++ b/src/gui/serverdialog.h @@ -18,7 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: login.h 2486 2006-07-30 14:33:28Z b_lindeijer $ + * $Id$ */ #ifndef _TMW_SERVERDIALOG_H diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp index 5b5e86b9..60a98cc5 100644 --- a/src/particleemitter.cpp +++ b/src/particleemitter.cpp @@ -1,327 +1,327 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include "particleemitter.h" - -#include "animationparticle.h" -#include "imageparticle.h" -#include "log.h" -#include "particle.h" - -#include "resources/animation.h" -#include "resources/image.h" -#include "resources/resourcemanager.h" -#include "resources/imageset.h" - -#include - -#define SIN45 0.707106781f -#define DEG_RAD_FACTOR 0.017453293f - -ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map): - mParticleImage(0) -{ - mMap = map; - mParticleTarget = target; - - //initializing default values - mParticlePosX.set(0.0f); - mParticlePosY.set(0.0f); - mParticlePosZ.set(0.0f); - mParticleAngleHorizontal.set(0.0f); - mParticleAngleVertical.set(0.0f); - mParticlePower.set(0.0f); - mParticleGravity.set(0.0f); - mParticleRandomnes.set(0); - mParticleBounce.set(0.0f); - mParticleAcceleration.set(0.0f); - mParticleDieDistance.set(-1.0f); - mParticleMomentum.set(1.0f); - mParticleLifetime.set(-1); - mParticleFadeOut.set(0); - mParticleFadeIn.set(0); - mOutput.set(1); - - for_each_xml_child_node(propertyNode, emitterNode) - { - if (xmlStrEqual(propertyNode->name, BAD_CAST "property")) - { - std::string name = XML::getProperty(propertyNode, "name", ""); - - if (name == "position-x") - { - mParticlePosX = readMinMax(propertyNode, 0.0f); - } - else if (name == "position-y") - { - - mParticlePosY = readMinMax(propertyNode, 0.0f); - mParticlePosY.minVal *= SIN45; - mParticlePosY.maxVal *= SIN45; - } - else if (name == "position-z") - { - mParticlePosZ = readMinMax(propertyNode, 0.0f); - mParticlePosZ.minVal *= SIN45; - mParticlePosZ.maxVal *= SIN45; - } - else if (name == "image") - { - std::string image = XML::getProperty(propertyNode, "value", ""); - // Don't leak when multiple images are defined - if (image != "" && !mParticleImage) - { - ResourceManager *resman = ResourceManager::getInstance(); - mParticleImage = resman->getImage(image); - } - } - else if (name == "horizontal-angle") - { - mParticleAngleHorizontal = readMinMax(propertyNode, 0.0f); - mParticleAngleHorizontal.minVal *= DEG_RAD_FACTOR; - mParticleAngleHorizontal.maxVal *= DEG_RAD_FACTOR; - } - else if (name == "vertical-angle") - { - mParticleAngleVertical = readMinMax(propertyNode, 0.0f); - mParticleAngleVertical.minVal *= DEG_RAD_FACTOR; - mParticleAngleVertical.maxVal *= DEG_RAD_FACTOR; - } - else if (name == "power") - { - mParticlePower = readMinMax(propertyNode, 0.0f); - } - else if (name == "gravity") - { - mParticleGravity = readMinMax(propertyNode, 0.0f); - } - else if (name == "randomnes") - { - mParticleRandomnes = readMinMax(propertyNode, 0); - } - else if (name == "bounce") - { - mParticleBounce = readMinMax(propertyNode, 0.0f); - } - else if (name == "lifetime") - { - mParticleLifetime = readMinMax(propertyNode, 0); - mParticleLifetime.minVal += 1; - } - else if (name == "output") - { - mOutput = readMinMax(propertyNode, 0); - mOutput.maxVal +=1; - } - else if (name == "acceleration") - { - mParticleAcceleration = readMinMax(propertyNode, 0.0f); - } - else if (name == "die-distance") - { - mParticleDieDistance = readMinMax(propertyNode, 0.0f); - } - else if (name == "momentum") - { - mParticleMomentum = readMinMax(propertyNode, 1.0f); - } - else if (name == "fade-out") - { - mParticleFadeOut = readMinMax(propertyNode, 0); - } - else if (name == "fade-in") - { - mParticleFadeIn = readMinMax(propertyNode, 0); - } - else - { - logger->log("Particle Engine: Warning, unknown emitter property \"%s\"", - name.c_str() - ); - } - } - else if (xmlStrEqual(propertyNode->name, BAD_CAST "emitter")) - { - ParticleEmitter newEmitter(propertyNode, mParticleTarget, map); - mParticleChildEmitters.push_back(newEmitter); - } - else if (xmlStrEqual(propertyNode->name, BAD_CAST "animation")) - { - ImageSet *imageset = ResourceManager::getInstance()->getImageSet( - XML::getProperty(propertyNode, "imageset", ""), - XML::getProperty(propertyNode, "width", 0), - XML::getProperty(propertyNode, "height", 0) - ); - - // Get animation frames - for_each_xml_child_node(frameNode, propertyNode) - { - int delay = XML::getProperty(frameNode, "delay", 0); - int offsetX = XML::getProperty(frameNode, "offsetX", 0); - int offsetY = XML::getProperty(frameNode, "offsetY", 0); - offsetY -= imageset->getHeight() - 32; - offsetX -= imageset->getWidth() / 2 - 16; - - if (xmlStrEqual(frameNode->name, BAD_CAST "frame")) - { - int index = XML::getProperty(frameNode, "index", -1); - - if (index < 0) - { - logger->log("No valid value for 'index'"); - continue; - } - - Image *img = imageset->get(index); - - if (!img) - { - logger->log("No image at index " + (index)); - continue; - } - - mParticleAnimation.addFrame(img, delay, offsetX, offsetY); - } - else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) - { - int start = XML::getProperty(frameNode, "start", -1); - int end = XML::getProperty(frameNode, "end", -1); - - if (start < 0 || end < 0) - { - logger->log("No valid value for 'start' or 'end'"); - continue; - } - - while (end >= start) - { - Image *img = imageset->get(start); - - if (!img) - { - logger->log("No image at index " + - (start)); - continue; - } - - mParticleAnimation.addFrame(img, delay, offsetX, offsetY); - start++; - } - } - else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) - { - mParticleAnimation.addTerminator(); - } - } // for frameNode - } - } -} - - -ParticleEmitter::~ParticleEmitter() -{ -} - - -template MinMax -ParticleEmitter::readMinMax(xmlNodePtr propertyNode, T def) -{ - MinMax retval; - - def = (T)XML::getFloatProperty(propertyNode, "value", (double)def); - retval.set ( (T)XML::getFloatProperty(propertyNode, "min", (double)def), - (T)XML::getFloatProperty(propertyNode, "max", (double)def) - ); - - return retval; -} - - -std::list -ParticleEmitter::createParticles() -{ - std::list newParticles; - - for (int i = mOutput.value(); i > 0; i--) - { - // Limit maximum particles - if (Particle::particleCount > Particle::maxCount) break; - - Particle *newParticle; - if (mParticleImage) - { - newParticle = new ImageParticle(mMap, mParticleImage); - } - else if (mParticleAnimation.getLength() > 0) - { - Animation *newAnimation = new Animation(mParticleAnimation); - newParticle = new AnimationParticle(mMap, newAnimation); - } - else - { - newParticle = new Particle(mMap); - } - - - newParticle->setPosition( - mParticlePosX.value(), - mParticlePosY.value(), - mParticlePosZ.value() - ); - - float angleH = mParticleAngleHorizontal.value(); - float angleV = mParticleAngleVertical.value(); - float power = mParticlePower.value(); - newParticle->setVector( - cos(angleH) * cos(angleV) * power, - sin(angleH) * cos(angleV) * power, - sin(angleV) * power - ); - - newParticle->setRandomnes(mParticleRandomnes.value()); - newParticle->setGravity(mParticleGravity.value()); - newParticle->setBounce(mParticleBounce.value()); - - newParticle->setDestination(mParticleTarget, - mParticleAcceleration.value(), - mParticleMomentum.value() - ); - newParticle->setDieDistance(mParticleDieDistance.value()); - - newParticle->setLifetime(mParticleLifetime.value()); - newParticle->setFadeOut(mParticleFadeOut.value()); - newParticle->setFadeIn(mParticleFadeIn.value()); - - for ( std::list::iterator i = mParticleChildEmitters.begin(); - i != mParticleChildEmitters.end(); - i++ - ) - { - newParticle->addEmitter(new ParticleEmitter(*i)); - } - - newParticles.push_back(newParticle); - } - - return newParticles; -} +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "particleemitter.h" + +#include "animationparticle.h" +#include "imageparticle.h" +#include "log.h" +#include "particle.h" + +#include "resources/animation.h" +#include "resources/image.h" +#include "resources/resourcemanager.h" +#include "resources/imageset.h" + +#include + +#define SIN45 0.707106781f +#define DEG_RAD_FACTOR 0.017453293f + +ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map): + mParticleImage(0) +{ + mMap = map; + mParticleTarget = target; + + //initializing default values + mParticlePosX.set(0.0f); + mParticlePosY.set(0.0f); + mParticlePosZ.set(0.0f); + mParticleAngleHorizontal.set(0.0f); + mParticleAngleVertical.set(0.0f); + mParticlePower.set(0.0f); + mParticleGravity.set(0.0f); + mParticleRandomnes.set(0); + mParticleBounce.set(0.0f); + mParticleAcceleration.set(0.0f); + mParticleDieDistance.set(-1.0f); + mParticleMomentum.set(1.0f); + mParticleLifetime.set(-1); + mParticleFadeOut.set(0); + mParticleFadeIn.set(0); + mOutput.set(1); + + for_each_xml_child_node(propertyNode, emitterNode) + { + if (xmlStrEqual(propertyNode->name, BAD_CAST "property")) + { + std::string name = XML::getProperty(propertyNode, "name", ""); + + if (name == "position-x") + { + mParticlePosX = readMinMax(propertyNode, 0.0f); + } + else if (name == "position-y") + { + + mParticlePosY = readMinMax(propertyNode, 0.0f); + mParticlePosY.minVal *= SIN45; + mParticlePosY.maxVal *= SIN45; + } + else if (name == "position-z") + { + mParticlePosZ = readMinMax(propertyNode, 0.0f); + mParticlePosZ.minVal *= SIN45; + mParticlePosZ.maxVal *= SIN45; + } + else if (name == "image") + { + std::string image = XML::getProperty(propertyNode, "value", ""); + // Don't leak when multiple images are defined + if (image != "" && !mParticleImage) + { + ResourceManager *resman = ResourceManager::getInstance(); + mParticleImage = resman->getImage(image); + } + } + else if (name == "horizontal-angle") + { + mParticleAngleHorizontal = readMinMax(propertyNode, 0.0f); + mParticleAngleHorizontal.minVal *= DEG_RAD_FACTOR; + mParticleAngleHorizontal.maxVal *= DEG_RAD_FACTOR; + } + else if (name == "vertical-angle") + { + mParticleAngleVertical = readMinMax(propertyNode, 0.0f); + mParticleAngleVertical.minVal *= DEG_RAD_FACTOR; + mParticleAngleVertical.maxVal *= DEG_RAD_FACTOR; + } + else if (name == "power") + { + mParticlePower = readMinMax(propertyNode, 0.0f); + } + else if (name == "gravity") + { + mParticleGravity = readMinMax(propertyNode, 0.0f); + } + else if (name == "randomnes") + { + mParticleRandomnes = readMinMax(propertyNode, 0); + } + else if (name == "bounce") + { + mParticleBounce = readMinMax(propertyNode, 0.0f); + } + else if (name == "lifetime") + { + mParticleLifetime = readMinMax(propertyNode, 0); + mParticleLifetime.minVal += 1; + } + else if (name == "output") + { + mOutput = readMinMax(propertyNode, 0); + mOutput.maxVal +=1; + } + else if (name == "acceleration") + { + mParticleAcceleration = readMinMax(propertyNode, 0.0f); + } + else if (name == "die-distance") + { + mParticleDieDistance = readMinMax(propertyNode, 0.0f); + } + else if (name == "momentum") + { + mParticleMomentum = readMinMax(propertyNode, 1.0f); + } + else if (name == "fade-out") + { + mParticleFadeOut = readMinMax(propertyNode, 0); + } + else if (name == "fade-in") + { + mParticleFadeIn = readMinMax(propertyNode, 0); + } + else + { + logger->log("Particle Engine: Warning, unknown emitter property \"%s\"", + name.c_str() + ); + } + } + else if (xmlStrEqual(propertyNode->name, BAD_CAST "emitter")) + { + ParticleEmitter newEmitter(propertyNode, mParticleTarget, map); + mParticleChildEmitters.push_back(newEmitter); + } + else if (xmlStrEqual(propertyNode->name, BAD_CAST "animation")) + { + ImageSet *imageset = ResourceManager::getInstance()->getImageSet( + XML::getProperty(propertyNode, "imageset", ""), + XML::getProperty(propertyNode, "width", 0), + XML::getProperty(propertyNode, "height", 0) + ); + + // Get animation frames + for_each_xml_child_node(frameNode, propertyNode) + { + int delay = XML::getProperty(frameNode, "delay", 0); + int offsetX = XML::getProperty(frameNode, "offsetX", 0); + int offsetY = XML::getProperty(frameNode, "offsetY", 0); + offsetY -= imageset->getHeight() - 32; + offsetX -= imageset->getWidth() / 2 - 16; + + if (xmlStrEqual(frameNode->name, BAD_CAST "frame")) + { + int index = XML::getProperty(frameNode, "index", -1); + + if (index < 0) + { + logger->log("No valid value for 'index'"); + continue; + } + + Image *img = imageset->get(index); + + if (!img) + { + logger->log("No image at index " + (index)); + continue; + } + + mParticleAnimation.addFrame(img, delay, offsetX, offsetY); + } + else if (xmlStrEqual(frameNode->name, BAD_CAST "sequence")) + { + int start = XML::getProperty(frameNode, "start", -1); + int end = XML::getProperty(frameNode, "end", -1); + + if (start < 0 || end < 0) + { + logger->log("No valid value for 'start' or 'end'"); + continue; + } + + while (end >= start) + { + Image *img = imageset->get(start); + + if (!img) + { + logger->log("No image at index " + + (start)); + continue; + } + + mParticleAnimation.addFrame(img, delay, offsetX, offsetY); + start++; + } + } + else if (xmlStrEqual(frameNode->name, BAD_CAST "end")) + { + mParticleAnimation.addTerminator(); + } + } // for frameNode + } + } +} + + +ParticleEmitter::~ParticleEmitter() +{ +} + + +template MinMax +ParticleEmitter::readMinMax(xmlNodePtr propertyNode, T def) +{ + MinMax retval; + + def = (T)XML::getFloatProperty(propertyNode, "value", (double)def); + retval.set ( (T)XML::getFloatProperty(propertyNode, "min", (double)def), + (T)XML::getFloatProperty(propertyNode, "max", (double)def) + ); + + return retval; +} + + +std::list +ParticleEmitter::createParticles() +{ + std::list newParticles; + + for (int i = mOutput.value(); i > 0; i--) + { + // Limit maximum particles + if (Particle::particleCount > Particle::maxCount) break; + + Particle *newParticle; + if (mParticleImage) + { + newParticle = new ImageParticle(mMap, mParticleImage); + } + else if (mParticleAnimation.getLength() > 0) + { + Animation *newAnimation = new Animation(mParticleAnimation); + newParticle = new AnimationParticle(mMap, newAnimation); + } + else + { + newParticle = new Particle(mMap); + } + + + newParticle->setPosition( + mParticlePosX.value(), + mParticlePosY.value(), + mParticlePosZ.value() + ); + + float angleH = mParticleAngleHorizontal.value(); + float angleV = mParticleAngleVertical.value(); + float power = mParticlePower.value(); + newParticle->setVector( + cos(angleH) * cos(angleV) * power, + sin(angleH) * cos(angleV) * power, + sin(angleV) * power + ); + + newParticle->setRandomnes(mParticleRandomnes.value()); + newParticle->setGravity(mParticleGravity.value()); + newParticle->setBounce(mParticleBounce.value()); + + newParticle->setDestination(mParticleTarget, + mParticleAcceleration.value(), + mParticleMomentum.value() + ); + newParticle->setDieDistance(mParticleDieDistance.value()); + + newParticle->setLifetime(mParticleLifetime.value()); + newParticle->setFadeOut(mParticleFadeOut.value()); + newParticle->setFadeIn(mParticleFadeIn.value()); + + for ( std::list::iterator i = mParticleChildEmitters.begin(); + i != mParticleChildEmitters.end(); + i++ + ) + { + newParticle->addEmitter(new ParticleEmitter(*i)); + } + + newParticles.push_back(newParticle); + } + + return newParticles; +} diff --git a/src/particleemitter.h b/src/particleemitter.h index ca6d8622..37d067a6 100644 --- a/src/particleemitter.h +++ b/src/particleemitter.h @@ -1,120 +1,120 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#ifndef _PARTICLEEMITTER_H -#define _PARTICLEEMITTER_H - -#include - -#include "utils/xml.h" -#include "utils/minmax.h" - -#include "resources/animation.h" - -class Image; -class Map; -class Particle; - -/** - * Every Particle can have one or more particle emitters that create new - * particles when they are updated - */ -class ParticleEmitter -{ - public: - /** - * Constructor. - */ - ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map); - - /** - * Destructor. - */ - ~ParticleEmitter(); - - /** - * Spawns new particles - * @return: a list of created particles - */ - std::list createParticles(); - - /** - * Sets the target of the particles that are created - */ - void - setTarget(Particle *target) - { mParticleTarget = target; }; - - private: - template MinMax readMinMax(xmlNodePtr propertyNode, T def); - - /** - * initial position of particles: - */ - MinMax mParticlePosX, mParticlePosY, mParticlePosZ; - - /** - * initial vector of particles: - */ - MinMax mParticleAngleHorizontal, mParticleAngleVertical; - - /** - * Initial velocity of particles - */ - MinMax mParticlePower; - - /* - * Vector changing of particles: - */ - MinMax mParticleGravity; - MinMax mParticleRandomnes; - MinMax mParticleBounce; - - /* - * Properties of targeting particles: - */ - Particle *mParticleTarget; - MinMax mParticleAcceleration; - MinMax mParticleDieDistance; - MinMax mParticleMomentum; - - /* - * Behavior over time of the particles: - */ - MinMax mParticleLifetime; - MinMax mParticleFadeOut; - MinMax mParticleFadeIn; - - Map *mMap; /**< Map the particles are spawned on */ - - MinMax mOutput; /**< Number of particles spawned per update */ - - Image *mParticleImage; /**< Particle image, if used */ - - /** Filename of particle animation file */ - Animation mParticleAnimation; - - /** List of emitters the spawned particles are equipped with */ - std::list mParticleChildEmitters; -}; -#endif +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _PARTICLEEMITTER_H +#define _PARTICLEEMITTER_H + +#include + +#include "utils/xml.h" +#include "utils/minmax.h" + +#include "resources/animation.h" + +class Image; +class Map; +class Particle; + +/** + * Every Particle can have one or more particle emitters that create new + * particles when they are updated + */ +class ParticleEmitter +{ + public: + /** + * Constructor. + */ + ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map); + + /** + * Destructor. + */ + ~ParticleEmitter(); + + /** + * Spawns new particles + * @return: a list of created particles + */ + std::list createParticles(); + + /** + * Sets the target of the particles that are created + */ + void + setTarget(Particle *target) + { mParticleTarget = target; }; + + private: + template MinMax readMinMax(xmlNodePtr propertyNode, T def); + + /** + * initial position of particles: + */ + MinMax mParticlePosX, mParticlePosY, mParticlePosZ; + + /** + * initial vector of particles: + */ + MinMax mParticleAngleHorizontal, mParticleAngleVertical; + + /** + * Initial velocity of particles + */ + MinMax mParticlePower; + + /* + * Vector changing of particles: + */ + MinMax mParticleGravity; + MinMax mParticleRandomnes; + MinMax mParticleBounce; + + /* + * Properties of targeting particles: + */ + Particle *mParticleTarget; + MinMax mParticleAcceleration; + MinMax mParticleDieDistance; + MinMax mParticleMomentum; + + /* + * Behavior over time of the particles: + */ + MinMax mParticleLifetime; + MinMax mParticleFadeOut; + MinMax mParticleFadeIn; + + Map *mMap; /**< Map the particles are spawned on */ + + MinMax mOutput; /**< Number of particles spawned per update */ + + Image *mParticleImage; /**< Particle image, if used */ + + /** Filename of particle animation file */ + Animation mParticleAnimation; + + /** List of emitters the spawned particles are equipped with */ + std::list mParticleChildEmitters; +}; +#endif diff --git a/src/resources/equipmentdb.cpp b/src/resources/equipmentdb.cpp index 64982ce3..38ac6415 100644 --- a/src/resources/equipmentdb.cpp +++ b/src/resources/equipmentdb.cpp @@ -1,156 +1,156 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include "equipmentdb.h" - -#include "resourcemanager.h" - -#include "../log.h" - -#include "../utils/dtor.h" -#include "../utils/xml.h" - -namespace -{ - EquipmentDB::EquipmentInfos mEquipmentInfos; - EquipmentInfo mUnknown; - bool mLoaded = false; -} - -void -EquipmentDB::load() -{ - if (mLoaded) - return; - - logger->log("Initializing equipment database..."); - mUnknown.setSprite("error.xml", 0); - mUnknown.setSprite("error.xml", 1); - - ResourceManager *resman = ResourceManager::getInstance(); - int size; - char *data = (char*)resman->loadFile("equipment.xml", size); - - if (!data) - { - logger->error("Equipment Database: Could not find equipment.xml!"); - } - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); - - if (!doc) - { - logger->error("Equipment Database: Error while parsing equipment database (equipment.xml)!"); - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); - if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "equipments")) - { - logger->error("Equipment Database: equipment.xml is not a valid database file!"); - } - - //iterate s - for_each_xml_child_node(equipmentNode, rootNode) - { - if (!xmlStrEqual(equipmentNode->name, BAD_CAST "equipment")) - { - continue; - } - - EquipmentInfo *currentInfo = new EquipmentInfo(); - - currentInfo->setSlot (XML::getProperty(equipmentNode, "slot", 0)); - - //iterate s - for_each_xml_child_node(spriteNode, equipmentNode) - { - if (!xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) - { - continue; - } - - std::string gender = XML::getProperty(spriteNode, "gender", "unisex"); - std::string filename = (const char*) spriteNode->xmlChildrenNode->content; - - if (gender == "male" || gender == "unisex") - { - currentInfo->setSprite(filename, 0); - } - - if (gender == "female" || gender == "unisex") - { - currentInfo->setSprite(filename, 1); - } - } - - setEquipment( XML::getProperty(equipmentNode, "id", 0), - currentInfo); - } - - mLoaded = true; -} - -void -EquipmentDB::unload() -{ - // kill EquipmentInfos - for_each ( mEquipmentInfos.begin(), mEquipmentInfos.end(), - make_dtor(mEquipmentInfos)); - mEquipmentInfos.clear(); - - mLoaded = false; -} - -EquipmentInfo* -EquipmentDB::get(int id) -{ - if (!mLoaded) { - logger->error("Error: Equipment database used before initialization!"); - } - - EquipmentInfoIterator i = mEquipmentInfos.find(id); - - if (i == mEquipmentInfos.end() ) - { - logger->log("EquipmentDB: Error, unknown equipment ID# %d", id); - return &mUnknown; - } - else - { - return i->second; - } -} - -void -EquipmentDB::setEquipment(int id, EquipmentInfo* equipmentInfo) -{ - if (mEquipmentInfos.find(id) != mEquipmentInfos.end()) { - logger->log("Warning: Equipment Piece with ID %d defined multiple times", - id); - delete equipmentInfo; - } - else { - mEquipmentInfos[id] = equipmentInfo; - }; -} +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "equipmentdb.h" + +#include "resourcemanager.h" + +#include "../log.h" + +#include "../utils/dtor.h" +#include "../utils/xml.h" + +namespace +{ + EquipmentDB::EquipmentInfos mEquipmentInfos; + EquipmentInfo mUnknown; + bool mLoaded = false; +} + +void +EquipmentDB::load() +{ + if (mLoaded) + return; + + logger->log("Initializing equipment database..."); + mUnknown.setSprite("error.xml", 0); + mUnknown.setSprite("error.xml", 1); + + ResourceManager *resman = ResourceManager::getInstance(); + int size; + char *data = (char*)resman->loadFile("equipment.xml", size); + + if (!data) + { + logger->error("Equipment Database: Could not find equipment.xml!"); + } + + xmlDocPtr doc = xmlParseMemory(data, size); + free(data); + + if (!doc) + { + logger->error("Equipment Database: Error while parsing equipment database (equipment.xml)!"); + } + + xmlNodePtr rootNode = xmlDocGetRootElement(doc); + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "equipments")) + { + logger->error("Equipment Database: equipment.xml is not a valid database file!"); + } + + //iterate s + for_each_xml_child_node(equipmentNode, rootNode) + { + if (!xmlStrEqual(equipmentNode->name, BAD_CAST "equipment")) + { + continue; + } + + EquipmentInfo *currentInfo = new EquipmentInfo(); + + currentInfo->setSlot (XML::getProperty(equipmentNode, "slot", 0)); + + //iterate s + for_each_xml_child_node(spriteNode, equipmentNode) + { + if (!xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) + { + continue; + } + + std::string gender = XML::getProperty(spriteNode, "gender", "unisex"); + std::string filename = (const char*) spriteNode->xmlChildrenNode->content; + + if (gender == "male" || gender == "unisex") + { + currentInfo->setSprite(filename, 0); + } + + if (gender == "female" || gender == "unisex") + { + currentInfo->setSprite(filename, 1); + } + } + + setEquipment( XML::getProperty(equipmentNode, "id", 0), + currentInfo); + } + + mLoaded = true; +} + +void +EquipmentDB::unload() +{ + // kill EquipmentInfos + for_each ( mEquipmentInfos.begin(), mEquipmentInfos.end(), + make_dtor(mEquipmentInfos)); + mEquipmentInfos.clear(); + + mLoaded = false; +} + +EquipmentInfo* +EquipmentDB::get(int id) +{ + if (!mLoaded) { + logger->error("Error: Equipment database used before initialization!"); + } + + EquipmentInfoIterator i = mEquipmentInfos.find(id); + + if (i == mEquipmentInfos.end() ) + { + logger->log("EquipmentDB: Error, unknown equipment ID# %d", id); + return &mUnknown; + } + else + { + return i->second; + } +} + +void +EquipmentDB::setEquipment(int id, EquipmentInfo* equipmentInfo) +{ + if (mEquipmentInfos.find(id) != mEquipmentInfos.end()) { + logger->log("Warning: Equipment Piece with ID %d defined multiple times", + id); + delete equipmentInfo; + } + else { + mEquipmentInfos[id] = equipmentInfo; + }; +} diff --git a/src/resources/equipmentinfo.h b/src/resources/equipmentinfo.h index 93a1cb42..75ed1b8a 100644 --- a/src/resources/equipmentinfo.h +++ b/src/resources/equipmentinfo.h @@ -1,52 +1,52 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: - */ - -#ifndef _TMW_EQUIPMENTINFO_H_ -#define _TMW_EQUIPMENTINFO_H_ - -#include -#include - -class EquipmentInfo -{ - public: - EquipmentInfo(): - mSlot (0) - { - }; - - void - setSlot (int slot) { mSlot = slot; }; - - const std::string& - getSprite(int gender) {return animationFiles[gender]; }; - - void - setSprite(std::string animationFile, int gender) {animationFiles[gender] = animationFile; }; - - private: - int mSlot; //not used at the moment but maybe useful on our own server - std::map animationFiles; -}; - -#endif +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: + */ + +#ifndef _TMW_EQUIPMENTINFO_H_ +#define _TMW_EQUIPMENTINFO_H_ + +#include +#include + +class EquipmentInfo +{ + public: + EquipmentInfo(): + mSlot (0) + { + }; + + void + setSlot (int slot) { mSlot = slot; }; + + const std::string& + getSprite(int gender) {return animationFiles[gender]; }; + + void + setSprite(std::string animationFile, int gender) {animationFiles[gender] = animationFile; }; + + private: + int mSlot; //not used at the moment but maybe useful on our own server + std::map animationFiles; +}; + +#endif diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 70ead6ab..7b16339c 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -1,149 +1,149 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: - */ - -#include "itemdb.h" - -#include - -#include "iteminfo.h" -#include "resourcemanager.h" - -#include "../log.h" - -#include "../utils/dtor.h" -#include "../utils/xml.h" - -namespace -{ - ItemDB::ItemInfos mItemInfos; - ItemInfo mUnknown; - bool mLoaded = false; -} - - -void ItemDB::load() -{ - if (mLoaded) - return; - - logger->log("Initializing item database..."); - mUnknown.setName("Unknown item"); - - ResourceManager *resman = ResourceManager::getInstance(); - int size; - char *data = (char*)resman->loadFile("items.xml", size); - - if (!data) { - logger->error("ItemDB: Could not find items.xml!"); - } - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); - - if (!doc) - { - logger->error("ItemDB: Error while parsing item database (items.xml)!"); - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); - if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "items")) - { - logger->error("ItemDB: items.xml is not a valid database file!"); - } - - for_each_xml_child_node(node, rootNode) - { - if (!xmlStrEqual(node->name, BAD_CAST "item")) { - continue; - } - - int id = XML::getProperty(node, "id", 0); - int art = XML::getProperty(node, "art", 0); - int type = XML::getProperty(node, "type", 0); - int weight = XML::getProperty(node, "weight", 0); - int slot = XML::getProperty(node, "slot", 0); - - std::string name = XML::getProperty(node, "name", ""); - std::string image = XML::getProperty(node, "image", ""); - std::string description = XML::getProperty(node, "description", ""); - std::string effect = XML::getProperty(node, "effect", ""); - - if (id && name != "") - { - ItemInfo *itemInfo = new ItemInfo(); - itemInfo->setImage(image); - itemInfo->setArt(art); - itemInfo->setName(name); - itemInfo->setDescription(description); - itemInfo->setEffect(effect); - itemInfo->setType(type); - itemInfo->setWeight(weight); - itemInfo->setSlot(slot); - mItemInfos[id] = itemInfo; - } - - if (id == 0) - { - logger->log("ItemDB: An item has no ID in items.xml!"); - } - -#define CHECK_PARAM(param, error_value) \ - if (param == error_value) \ - logger->log("ItemDB: Missing" #param " parameter for item %i! %s", \ - id, name.c_str()) - - CHECK_PARAM(name, ""); - CHECK_PARAM(image, ""); - // CHECK_PARAM(art, 0); - // CHECK_PARAM(description, ""); - // CHECK_PARAM(effect, ""); - // CHECK_PARAM(type, 0); - CHECK_PARAM(weight, 0); - // CHECK_PARAM(slot, 0); - -#undef CHECK_PARAM - } - - xmlFreeDoc(doc); - - mLoaded = true; -} - -void ItemDB::unload() -{ - for (ItemInfoIterator i = mItemInfos.begin(); i != mItemInfos.end(); i++) - { - delete i->second; - } - mItemInfos.clear(); - - mLoaded = false; -} - -const ItemInfo& -ItemDB::get(int id) -{ - ItemInfoIterator i = mItemInfos.find(id); - - return (i != mItemInfos.end()) ? *(i->second) : mUnknown; -} +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: + */ + +#include "itemdb.h" + +#include + +#include "iteminfo.h" +#include "resourcemanager.h" + +#include "../log.h" + +#include "../utils/dtor.h" +#include "../utils/xml.h" + +namespace +{ + ItemDB::ItemInfos mItemInfos; + ItemInfo mUnknown; + bool mLoaded = false; +} + + +void ItemDB::load() +{ + if (mLoaded) + return; + + logger->log("Initializing item database..."); + mUnknown.setName("Unknown item"); + + ResourceManager *resman = ResourceManager::getInstance(); + int size; + char *data = (char*)resman->loadFile("items.xml", size); + + if (!data) { + logger->error("ItemDB: Could not find items.xml!"); + } + + xmlDocPtr doc = xmlParseMemory(data, size); + free(data); + + if (!doc) + { + logger->error("ItemDB: Error while parsing item database (items.xml)!"); + } + + xmlNodePtr rootNode = xmlDocGetRootElement(doc); + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "items")) + { + logger->error("ItemDB: items.xml is not a valid database file!"); + } + + for_each_xml_child_node(node, rootNode) + { + if (!xmlStrEqual(node->name, BAD_CAST "item")) { + continue; + } + + int id = XML::getProperty(node, "id", 0); + int art = XML::getProperty(node, "art", 0); + int type = XML::getProperty(node, "type", 0); + int weight = XML::getProperty(node, "weight", 0); + int slot = XML::getProperty(node, "slot", 0); + + std::string name = XML::getProperty(node, "name", ""); + std::string image = XML::getProperty(node, "image", ""); + std::string description = XML::getProperty(node, "description", ""); + std::string effect = XML::getProperty(node, "effect", ""); + + if (id && name != "") + { + ItemInfo *itemInfo = new ItemInfo(); + itemInfo->setImage(image); + itemInfo->setArt(art); + itemInfo->setName(name); + itemInfo->setDescription(description); + itemInfo->setEffect(effect); + itemInfo->setType(type); + itemInfo->setWeight(weight); + itemInfo->setSlot(slot); + mItemInfos[id] = itemInfo; + } + + if (id == 0) + { + logger->log("ItemDB: An item has no ID in items.xml!"); + } + +#define CHECK_PARAM(param, error_value) \ + if (param == error_value) \ + logger->log("ItemDB: Missing" #param " parameter for item %i! %s", \ + id, name.c_str()) + + CHECK_PARAM(name, ""); + CHECK_PARAM(image, ""); + // CHECK_PARAM(art, 0); + // CHECK_PARAM(description, ""); + // CHECK_PARAM(effect, ""); + // CHECK_PARAM(type, 0); + CHECK_PARAM(weight, 0); + // CHECK_PARAM(slot, 0); + +#undef CHECK_PARAM + } + + xmlFreeDoc(doc); + + mLoaded = true; +} + +void ItemDB::unload() +{ + for (ItemInfoIterator i = mItemInfos.begin(); i != mItemInfos.end(); i++) + { + delete i->second; + } + mItemInfos.clear(); + + mLoaded = false; +} + +const ItemInfo& +ItemDB::get(int id) +{ + ItemInfoIterator i = mItemInfos.find(id); + + return (i != mItemInfos.end()) ? *(i->second) : mUnknown; +} diff --git a/src/resources/itemdb.h b/src/resources/itemdb.h index 6ead5b22..df7e7be9 100644 --- a/src/resources/itemdb.h +++ b/src/resources/itemdb.h @@ -1,53 +1,53 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: itemdb.h 2650 2006-09-03 15:00:47Z b_lindeijer $ - */ - -#ifndef _TMW_ITEM_MANAGER_H -#define _TMW_ITEM_MANAGER_H - -#include "iteminfo.h" - -#include - -/** - * Item information database. - */ -namespace ItemDB -{ - /** - * Loads the item data from items.xml. - */ - void load(); - - /** - * Frees item data. - */ - void unload(); - - const ItemInfo& get(int id); - - // Items database - typedef std::map ItemInfos; - typedef ItemInfos::iterator ItemInfoIterator; -} - -#endif +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_ITEM_MANAGER_H +#define _TMW_ITEM_MANAGER_H + +#include "iteminfo.h" + +#include + +/** + * Item information database. + */ +namespace ItemDB +{ + /** + * Loads the item data from items.xml. + */ + void load(); + + /** + * Frees item data. + */ + void unload(); + + const ItemInfo& get(int id); + + // Items database + typedef std::map ItemInfos; + typedef ItemInfos::iterator ItemInfoIterator; +} + +#endif diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index 89afc549..339ed6ba 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -1,175 +1,175 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include "monsterdb.h" - -#include "resourcemanager.h" - -#include "../log.h" - -#include "../utils/dtor.h" -#include "../utils/xml.h" - -namespace -{ - MonsterDB::MonsterInfos mMonsterInfos; - MonsterInfo mUnknown; - bool mLoaded = false; -} - -void -MonsterDB::load() -{ - if (mLoaded) - return; - - mUnknown.setSprite("error.xml"); - mUnknown.setName("unnamed"); - - logger->log("Initializing monster database..."); - - ResourceManager *resman = ResourceManager::getInstance(); - int size; - char *data = (char*)resman->loadFile("monsters.xml", size); - - if (!data) - { - logger->error("Monster Database: Could not find monsters.xml!"); - } - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); - - if (!doc) - { - logger->error("Monster Database: Error while parsing monster database (monsters.xml)!"); - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); - if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "monsters")) - { - logger->error("Monster Database: monster.xml is not a valid database file!"); - } - - //iterate s - for_each_xml_child_node(monsterNode, rootNode) - { - if (!xmlStrEqual(monsterNode->name, BAD_CAST "monster")) - { - continue; - } - - MonsterInfo *currentInfo = new MonsterInfo(); - - currentInfo->setName (XML::getProperty(monsterNode, "name", "unnamed")); - - std::string targetCursor; - targetCursor = XML::getProperty(monsterNode, "targetCursor", "medium"); - if (targetCursor == "small") - { - currentInfo->setTargetCursorSize(Being::TC_SMALL); - } - else if (targetCursor == "medium") - { - currentInfo->setTargetCursorSize(Being::TC_MEDIUM); - } - else if (targetCursor == "large") - { - currentInfo->setTargetCursorSize(Being::TC_LARGE); - } - else - { - logger->log("MonsterDB: Unknown target cursor type \"%s\" for %s - using medium sized one", - targetCursor.c_str(), currentInfo->getName().c_str()); - currentInfo->setTargetCursorSize(Being::TC_MEDIUM); - } - - //iterate s and s - for_each_xml_child_node(spriteNode, monsterNode) - { - if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) - { - currentInfo->setSprite((const char*) spriteNode->xmlChildrenNode->content); - } - - if (xmlStrEqual(spriteNode->name, BAD_CAST "sound")) - { - std::string event = XML::getProperty(spriteNode, "event", ""); - const char *filename; - filename = (const char*) spriteNode->xmlChildrenNode->content; - - if (event == "hit") - { - currentInfo->addSound(EVENT_HIT, filename); - } - else if (event == "miss") - { - currentInfo->addSound(EVENT_MISS, filename); - } - else if (event == "hurt") - { - currentInfo->addSound(EVENT_HURT, filename); - } - else if (event == "die") - { - currentInfo->addSound(EVENT_DIE, filename); - } - else - { - logger->log("MonsterDB: Warning, sound effect %s for unknown event %s of monster %s", - filename, event.c_str(), currentInfo->getName().c_str()); - } - } - } - mMonsterInfos[XML::getProperty(monsterNode, "id", 0)] = currentInfo; - } - - mLoaded = true; -} - -void -MonsterDB::unload() -{ - for_each ( mMonsterInfos.begin(), mMonsterInfos.end(), - make_dtor(mMonsterInfos)); - mMonsterInfos.clear(); - - mLoaded = false; -} - - -const MonsterInfo& -MonsterDB::get (int id) -{ - MonsterInfoIterator i = mMonsterInfos.find(id); - - if (i == mMonsterInfos.end()) - { - logger->log("MonsterDB: Warning, unknown monster ID %d requested", id); - return mUnknown; - } - else - { - return *(i->second); - } -} +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "monsterdb.h" + +#include "resourcemanager.h" + +#include "../log.h" + +#include "../utils/dtor.h" +#include "../utils/xml.h" + +namespace +{ + MonsterDB::MonsterInfos mMonsterInfos; + MonsterInfo mUnknown; + bool mLoaded = false; +} + +void +MonsterDB::load() +{ + if (mLoaded) + return; + + mUnknown.setSprite("error.xml"); + mUnknown.setName("unnamed"); + + logger->log("Initializing monster database..."); + + ResourceManager *resman = ResourceManager::getInstance(); + int size; + char *data = (char*)resman->loadFile("monsters.xml", size); + + if (!data) + { + logger->error("Monster Database: Could not find monsters.xml!"); + } + + xmlDocPtr doc = xmlParseMemory(data, size); + free(data); + + if (!doc) + { + logger->error("Monster Database: Error while parsing monster database (monsters.xml)!"); + } + + xmlNodePtr rootNode = xmlDocGetRootElement(doc); + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "monsters")) + { + logger->error("Monster Database: monster.xml is not a valid database file!"); + } + + //iterate s + for_each_xml_child_node(monsterNode, rootNode) + { + if (!xmlStrEqual(monsterNode->name, BAD_CAST "monster")) + { + continue; + } + + MonsterInfo *currentInfo = new MonsterInfo(); + + currentInfo->setName (XML::getProperty(monsterNode, "name", "unnamed")); + + std::string targetCursor; + targetCursor = XML::getProperty(monsterNode, "targetCursor", "medium"); + if (targetCursor == "small") + { + currentInfo->setTargetCursorSize(Being::TC_SMALL); + } + else if (targetCursor == "medium") + { + currentInfo->setTargetCursorSize(Being::TC_MEDIUM); + } + else if (targetCursor == "large") + { + currentInfo->setTargetCursorSize(Being::TC_LARGE); + } + else + { + logger->log("MonsterDB: Unknown target cursor type \"%s\" for %s - using medium sized one", + targetCursor.c_str(), currentInfo->getName().c_str()); + currentInfo->setTargetCursorSize(Being::TC_MEDIUM); + } + + //iterate s and s + for_each_xml_child_node(spriteNode, monsterNode) + { + if (xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) + { + currentInfo->setSprite((const char*) spriteNode->xmlChildrenNode->content); + } + + if (xmlStrEqual(spriteNode->name, BAD_CAST "sound")) + { + std::string event = XML::getProperty(spriteNode, "event", ""); + const char *filename; + filename = (const char*) spriteNode->xmlChildrenNode->content; + + if (event == "hit") + { + currentInfo->addSound(EVENT_HIT, filename); + } + else if (event == "miss") + { + currentInfo->addSound(EVENT_MISS, filename); + } + else if (event == "hurt") + { + currentInfo->addSound(EVENT_HURT, filename); + } + else if (event == "die") + { + currentInfo->addSound(EVENT_DIE, filename); + } + else + { + logger->log("MonsterDB: Warning, sound effect %s for unknown event %s of monster %s", + filename, event.c_str(), currentInfo->getName().c_str()); + } + } + } + mMonsterInfos[XML::getProperty(monsterNode, "id", 0)] = currentInfo; + } + + mLoaded = true; +} + +void +MonsterDB::unload() +{ + for_each ( mMonsterInfos.begin(), mMonsterInfos.end(), + make_dtor(mMonsterInfos)); + mMonsterInfos.clear(); + + mLoaded = false; +} + + +const MonsterInfo& +MonsterDB::get (int id) +{ + MonsterInfoIterator i = mMonsterInfos.find(id); + + if (i == mMonsterInfos.end()) + { + logger->log("MonsterDB: Warning, unknown monster ID %d requested", id); + return mUnknown; + } + else + { + return *(i->second); + } +} diff --git a/src/resources/monsterinfo.cpp b/src/resources/monsterinfo.cpp index 43aac32a..2a59419e 100644 --- a/src/resources/monsterinfo.cpp +++ b/src/resources/monsterinfo.cpp @@ -1,70 +1,70 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: monsterinfo.cpp 2650 2006-09-03 15:00:47Z b_lindeijer $ - */ - -#include "monsterinfo.h" - -#include "../utils/dtor.h" - -MonsterInfo::MonsterInfo(): - mSprite("error.xml") -{ - -} - -MonsterInfo::~MonsterInfo() -{ - //kill vectors in mSoundEffects - for_each ( mSounds.begin(), mSounds.end(), - make_dtor(mSounds)); - mSounds.clear(); -} - - -void -MonsterInfo::addSound (SoundEvent event, std::string filename) -{ - if (mSounds.find(event) == mSounds.end()) - { - mSounds[event] = new std::vector; - } - - mSounds[event]->push_back("sfx/" + filename); -} - - -std::string -MonsterInfo::getSound (SoundEvent event) const -{ - std::map* >::const_iterator i; - - i = mSounds.find(event); - - if (i == mSounds.end()) - { - return ""; - } - else - { - return i->second->at(rand()%i->second->size()); - } -} +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "monsterinfo.h" + +#include "../utils/dtor.h" + +MonsterInfo::MonsterInfo(): + mSprite("error.xml") +{ + +} + +MonsterInfo::~MonsterInfo() +{ + //kill vectors in mSoundEffects + for_each ( mSounds.begin(), mSounds.end(), + make_dtor(mSounds)); + mSounds.clear(); +} + + +void +MonsterInfo::addSound (SoundEvent event, std::string filename) +{ + if (mSounds.find(event) == mSounds.end()) + { + mSounds[event] = new std::vector; + } + + mSounds[event]->push_back("sfx/" + filename); +} + + +std::string +MonsterInfo::getSound (SoundEvent event) const +{ + std::map* >::const_iterator i; + + i = mSounds.find(event); + + if (i == mSounds.end()) + { + return ""; + } + else + { + return i->second->at(rand()%i->second->size()); + } +} diff --git a/src/resources/monsterinfo.h b/src/resources/monsterinfo.h index d2a0a2c8..aa7db9f0 100644 --- a/src/resources/monsterinfo.h +++ b/src/resources/monsterinfo.h @@ -18,7 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: monsterinfo.h 2650 2006-09-03 15:00:47Z b_lindeijer $ + * $Id$ */ #ifndef _TMW_MONSTERINFO_H_ diff --git a/src/resources/openglsdlimageloader.cpp b/src/resources/openglsdlimageloader.cpp index 68de1e19..9b6645bd 100644 --- a/src/resources/openglsdlimageloader.cpp +++ b/src/resources/openglsdlimageloader.cpp @@ -18,7 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: sdlimageloader.cpp 2121 2006-01-31 02:55:26Z der_doener $ + * $Id$ */ #include "openglsdlimageloader.h" diff --git a/src/resources/openglsdlimageloader.h b/src/resources/openglsdlimageloader.h index b79dde15..d776dafe 100644 --- a/src/resources/openglsdlimageloader.h +++ b/src/resources/openglsdlimageloader.h @@ -18,7 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: sdlimageloader.h 1724 2005-09-12 22:15:35Z der_doener $ + * $Id$ */ #ifndef _TMW_OPENGLSDLIMAGELOADER_H diff --git a/src/utils/fastsqrt.h b/src/utils/fastsqrt.h index 8da1d354..78768149 100644 --- a/src/utils/fastsqrt.h +++ b/src/utils/fastsqrt.h @@ -1,24 +1,24 @@ -/* A very fast function to calculate the approximate inverse square root of a - * floating point value and a helper function that uses it for getting the - * normal squareroot. For an explanation of the inverse squareroot function - * read: - * http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf - * - * Unfortunately the original creator of this function seems to be unknown. - */ - -float fastInvSqrt(float x) -{ - union { int i; float x; } tmp; - float xhalf = 0.5f * x; - tmp.x = x; - tmp.i = 0x5f375a86 - (tmp.i >> 1); - x = tmp.x; - x = x * (1.5f - xhalf * x * x); - return x; -} - -float fastSqrt(float x) -{ - return 1.0f / fastInvSqrt(x); -} +/* A very fast function to calculate the approximate inverse square root of a + * floating point value and a helper function that uses it for getting the + * normal squareroot. For an explanation of the inverse squareroot function + * read: + * http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf + * + * Unfortunately the original creator of this function seems to be unknown. + */ + +float fastInvSqrt(float x) +{ + union { int i; float x; } tmp; + float xhalf = 0.5f * x; + tmp.x = x; + tmp.i = 0x5f375a86 - (tmp.i >> 1); + x = tmp.x; + x = x * (1.5f - xhalf * x * x); + return x; +} + +float fastSqrt(float x) +{ + return 1.0f / fastInvSqrt(x); +} diff --git a/src/utils/minmax.h b/src/utils/minmax.h index 1add2b7e..27eb2565 100644 --- a/src/utils/minmax.h +++ b/src/utils/minmax.h @@ -1,47 +1,47 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -/** - * Returns a random numeric value that is larger than or equal min and smaller - * than max - */ - -template struct MinMax -{ - void set(T min, T max) - { - minVal=min; maxVal=max; - } - - void set(T val) - { - set(val, val); - } - - T value() - { - return (T)(minVal + (maxVal - minVal) * (rand() / ((double) RAND_MAX + 1))); - } - - T minVal; - T maxVal; -}; +/* + * The Mana World + * Copyright 2006 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/** + * Returns a random numeric value that is larger than or equal min and smaller + * than max + */ + +template struct MinMax +{ + void set(T min, T max) + { + minVal=min; maxVal=max; + } + + void set(T val) + { + set(val, val); + } + + T value() + { + return (T)(minVal + (maxVal - minVal) * (rand() / ((double) RAND_MAX + 1))); + } + + T minVal; + T maxVal; +}; -- cgit v1.2.3-70-g09d2 From 1a9320fafb23940d0463e6f384713d0f99fc0c61 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Wed, 19 Sep 2007 17:28:33 +0000 Subject: Merged 0.0 changes from revision 3362 to 3580 to trunk. --- ChangeLog | 306 ++++++++++++++++++++++++++++++- data/graphics/gui/CMakeLists.txt | 4 + data/graphics/gui/Makefile.am | 4 + data/graphics/gui/close_button.png | Bin 0 -> 650 bytes data/graphics/gui/hits_yellow.png | Bin 356 -> 894 bytes data/graphics/gui/item_shortcut_bgr.png | Bin 0 -> 1026 bytes data/graphics/gui/mouse.png | Bin 1134 -> 4508 bytes data/graphics/gui/unknown-item.png | Bin 0 -> 540 bytes data/graphics/images/login_wallpaper.png | Bin 215527 -> 643307 bytes src/CMakeLists.txt | 22 ++- src/Makefile.am | 38 ++-- src/animationparticle.cpp | 3 +- src/being.cpp | 90 ++------- src/being.h | 42 +---- src/game.cpp | 179 ++++++++++-------- src/gui/button.cpp | 20 +- src/gui/button.h | 10 +- src/gui/buy.cpp | 125 ++++++++----- src/gui/buy.h | 10 +- src/gui/char_select.cpp | 12 +- src/gui/char_select.h | 31 ++-- src/gui/chat.cpp | 10 +- src/gui/debugwindow.cpp | 14 +- src/gui/debugwindow.h | 9 +- src/gui/equipmentwindow.cpp | 1 + src/gui/gui.cpp | 45 +++-- src/gui/gui.h | 43 +++-- src/gui/inventorywindow.cpp | 13 +- src/gui/inventorywindow.h | 11 +- src/gui/itemcontainer.cpp | 4 + src/gui/itemshortcutcontainer.cpp | 224 ++++++++++++++++++++++ src/gui/itemshortcutcontainer.h | 115 ++++++++++++ src/gui/itemshortcutwindow.cpp | 74 ++++++++ src/gui/itemshortcutwindow.h | 69 +++++++ src/gui/menuwindow.cpp | 12 +- src/gui/popupmenu.cpp | 6 - src/gui/selectionlistener.h | 16 +- src/gui/sell.cpp | 127 +++++++------ src/gui/sell.h | 16 +- src/gui/setup.cpp | 10 +- src/gui/setup_keyboard.cpp | 187 +++++++++++++++++++ src/gui/setup_keyboard.h | 84 +++++++++ src/gui/shoplistbox.cpp | 20 +- src/gui/skill.cpp | 6 +- src/gui/skill.h | 1 - src/gui/status.cpp | 6 +- src/gui/status.h | 3 +- src/gui/updatewindow.cpp | 4 +- src/gui/viewport.cpp | 25 +-- src/gui/viewport.h | 13 -- src/gui/window.cpp | 198 +++++++++++++++++--- src/gui/window.h | 99 +++++++++- src/gui/windowlistener.h | 86 +++++++++ src/imageparticle.cpp | 8 +- src/itemshortcut.cpp | 87 +++++++++ src/itemshortcut.h | 130 +++++++++++++ src/keyboardconfig.cpp | 144 +++++++++++++++ src/keyboardconfig.h | 185 +++++++++++++++++++ src/localplayer.cpp | 43 ++++- src/localplayer.h | 22 +++ src/main.cpp | 19 +- src/monster.cpp | 10 +- src/net/beinghandler.cpp | 84 +++++---- src/net/chathandler.cpp | 2 + src/net/inventoryhandler.cpp | 2 + src/net/playerhandler.cpp | 3 +- src/particle.cpp | 96 +++++----- src/particle.h | 112 +++++------ src/particleemitter.cpp | 30 ++- src/player.cpp | 50 ++--- src/player.h | 3 - src/resources/equipmentdb.cpp | 156 ---------------- src/resources/equipmentdb.h | 55 ------ src/resources/equipmentinfo.h | 52 ------ src/resources/itemdb.cpp | 126 ++++++++++--- src/resources/iteminfo.cpp | 86 ++++++++- src/resources/iteminfo.h | 118 +++++++----- src/resources/mapreader.cpp | 2 +- src/resources/monsterdb.cpp | 8 +- src/resources/monsterinfo.cpp | 12 +- src/resources/monsterinfo.h | 16 +- src/resources/spritedef.h | 4 +- src/textparticle.cpp | 11 +- src/textparticle.h | 17 +- src/utils/fastsqrt.h | 2 + src/utils/minmax.h | 1 + src/utils/trim.h | 53 ++++++ src/vector.h | 134 ++++++++++++++ tools/adler32.c | 67 +++++++ 89 files changed, 3257 insertions(+), 1140 deletions(-) create mode 100644 data/graphics/gui/close_button.png create mode 100644 data/graphics/gui/item_shortcut_bgr.png create mode 100644 data/graphics/gui/unknown-item.png create mode 100644 src/gui/itemshortcutcontainer.cpp create mode 100644 src/gui/itemshortcutcontainer.h create mode 100644 src/gui/itemshortcutwindow.cpp create mode 100644 src/gui/itemshortcutwindow.h create mode 100644 src/gui/setup_keyboard.cpp create mode 100644 src/gui/setup_keyboard.h create mode 100644 src/gui/windowlistener.h create mode 100644 src/itemshortcut.cpp create mode 100644 src/itemshortcut.h create mode 100644 src/keyboardconfig.cpp create mode 100644 src/keyboardconfig.h delete mode 100644 src/resources/equipmentdb.cpp delete mode 100644 src/resources/equipmentdb.h delete mode 100644 src/resources/equipmentinfo.h create mode 100644 src/utils/trim.h create mode 100644 src/vector.h create mode 100644 tools/adler32.c (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 082c9b94..d0e43d40 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,19 @@ * src/gui/button.cpp: Fixed improper const qualifier. +2007-09-12 Bjørn Lindeijer + + * data/items.xml, data/equipment.xml: Added temporary weapon IDs below + 256 to use as view-ID in eAthena's item DB. + * src/gui/shoplistbox.cpp, src/gui/buy.h, src/gui/buy.cpp: Allowed + selection of items that cannot be afforded, so that their descriptions + are still accessible. Also made sure the player's money value of + ShopItemList gets updated. + +2007-09-11 Eugenio Favalli + + * src/gui/chat.cpp, tmw.cbp: Fixed admin commands. + 2007-09-10 Eugenio Favalli * configure.ac, data/fonts/dejavusans.ttf, @@ -18,17 +31,103 @@ * po/LINGUAS: Added German to the list of available languages. * po/de.po: Fixed two syntax errors preventing compilation. -2007-08-27 Matthias Hartmann +2007-09-08 Philipp Sehmisch + + * data/graphics/particles/aniblaze.png, + data/graphics/particles/cookingfire.particle.xml, + data/graphics/particles/fireplace.particle.xml, + data/graphics/particles/flame.particle.xml: Improved fire effects by + using animated particles. - * po/de.po: Added german translation. +2007-09-06 Philipp Sehmisch + + * src/animationparticle.cpp, src/imageparticle.cpp: Fixed animated + particles. + +2007-09-01 Bjørn Lindeijer + + * src/Makefile.am: Fixed the entry for windowlistener.h. + +2007-08-30 Bjørn Lindeijer + + * src/localplayer.cpp, src/player.cpp, src/main.cpp, src/being.cpp, + src/CMakeLists.txt, src/Makefile.am, src/resources/iteminfo.h, + src/resources/equipmentdb.h, src/resources/equipmentinfo.h, + src/resources/itemdb.cpp, src/resources/iteminfo.cpp, + src/resources/equipmentdb.cpp, src/resources/equipmentinfo.cpp, + src/resources/spritedef.h, src/being.h, data/items.xml, + data/equipment.xml: Merged equipment database with items database and + got rid of the unused item art attribute. + * src/net/beinghandler.cpp, src/net/charserverhandler.cpp: Removed the + now unnecessary multiplication of weapon IDs with 10000. + * src/resources/iteminfo.cpp, data/graphics/items/unknown.png: Added + fallback item icon and use it for unknown items or when item image + fails to load. + * NEWS: Updated with changes since last update. + * data/items.xml, data/equipment.xml: Reverted equipment database and + included original low-ID items in items.xml for compatibility with + eAthena, which doesn't support View ID to come above 255. + * src/resources/itemdb.cpp: Accept items without a name. + +2007-08-29 Bjørn Lindeijer + + * src/gui/sell.cpp, src/gui/inventorywindow.cpp, src/gui/sell.h: Made + sell dialog resizable and tweaked inventory resize code a bit. + * data/items.xml: Fixed typo in chainmail description. + +2007-08-28 Bjørn Lindeijer + + * src/gui/window.cpp, src/gui/inventorywindow.h, + src/gui/selectionlistener.h, src/gui/buy.h, + src/gui/itemshortcutwindow.cpp, src/gui/inventorywindow.cpp, + src/gui/buy.cpp, src/gui/window.h, src/gui/windowlistener.h, + src/gui/itemshortcutwindow.h, src/CMakeLists.txt, src/Makefile.am: + Made buy dialog resizable and added a WindowListener class for + listening for window resize and move events. + * src/textparticle.h, src/particle.h, src/CMakeLists.txt, + src/particle.cpp, src/imageparticle.cpp, src/vector.h, + src/textparticle.cpp, src/Makefile.am: Added Vector class and used it + in the particle engine. + +2007-08-27 Bjørn Lindeijer + + * src/engine.cpp, src/resources/mapreader.cpp: Made client search for + both compressed and non-compressed map files. 2007-08-27 Eugenio Favalli + * src/game.cpp: Assigned unused emotions to Alt +/-. (applied a patch + by Quiche_on_a_leash). + * data/maps/new_1-1.tmx, data/maps/new_1-1.tmx.gz, + data/maps/new_10-1.tmx, data/maps/new_10-1.tmx.gz, + data/maps/new_11-1.tmx, data/maps/new_11-1.tmx.gz, + data/maps/new_12-1.tmx, data/maps/new_12-1.tmx.gz, + data/maps/new_13-1.tmx, data/maps/new_13-1.tmx.gz, + data/maps/new_14-1.tmx, data/maps/new_14-1.tmx.gz, + data/maps/new_15-1.tmx, data/maps/new_15-1.tmx.gz, + data/maps/new_16-1.tmx, data/maps/new_16-1.tmx.gz, + data/maps/new_17-1.tmx, data/maps/new_17-1.tmx.gz, + data/maps/new_18-1.tmx, data/maps/new_18-1.tmx.gz, + data/maps/new_19-1.tmx, data/maps/new_19-1.tmx.gz, + data/maps/new_2-1.tmx, data/maps/new_2-1.tmx.gz, + data/maps/new_20-1.tmx, data/maps/new_20-1.tmx.gz, + data/maps/new_3-1.tmx, data/maps/new_3-1.tmx.gz, + data/maps/new_4-1.tmx, data/maps/new_4-1.tmx.gz, + data/maps/new_5-1.tmx, data/maps/new_5-1.tmx.gz, + data/maps/new_6-1.tmx, data/maps/new_6-1.tmx.gz, + data/maps/new_7-1.tmx, data/maps/new_7-1.tmx.gz, + data/maps/new_8-1.tmx, data/maps/new_8-1.tmx.gz, + data/maps/new_9-1.tmx, data/maps/new_9-1.tmx.gz: Replaced compressed + maps with layer compressed maps. * data/maps/new_1-1.tmx.gz: Added test npcs. * src/openglgraphics.cpp, tmw.cbp: Fixed compilation with old OpenGL headers. * po/it.po: Updated italian translation. +2007-08-27 Matthias Hartmann + + * po/de.po: Added German translation. + 2007-08-27 Guillaume Melquiond * src/gui/chat.h, src/gui/chat.cpp: Added "/admin" chat command for @@ -36,6 +135,11 @@ * src/engine.cpp, src/resources/mapreader.cpp: Ported patch from 0.0, in order to support missing extensions and uncompressed maps. +2007-08-26 Eugenio Favalli + + * src/gui/updatewindow.cpp, src/main.cpp, tmw.cbp: Removed home dir + from config file to avoid encoding issues. + 2007-08-26 Guillaume Melquiond * src/gui/button.cpp: Fixed incorrect button dimensions, as they mess @@ -58,10 +162,103 @@ for rectangle OpenGL textures when available, in order to reduce video memory usage. +2007-08-24 Bjørn Lindeijer + + * src/gui/gui.h, src/gui/gui.cpp: Removed useless logic method and + reverted mouse cursor to non-static since there can be only one Gui + instance so there is no point in supporting a shared resource. + * src/gui/window.cpp, src/gui/gui.h: Removed unnecessary + Gui::isCustomCursor method. + * src/gui/char_select.h, src/gui/char_select.cpp, src/utils/trim.h: + Added trimming of name for new character creation. + * src/net/chathandler.cpp: Added trimming of chat messages appearing + above players. + * src/gui/window.cpp, src/gui/window.h: Improved resize mouse cursor + indication, removing duplicated code and fixing indicator above resize + grip. + +2007-08-23 Bjørn Lindeijer + + * src/gui/viewport.h, src/gui/viewport.cpp: Removed two useless popup + related methods. + * src/gui/debugwindow.h, src/gui/debugwindow.cpp: Use generic close + button functionality. + * src/particle.h, src/particleemitter.cpp, src/particle.cpp: Renamed + Particle::mVector to Particle::mVelocity for clarity. + * src/localplayer.cpp, src/gui/ministatus.cpp, src/gui/status.cpp, + src/being.cpp, src/net/charserverhandler.cpp, + src/net/playerhandler.cpp, src/localplayer.h, src/being.h: Changed XP + gaining effect to appear on the player instead. + * data/graphics/gui/hits_yellow.png: Restored shadow of yellow font. + +2007-08-22 Bjørn Lindeijer + + * src/gui/itemshortcutcontainer.h: Fixed compiler warning. + * src/CMakeLists.txt, src/Makefile.am: Updated source lists. + * data/graphics/gui/CMakeLists.txt, data/graphics/gui/Makefile.am: + Added close button and item shortcut backgrounds to files that will be + installed. + * src/gui/itemshortcutcontainer.cpp: Make sure mGridWidth and + mGridHeight are initialized properly (fixes arithmetic exception in + ItemShortcutContainer::draw). + * src/keyboardconfig.cpp: Changed default sitting key back to 's'. + * src/net/equipmenthandler.cpp: Removed a line that attempted to set + the player's weapon sprite with each kind of equipment. Seems to work + fine without as well. + * src/gui/chat.cpp, src/utils/trim.h, src/CMakeLists.txt, + src/Makefile.am: Added trimming of chat messages. + +2007-08-22 Philipp Sehmisch + + * data/graphics/sprites/chest-lightplatemail-male.png, + data/graphics/sprites/chest-lightplatemail-female.png, + data/graphics/items/armor-chest-lightplatemail.png, + data/graphics/tiles/woodland_indoor_x2.png: Another color correction + at the light platemail (looks more metalic now) + * data/maps/new_18-1.tmx.gz, data/maps/new_19-1.tmx.gz, + data/images/minimap_new_18-1.png, data/images/minimap_new_19-1.png: + Removed a tree that prevented people from sitting on one of the + benches properly. Added correct minimap to woodland village and + surrounding. + +2007-08-22 Joshua Langley + + * data/graphics/gui/item_shortcut_bgr.png, src/game.cpp, + src/gui/gui.cpp, src/gui/itemcontainer.cpp, + src/gui/itemshortcutcontainer.cpp, src/gui/itemshortcutcontainer.h, + src/gui/itemshortcutwindow.cpp, src/gui/itemshortcutwindow.h, + src/gui/menuwindow.cpp, src/gui/setup_keyboard.cpp, src/gui/window.h, + src/itemshortcut.cpp, src/itemshortcut.h, src/keyboardconfig.cpp, + src/keyboardconfig.h, src/localplayer.cpp, src/localplayer.h, + src/main.cpp, src/net/inventoryhandler.cpp, src/utils/tostring.h, + tmw.cbp: Added item shortcut bar. + +2007-08-20 Joshua Langley + + * data/graphics/gui/mouse.png, src/gui/equipmentwindow.cpp, + src/gui/gui.cpp, src/gui/gui.h, src/gui/inventorywindow.cpp, + src/gui/setup.cpp, src/gui/skill.cpp, src/gui/skill.h, + src/gui/status.cpp, src/gui/window.cpp, src/gui/window.h, + data/graphics/gui/close_button.png: Added close button functionality, + resize cursor cues. + * data/graphics/gui/hits_yellow.png, src/being.cpp, src/being.h, + src/gui/gui.cpp, src/localplayer.cpp, src/localplayer.h, + src/net/charserverhandler.cpp, src/net/playerhandler.cpp, + src/particle.cpp, src/particle.h: Added monster killed xp notification + effect. + 2007-08-19 Bjørn Lindeijer - * src/CMakeLists.txt: Updated CMake file. * data/equipment.xml: Fixed typo in female light plate mail. + * NEWS: Updated with changes since 0.0.23. + * src/CMakeLists.txt: Updated CMake file. + +2007-08-19 Joshua Langley + + * src/keyboardconfig.cpp, src/keyboardconfig.h: Minor cleanup. + * src/gui/buy.cpp, src/gui/sell.cpp: Buy/sell fixed minimum quantity. + * src/gui/setup_keyboard.cpp, src/gui/setup_keyboard.h: Fixed bug - + reverts unassigned key. 2007-08-19 Guillaume Melquiond @@ -73,6 +270,23 @@ src/net/playerhandler.cpp, src/localplayer.h: Adapted to new server handling of character attributes. +2007-08-17 Bjørn Lindeijer + + * tools/adler32.c: Added little program for calculating adler32 + checksums of files. + * src/gui/setup_keyboard.cpp: Fixed compile issue related to array + bound not being an integer constant. + +2007-08-15 Philipp Sehmisch + + * data/graphics/sprites/npcs.png, data/graphics/sprites/npc.xml: + Added farmer NPC for woodland village. + +2007-08-14 Eugenio Favalli + + * src/gui/popupmenu.cpp, src/gui/viewport.cpp, src/gui/viewport.h, + tmw.cbp: Fixed popup menu requiring one more click after being used. + 2007-08-14 Guillaume Melquiond * src/net/messagein.h, src/net/messagein.cpp: Fixed error-prone @@ -111,6 +325,15 @@ * src/gui/npclistdialog.cpp, src/gui/npclistdialog.h, src/net/npchandler.cpp: Removed colon in NPC choice messages. +2007-08-09 Philipp Sehmisch + + * data/graphics/sprites/chest-lightplatemail-male.png, + data/graphics/sprites/chest-lightplatemail-female.png, + data/graphics/items/armor-chest-lightplatemail.png, + data/graphics/tiles/woodland_indoor_x2.png: Gave the platemail + armor a blue tint. Looks less boring and makes recoloring through + hue shifting possible. + 2007-08-09 Guillaume Melquiond * po/POTFILES.in: Updated list of translatable source files. @@ -133,9 +356,29 @@ data/graphics/images/EquipBackground.png: Re-designed equipment window, un-equip created. +2007-08-08 Philipp Sehmisch + + * data/graphics/particles/cookingfire.particle.xml, + data/graphics/particles/fireplace.particle.xml, + data/maps/new_20-1.tmx.gz: Added particle effects and music to the + woodland village indoor map. + * data/maps/new_19-1.tmx.gz: Added overlay effect and music to + woodland village outdoor map. + * data/maps/new_18-1.tmx.gz: Fixed some collision map errors and added + music and overlay effect to the surrounding of the woodland village. + +2007-08-07 Philipp Sehmisch + + * data/graphics/sprites/npcs.png: Added two new NPCs and gave some + of the older NPCs a makeover to look more like the style of the new + playerset. + * data/maps/new_20-1.tmx.gz: Corrected a few mapping errors in the + new woodland village. + * data/items.xml: Tweaked description and values of the scythe. + 2007-08-07 Guillaume Melquiond - * po/Makevars, src/main.cpp: Replaced PACKAGE by tmw to reduce + * po/Makevars, src/main.cpp: Replaced PACKAGE by tmw to reduce preprocessing hell. Set gettext charset to utf8. * src/gui/menuwindow.cpp, src/gui/connection.cpp, src/gui/register.cpp, src/gui/equipmentwindow.cpp, @@ -172,6 +415,14 @@ Makefile.am, autogen.sh: Used autopoint for generating gettext environment, and removed conflicting files. +2007-08-05 Philipp Sehmisch + + * data/graphics/tiles/woodland_indoor.png, + data/graphics/tiles/woodland_indoor_x2.png, + data/graphics/tiles/woodland_indoor_x3.png: Added woodland + village indoor tilesets. + * data/maps/new_20-1.tmx.gz: Added woodland village indoor map. + 2007-08-05 Guillaume Melquiond * configure.ac, Makefile.am, po, src/Makefile.am, src/main.cpp, @@ -222,12 +473,22 @@ src/gui/itemcontainer.cpp, src/gui/checkbox.cpp, src/gui/minimap.cpp, src/gui/scrollarea.cpp, src/gui/popupmenu.cpp: Removed useless yet costly dynamic casts. - -2007-07-25 Guillaume Melquiond - * src/net/beinghandler.cpp, src/net/protocol.h: Added being speed to protocol. +2007-07-25 Joshua Langley + + * src/gui/setup.cpp, src/gui/setup_keyboard.cpp, + src/gui/setup_keyboard.h, src/keyboardconfig.cpp, + src/keyboardconfig.h, src/main.cpp: Minor changes to keyboard config, + keyboard setup gui re-designed. + +2007-07-24 Bjørn Lindeijer + + * src/CMakeLists.txt, src/Makefile.am: Added setup_keyboard.* and + keyboardconfig.* to the list of source files. + * src/keyboardconfig.h: Fixed initialization order. + 2007-07-23 Eugenio Favalli * data/maps/new_1-1.tar.gz, data/maps/new_3-1.tar.gz: Fixed warp @@ -247,8 +508,21 @@ * data/maps/new_1-1.tar.gz: Fixed insecure filenames. +2007-07-17 Joshua Langley + + * src/game.cpp: Only one key per function. + * src/main.cpp: Keyboard configuration included. + * src/gui/button.cpp, src/gui/button.h: Default constructor and + init function added. + * src/gui/setup.cpp: Keyboard setup tab added. + * src/gui/setup_keyboard.cpp, src/gui/setup_keyboard.h: Add to project + file, it is the keyboard setup tab. + * src/keyboardconfig.cpp, src/keyboardconfig.h: Add to project file, + the main keyboard config operations. + 2007-07-16 Eugenio Favalli + * data/items.xml: Fixed description of silk headband. * data/maps/new_1-1.tar.gz, data/maps/new_3-1.tar.gz: Added warp and spawn areas. @@ -262,6 +536,24 @@ * src/net/beinghandler.cpp, src/net/beinghandler.h, src/net/protocol.h: Added support for visible equipment. +2007-07-11 Philipp Sehmisch + + * src/resources/monsterdb.cpp, src/resources/monsterinfo.cpp, + src/resources/monsterinfo.h, src/monster.cpp: Renamed SoundEvent + to MonsterSoundEvent. + * src/resources/equipmentdb.cpp, src/resources/equipmentinfo.cpp, + src/resources/equipmentinfo.h: EquipmentDB now holds the type of + attack animation and the sounds of weapons. + * src/being.cpp. src/being.h, src/localplayer.cpp, + src/net/beinghandler.cpp, src/net/charserverhandler.cpp, + src/net/equipmenthandler.cpp, src/player.cpp, src/player.h: The + type of weapon player characters are using is now set using + setVisibleEquipment() instead of setWeapon() or setWeaponById(). + * src/CMakeLists.txt, src/Makefile.AM, tmw.cbp, The Mana World.dev: + Updated project files and buildscripts. + * data/graphics/images/login-wallpaper.png: Replaced login wallpaper + with a new one by Irukard. + 2007-07-11 Bjørn Lindeijer * src/gui/window.cpp: Fixed resizing windows by their resize grip. diff --git a/data/graphics/gui/CMakeLists.txt b/data/graphics/gui/CMakeLists.txt index 5a02d7f1..649e0917 100644 --- a/data/graphics/gui/CMakeLists.txt +++ b/data/graphics/gui/CMakeLists.txt @@ -7,6 +7,7 @@ SET (FILES button.png buttonpress.png checkbox.png + close_button.png deepbox.png fixedfont.png hits_blue.png @@ -18,6 +19,8 @@ SET (FILES hscroll_right_default.png hscroll_right_highlight.png hscroll_right_pressed.png + item_shortcut_bgr.png + mouse.png menuitemD.png menuitemF.png menuitemN.png @@ -37,6 +40,7 @@ SET (FILES target-cursor-red-m.png target-cursor-red-s.png thickborder.png + unknown-item.png vscroll_blue.png vscroll_down_default.png vscroll_down_highlight.png diff --git a/data/graphics/gui/Makefile.am b/data/graphics/gui/Makefile.am index 92e4f3bb..7287d717 100644 --- a/data/graphics/gui/Makefile.am +++ b/data/graphics/gui/Makefile.am @@ -10,6 +10,7 @@ gui_DATA = \ buttonhi.png \ buttonpress.png \ checkbox.png \ + close_button.png \ deepbox.png \ equip_bg.png \ fixedfont.png \ @@ -22,6 +23,8 @@ gui_DATA = \ hscroll_right_default.png \ hscroll_right_highlight.png \ hscroll_right_pressed.png \ + item_shortcut_bgr.png \ + mouse.png \ menuitemD.png \ menuitemF.png \ menuitemN.png \ @@ -41,6 +44,7 @@ gui_DATA = \ target-cursor-red-m.png \ target-cursor-red-s.png \ thickborder.png \ + unknown-item.png \ vscroll_blue.png \ vscroll_down_default.png \ vscroll_down_highlight.png \ diff --git a/data/graphics/gui/close_button.png b/data/graphics/gui/close_button.png new file mode 100644 index 00000000..f87cc2a9 Binary files /dev/null and b/data/graphics/gui/close_button.png differ diff --git a/data/graphics/gui/hits_yellow.png b/data/graphics/gui/hits_yellow.png index f917bc67..d77b7c05 100644 Binary files a/data/graphics/gui/hits_yellow.png and b/data/graphics/gui/hits_yellow.png differ diff --git a/data/graphics/gui/item_shortcut_bgr.png b/data/graphics/gui/item_shortcut_bgr.png new file mode 100644 index 00000000..e878fc7a Binary files /dev/null and b/data/graphics/gui/item_shortcut_bgr.png differ diff --git a/data/graphics/gui/mouse.png b/data/graphics/gui/mouse.png index 2eeb0e51..84dc2ad1 100644 Binary files a/data/graphics/gui/mouse.png and b/data/graphics/gui/mouse.png differ diff --git a/data/graphics/gui/unknown-item.png b/data/graphics/gui/unknown-item.png new file mode 100644 index 00000000..9201d688 Binary files /dev/null and b/data/graphics/gui/unknown-item.png differ diff --git a/data/graphics/images/login_wallpaper.png b/data/graphics/images/login_wallpaper.png index 54692dfd..7af4f913 100644 Binary files a/data/graphics/images/login_wallpaper.png and b/data/graphics/images/login_wallpaper.png differ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fa19cfb5..96338338 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -97,6 +97,12 @@ SET(SRCS gui/item_amount.h gui/itemcontainer.cpp gui/itemcontainer.h + gui/itemshortcutcontainer.cpp + gui/itemshortcutcontainer.h + gui/itemshortcutwindow.cpp + gui/itemshortcutwindow.h + gui/item_amount.cpp + gui/item_amount.h gui/linkhandler.h gui/listbox.cpp gui/listbox.h @@ -143,6 +149,8 @@ SET(SRCS gui/setup.h gui/setup_joystick.cpp gui/setup_joystick.h + gui/setup_keyboard.cpp + gui/setup_keyboard.h gui/setuptab.h gui/setup_video.cpp gui/setup_video.h @@ -170,12 +178,13 @@ SET(SRCS gui/updatewindow.h gui/vbox.cpp gui/vbox.h - gui/windowcontainer.cpp - gui/windowcontainer.h gui/viewport.cpp gui/viewport.h gui/window.cpp gui/window.h + gui/windowcontainer.cpp + gui/windowcontainer.h + gui/windowlistener.h gui/widgets/dropdown.cpp gui/widgets/dropdown.h net/beinghandler.cpp @@ -239,9 +248,6 @@ SET(SRCS resources/buddylist.h resources/animation.cpp resources/animation.h - resources/equipmentdb.cpp - resources/equipmentdb.h - resources/equipmentinfo.h resources/image.cpp resources/image.h resources/imagewriter.cpp @@ -281,6 +287,7 @@ SET(SRCS utils/strprintf.cpp utils/strprintf.h utils/tostring.h + utils/trim.h utils/xml.cpp utils/xml.h animatedsprite.cpp @@ -317,8 +324,12 @@ SET(SRCS inventory.h item.cpp item.h + itemshortcut.cpp + itemshortcut.h joystick.cpp joystick.h + keyboardconfig.cpp + keyboardconfig.h localplayer.cpp localplayer.h lockedarray.h @@ -351,6 +362,7 @@ SET(SRCS textparticle.cpp textparticle.h tileset.h + vector.h ) ADD_EXECUTABLE(tmw ${SRCS}) diff --git a/src/Makefile.am b/src/Makefile.am index 7006f66e..2f29e299 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,6 +5,8 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ gui/widgets/dropdown.h \ gui/widgets/resizegrip.cpp \ gui/widgets/resizegrip.h \ + gui/box.h \ + gui/box.cpp \ gui/browserbox.cpp \ gui/browserbox.h \ gui/buddywindow.cpp \ @@ -39,12 +41,20 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ gui/gccontainer.h \ gui/gui.cpp \ gui/gui.h \ + gui/hbox.h \ + gui/hbox.cpp \ gui/help.cpp \ gui/help.h \ + gui/inttextbox.h \ + gui/inttextbox.cpp \ gui/inventorywindow.cpp \ gui/inventorywindow.h \ gui/itemcontainer.cpp \ gui/itemcontainer.h \ + gui/itemshortcutcontainer.cpp \ + gui/itemshortcutcontainer.h \ + gui/itemshortcutwindow.cpp \ + gui/itemshortcutwindow.h \ gui/item_amount.cpp \ gui/item_amount.h \ gui/linkhandler.h \ @@ -95,6 +105,8 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ gui/setup.h \ gui/setup_joystick.cpp \ gui/setup_joystick.h \ + gui/setup_keyboard.cpp \ + gui/setup_keyboard.h \ gui/setuptab.h \ gui/setup_video.cpp \ gui/setup_video.h \ @@ -118,22 +130,17 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ gui/trade.h \ gui/unregisterdialog.cpp \ gui/unregisterdialog.h \ + gui/updatewindow.h \ + gui/updatewindow.cpp \ + gui/vbox.h \ + gui/vbox.cpp \ gui/viewport.cpp \ gui/viewport.h \ gui/window.cpp \ gui/window.h \ gui/windowcontainer.cpp \ gui/windowcontainer.h \ - gui/inttextbox.h \ - gui/inttextbox.cpp \ - gui/box.h \ - gui/box.cpp \ - gui/vbox.h \ - gui/vbox.cpp \ - gui/hbox.h \ - gui/hbox.cpp \ - gui/updatewindow.h \ - gui/updatewindow.cpp \ + gui/windowlistener.h \ net/beinghandler.h \ net/beinghandler.cpp \ net/buysellhandler.h \ @@ -193,9 +200,6 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ resources/ambientoverlay.h \ resources/animation.cpp \ resources/animation.h \ - resources/equipmentdb.cpp \ - resources/equipmentdb.h \ - resources/equipmentinfo.h \ resources/image.cpp \ resources/image.h \ resources/imageloader.cpp \ @@ -235,6 +239,7 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ utils/strprintf.h \ utils/strprintf.cpp \ utils/tostring.h \ + utils/trim.h \ utils/xml.cpp \ utils/xml.h \ animatedsprite.cpp \ @@ -271,8 +276,12 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ inventory.h \ item.cpp \ item.h \ + itemshortcut.cpp \ + itemshortcut.h \ joystick.cpp \ joystick.h \ + keyboardconfig.cpp \ + keyboardconfig.h \ localplayer.cpp \ localplayer.h \ lockedarray.h \ @@ -304,7 +313,8 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ sprite.h \ textparticle.cpp \ textparticle.h \ - tileset.h + tileset.h \ + vector.h # set the include path found by configure INCLUDES = \ diff --git a/src/animationparticle.cpp b/src/animationparticle.cpp index 30c33da7..c79a5bc4 100644 --- a/src/animationparticle.cpp +++ b/src/animationparticle.cpp @@ -26,7 +26,7 @@ #include "simpleanimation.h" AnimationParticle::AnimationParticle(Map *map, Animation *animation): - ImageParticle(map, 0), + ImageParticle(map, NULL), mAnimation(new SimpleAnimation(animation)) { } @@ -40,6 +40,7 @@ AnimationParticle::AnimationParticle(Map *map, xmlNodePtr animationNode): AnimationParticle::~AnimationParticle() { delete mAnimation; + mImage = NULL; } bool AnimationParticle::update() diff --git a/src/being.cpp b/src/being.cpp index bdb27384..81bed667 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -36,12 +36,10 @@ #include "resources/resourcemanager.h" #include "resources/imageset.h" +#include "resources/iteminfo.h" #include "gui/gui.h" -#include "resources/resourcemanager.h" -#include "resources/imageset.h" - #include "utils/dtor.h" #include "utils/tostring.h" @@ -58,11 +56,11 @@ Being::Being(Uint16 id, Uint16 job, Map *map): mEquipment(new Equipment()), mId(id), mSex(2), - mWeapon(0), mWalkSpeed(150), mSpeedModifier(1024), mSpriteDirection(DIRECTION_DOWN), mDirection(DOWN), mMap(NULL), + mEquippedWeapon(NULL), mHairStyle(0), mHairColor(0), mSpeechTime(0), mPx(0), mPy(0), @@ -302,7 +300,7 @@ Being::setSpeech(const std::string &text, Uint32 time) void Being::takeDamage(int amount) { - gcn::Font* font; + gcn::Font *font; std::string damage = amount ? toString(amount) : "miss"; // Selecting the right color @@ -312,8 +310,9 @@ Being::takeDamage(int amount) } else { - // hit particle effect - controlParticle(particleEngine->addEffect("graphics/particles/hit.particle.xml", 0, 0)); + // Hit particle effect + controlParticle(particleEngine->addEffect( + "graphics/particles/hit.particle.xml", 0, 0)); if (getType() == MONSTER) { @@ -325,7 +324,7 @@ Being::takeDamage(int amount) } } - // show damage number + // Show damage number particleEngine->addTextSplashEffect(damage, 255, 255, 255, font, mPx + 16, mPy + 16); } @@ -340,7 +339,7 @@ void Being::setMap(Map *map) { // Remove sprite from potential previous map - if (mMap != NULL) + if (mMap) { mMap->removeSprite(mSpriteIterator); } @@ -348,12 +347,12 @@ Being::setMap(Map *map) mMap = map; // Add sprite to potential new map - if (mMap != NULL) + if (mMap) { mSpriteIterator = mMap->addSprite(this); } - //clear particle effect list because child particles became invalid + // Clear particle effect list because child particles became invalid mChildParticleEffects.clear(); } @@ -362,7 +361,8 @@ Being::controlParticle(Particle *particle) { if (particle) { - particle->disableAutoDelete(); //the effect may not die without the beings permission or we segvault + // The effect may not die without the beings permission or we segfault + particle->disableAutoDelete(); mChildParticleEffects.push_back(particle); } } @@ -380,20 +380,12 @@ Being::setAction(Action action) currentAction = ACTION_SIT; break; case ATTACK: - switch (getWeapon()) + if (mEquippedWeapon) { - case 3: - currentAction = ACTION_ATTACK; - break; - case 2: - currentAction = ACTION_ATTACK_BOW; - break; - case 1: - currentAction = ACTION_ATTACK_STAB; - break; - case 0: - currentAction = ACTION_ATTACK; - break; + currentAction = mEquippedWeapon->getAttackType(); + } + else { + currentAction = ACTION_ATTACK; } for (int i = 0; i < VECTOREND_SPRITE; i++) { @@ -533,11 +525,9 @@ Being::logic() } } - //Update particle effects - for ( std::list::iterator i = mChildParticleEffects.begin(); - i != mChildParticleEffects.end(); - - ) + // Update particle effects + for (std::list::iterator i = mChildParticleEffects.begin(); + i != mChildParticleEffects.end();) { (*i)->setPosition((float)mPx + 16.0f, (float)mPy + 32.0f); if (!(*i)->isAlive()) @@ -599,46 +589,6 @@ Being::getType() const return UNKNOWN; } -void -Being::setWeaponById(Uint16 weapon) -{ - //TODO: Use an external file to map weapon IDs to weapon types - switch (weapon) - { - case 529: // iron arrows - case 1199: // arrows - break; - - case 623: //scythe - setWeapon(3); - break; - - case 1200: // bow - case 530: // short bow - case 545: // forest bow - setWeapon(2); - break; - - case 521: // sharp knife - /* UNCOMMENT TO TEST SHARP KNIFE AS SCYTHE - * setWeapon(3) - * break; - */ - case 522: // dagger - case 536: // short sword - case 1201: // knife - setWeapon(1); - break; - - case 0: // unequip - setWeapon(0); - break; - - default: - logger->log("Not a weapon: %d", weapon); - } -} - int Being::getOffset(int step) const { // Check whether we're walking in the requested direction diff --git a/src/being.h b/src/being.h index afb3cb8b..fadf9656 100644 --- a/src/being.h +++ b/src/being.h @@ -38,6 +38,7 @@ class AnimatedSprite; class Equipment; +class ItemInfo; class Item; class Map; class Graphics; @@ -161,8 +162,7 @@ class Being : public Sprite void setSpeech(const std::string &text, Uint32 time); /** - * Puts a damage bubble above this being for the specified amount of - * time. + * Puts a damage bubble above this being. * * @param amount The amount of damage. */ @@ -266,27 +266,6 @@ class Being : public Sprite */ virtual Type getType() const; - /** - * Gets the weapon picture id. - */ - Uint16 getWeapon() const { return mWeapon; } - - /** - * Sets the weapon picture id. - * - * @param weapon the picture id - */ - virtual void - setWeapon(Uint16 weapon) { mWeapon = weapon; } - - /** - * Sets the weapon picture id with the weapon id. - * - * @param weapon the weapon id - */ - void - setWeaponById(Uint16 weapon); - /** * Gets the walk speed. */ @@ -380,30 +359,26 @@ class Being : public Sprite getHeight() const; /** - * Returns the required size of a target cursor for this being + * Returns the required size of a target cursor for this being. */ - virtual Being::TargetCursorSize - getTargetCursorSize() const + virtual Being::TargetCursorSize getTargetCursorSize() const { return TC_MEDIUM; } std::auto_ptr mEquipment; /** - * Take control of a particle + * Take control of a particle. */ - void - controlParticle(Particle *particle); + void controlParticle(Particle *particle); protected: /** * Sets the new path for this being. */ - void - setPath(const Path &path, int mod = 1024); + void setPath(const Path &path, int mod = 1024); Uint16 mId; /**< Unique being id */ Uint8 mSex; /**< Character's gender */ - Uint16 mWeapon; /**< Weapon picture id */ Uint16 mWalkSpeed; /**< Walking speed */ Uint16 mSpeedModifier; /**< Modifier to keep course on sync (1024 = normal speed) */ Uint8 mSpriteDirection; /**< Facing direction */ @@ -411,6 +386,9 @@ class Being : public Sprite Map *mMap; /**< Map on which this being resides */ SpriteIterator mSpriteIterator; + /** Engine-related infos about weapon. */ + const ItemInfo* mEquippedWeapon; + Path mPath; std::string mSpeech; Uint16 mHairStyle, mHairColor; diff --git a/src/game.cpp b/src/game.cpp index 495f9a8d..a40bfa28 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -37,7 +37,9 @@ #include "engine.h" #include "flooritemmanager.h" #include "graphics.h" +#include "itemshortcut.h" #include "joystick.h" +#include "keyboardconfig.h" #include "localplayer.h" #include "log.h" #include "npc.h" @@ -53,6 +55,7 @@ #include "gui/gui.h" #include "gui/help.h" #include "gui/inventorywindow.h" +#include "gui/itemshortcutwindow.h" #include "gui/menuwindow.h" #include "gui/minimap.h" #include "gui/ministatus.h" @@ -116,6 +119,7 @@ TradeWindow *tradeWindow; //BuddyWindow *buddyWindow; HelpWindow *helpWindow; DebugWindow *debugWindow; +ItemShortcutWindow *itemShortcutWindow; BeingManager *beingManager = NULL; FloorItemManager *floorItemManager = NULL; @@ -181,6 +185,7 @@ void createGuiWindows() //buddyWindow = new BuddyWindow(); helpWindow = new HelpWindow(); debugWindow = new DebugWindow(); + itemShortcutWindow = new ItemShortcutWindow(); // Initialize window positions //chargeDialog->setPosition( @@ -193,6 +198,7 @@ void createGuiWindows() chatWindow->setVisible(true); miniStatusWindow->setVisible(true); menuWindow->setVisible(true); + itemShortcutWindow->setVisible(true); } /** @@ -220,6 +226,7 @@ void destroyGuiWindows() //delete buddyWindow; delete helpWindow; delete debugWindow; + delete itemShortcutWindow; } Game::Game(): @@ -420,6 +427,14 @@ void Game::handleInput() { gcn::Window *requestedWindow = NULL; + if (setupWindow->isVisible() && + keyboard.getNewKeyIndex() > keyboard.KEY_NO_VALUE) + { + keyboard.setNewKey((int) event.key.keysym.sym); + keyboard.callbackNewKey(); + keyboard.setNewKeyIndex(keyboard.KEY_NO_VALUE); + return; + } switch (event.key.keysym.sym) { case SDLK_F1: @@ -473,65 +488,7 @@ void Game::handleInput() used = true; } break; - - // Hide certain windows - case SDLK_h: - if (!chatWindow->isFocused()) - { - statusWindow->setVisible(false); - inventoryWindow->setVisible(false); - skillDialog->setVisible(false); - setupWindow->setVisible(false); - equipmentWindow->setVisible(false); - helpWindow->setVisible(false); - debugWindow->setVisible(false); - } - break; - - // Picking up items on the floor - case SDLK_g: - case SDLK_z: - if (!chatWindow->isFocused()) - { - Uint16 x = player_node->mX / 32, y = player_node->mY / 32; - FloorItem *item = floorItemManager->findByCoordinates(x, y); - - // If none below the player, try the tile in front of - // the player - if (!item) - { - // Temporary until tile-based picking is removed. - switch (player_node->getSpriteDirection()) - { - case DIRECTION_UP : --y; break; - case DIRECTION_DOWN : ++y; break; - case DIRECTION_LEFT : --x; break; - case DIRECTION_RIGHT: ++x; break; - default: break; - } - - item = floorItemManager->findByCoordinates(x, y); - } - - if (item) - player_node->pickUp(item); - - used = true; - } - break; - - // attacking - // TODO: Reimplement attacking with joystick buttons - // (old code allowed permanent attacking and not 1 attack - // with each button push) - // I would like to do this but i don't own a joystick. - case SDLK_LCTRL: - case SDLK_RCTRL: - player_node->attack(); - used = true; - break; - - // Quitting confirmation dialog + // Quitting confirmation dialog case SDLK_ESCAPE: if (!quitDialog) { @@ -547,6 +504,74 @@ void Game::handleInput() break; } + if (keyboard.isEnabled() && !chatWindow->isFocused()) + { + const int tKey = keyboard.getKeyIndex(event.key.keysym.sym); + // Checks if any item shortcut is pressed. + for (int i = KeyboardConfig::KEY_SHORTCUT_0; + i <= KeyboardConfig::KEY_SHORTCUT_9; + i++) + { + if (tKey == i) { + itemShortcut->useItem( + i - KeyboardConfig::KEY_SHORTCUT_0); + break; + } + } + switch (tKey) { + case KeyboardConfig::KEY_PICKUP: + { + Uint16 x = player_node->mX / 32; + Uint16 y = player_node->mY / 32; + FloorItem *item = + floorItemManager->findByCoordinates(x, y); + + // If none below the player, try the tile in front + // of the player + if (!item) + { + // Temporary until tile-based picking is + // removed. + switch (player_node->getSpriteDirection()) + { + case DIRECTION_UP : --y; break; + case DIRECTION_DOWN : ++y; break; + case DIRECTION_LEFT : --x; break; + case DIRECTION_RIGHT: ++x; break; + default: break; + } + + item = + floorItemManager->findByCoordinates(x, y); + } + + if (item) + player_node->pickUp(item); + + used = true; + } + break; + case KeyboardConfig::KEY_SIT: + // Player sit action + player_node->toggleSit(); + used = true; + break; + case KeyboardConfig::KEY_HIDE_WINDOWS: + // Hide certain windows + if (!chatWindow->isFocused()) + { + statusWindow->setVisible(false); + inventoryWindow->setVisible(false); + skillDialog->setVisible(false); + setupWindow->setVisible(false); + equipmentWindow->setVisible(false); + helpWindow->setVisible(false); + debugWindow->setVisible(false); + } + break; + } + } + if (requestedWindow) { requestedWindow->setVisible(!requestedWindow->isVisible()); @@ -563,19 +588,14 @@ void Game::handleInput() { switch (event.key.keysym.sym) { - case SDLK_s: - // Player sit action - player_node->toggleSit(); - used = true; - break; - case SDLK_p: // Screenshot (picture, hence the p) { SDL_Surface *screenshot = graphics->getScreenshot(); if (!saveScreenshot(screenshot)) { - logger->log("Error: could not save Screenshot."); + logger->log( + "Error: could not save Screenshot."); } SDL_FreeSurface(screenshot); } @@ -606,6 +626,8 @@ void Game::handleInput() case SDLK_8: emotion = 8; break; case SDLK_9: emotion = 9; break; case SDLK_0: emotion = 10; break; + case SDLK_MINUS: emotion = 11; break; + case SDLK_EQUALS: emotion = 12; break; default: emotion = 0; break; } @@ -638,41 +660,41 @@ void Game::handleInput() } } // End while - + // If the user is configuring the keys then don't respond. + if (!keyboard.isEnabled()) + { + return; + } // Moving player around if (player_node->mAction != Being::DEAD && current_npc == 0 && !chatWindow->isFocused()) { // Get the state of the keyboard keys - Uint8* keys; - keys = SDL_GetKeyState(NULL); + keyboard.refreshActiveKeys(); Uint16 x = player_node->mX / 32, y = player_node->mY / 32; unsigned char direction = 0; // Translate pressed keys to movement and direction - if (keys[SDLK_UP] || keys[SDLK_KP8] || - keys[SDLK_KP7] || keys[SDLK_KP9] || + if ( keyboard.isKeyActive(keyboard.KEY_MOVE_UP) || joystick && joystick->isUp()) { direction |= Being::UP; } - else if (keys[SDLK_DOWN] || keys[SDLK_KP2] || - keys[SDLK_KP1] || keys[SDLK_KP3] || + else if ( keyboard.isKeyActive(keyboard.KEY_MOVE_DOWN) || joystick && joystick->isDown()) { direction |= Being::DOWN; } - if (keys[SDLK_LEFT] || keys[SDLK_KP4] || - keys[SDLK_KP1] || keys[SDLK_KP7] || + + if ( keyboard.isKeyActive(keyboard.KEY_MOVE_LEFT) || joystick && joystick->isLeft()) { direction |= Being::LEFT; } - else if (keys[SDLK_RIGHT] || keys[SDLK_KP6] || - keys[SDLK_KP3] || keys[SDLK_KP9] || + else if ( keyboard.isKeyActive(keyboard.KEY_MOVE_RIGHT) || joystick && joystick->isRight()) { direction |= Being::RIGHT; @@ -681,7 +703,8 @@ void Game::handleInput() player_node->setWalkingDir(direction); // Target the nearest monster if 'a' pressed - if (keys[SDLK_a]) + if ( keyboard.isKeyActive(keyboard.KEY_TARGET_CLOSEST) ) + //if (keys[SDLK_a]) { Being *target = beingManager->findNearestLivingBeing(x, y, 20, Being::MONSTER); diff --git a/src/gui/button.cpp b/src/gui/button.cpp index 4e236c33..0379ebc0 100644 --- a/src/gui/button.cpp +++ b/src/gui/button.cpp @@ -60,10 +60,25 @@ static ButtonData const data[BUTTON_COUNT] = { ImageRect Button::button[BUTTON_COUNT]; +Button::Button(): + mIsLogged(false) +{ + init(); +} + Button::Button(const std::string& caption, const std::string &actionEventId, gcn::ActionListener *listener): gcn::Button(caption), mIsLogged(false) +{ + init(); + setActionEventId(actionEventId); + if (listener) { + addActionListener(listener); + } +} + +void Button::init() { setBorderSize(0); @@ -91,12 +106,7 @@ Button::Button(const std::string& caption, const std::string &actionEventId, btn[mode]->decRef(); } } - mInstances++; - setActionEventId(actionEventId); - if (listener) { - addActionListener(listener); - } } Button::~Button() diff --git a/src/gui/button.h b/src/gui/button.h index eb73e311..d12173b2 100644 --- a/src/gui/button.h +++ b/src/gui/button.h @@ -38,7 +38,13 @@ class ImageRect; class Button : public gcn::Button { public: /** - * Constructor, sets the caption of the button to the given string. + * Default constructor. + */ + Button(); + + /** + * Constructor, sets the caption of the button to the given string and + * adds the given action listener. */ Button(const std::string& caption, const std::string &actionEventId, gcn::ActionListener *listener); @@ -60,6 +66,8 @@ class Button : public gcn::Button { { mIsLogged = enable; } private: + void init(); + static ImageRect button[4]; /**< Button state graphics */ static int mInstances; /**< Number of button instances */ bool mIsLogged; /**< Makes the button appear pressed all the time */ diff --git a/src/gui/buy.cpp b/src/gui/buy.cpp index 6cfe5e18..bbf2102e 100644 --- a/src/gui/buy.cpp +++ b/src/gui/buy.cpp @@ -28,6 +28,7 @@ #include "button.h" #include "scrollarea.h" #include "shop.h" +#include "shoplistbox.h" #include "slider.h" #include "../npc.h" @@ -35,11 +36,15 @@ #include "../resources/itemdb.h" #include "../utils/tostring.h" - BuyDialog::BuyDialog(): Window("Buy"), mMoney(0), mAmountItems(0), mMaxItems(0) { + setResizable(true); + setMinWidth(260); + setMinHeight(230); + setDefaultSize(0, 0, 260, 230); + mShopItems = new ShopItems; mShopItemList = new ShopListBox(mShopItems, mShopItems); @@ -54,32 +59,15 @@ BuyDialog::BuyDialog(): mItemDescLabel = new gcn::Label("Description:"); mItemEffectLabel = new gcn::Label("Effect:"); - setContentSize(260, 210); - mScrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER); - mScrollArea->setDimension(gcn::Rectangle(5, 5, 250, 110)); - mShopItemList->setDimension(gcn::Rectangle(5, 5, 238, 110)); - - mSlider->setDimension(gcn::Rectangle(5, 120, 200, 10)); - mSlider->setEnabled(false); - - mQuantityLabel->setPosition(215, 120); - mMoneyLabel->setPosition(5, 130); - - mIncreaseButton->setPosition(40, 186); mIncreaseButton->setSize(20, 20); - mIncreaseButton->setEnabled(false); - - mDecreaseButton->setPosition(10, 186); mDecreaseButton->setSize(20, 20); - mDecreaseButton->setEnabled(false); + mQuantityLabel->setWidth(60); - mBuyButton->setPosition(180, 186); + mScrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER); + mIncreaseButton->setEnabled(false); + mDecreaseButton->setEnabled(false); mBuyButton->setEnabled(false); - - mQuitButton->setPosition(212, 186); - - mItemEffectLabel->setDimension(gcn::Rectangle(5, 150, 240, 14)); - mItemDescLabel->setDimension(gcn::Rectangle(5, 169, 240, 14)); + mSlider->setEnabled(false); mShopItemList->setActionEventId("item"); mSlider->setActionEventId("slider"); @@ -98,6 +86,8 @@ BuyDialog::BuyDialog(): add(mItemDescLabel); add(mItemEffectLabel); + addWindowListener(this); + loadWindowState("Buy"); setLocationRelativeTo(getParent()); } @@ -118,13 +108,12 @@ void BuyDialog::reset() { mShopItems->clear(); mShopItemList->adjustSize(); - mMoney = 0; - mSlider->setValue(0.0); - // Reset Previous Selected Items to prevent failing asserts + // Reset previous selected items to prevent failing asserts mShopItemList->setSelected(-1); + mSlider->setValue(0); - updateButtonsAndLabels(); + setMoney(0); } void BuyDialog::addItem(int id, int amount, int price) @@ -141,6 +130,7 @@ void BuyDialog::action(const gcn::ActionEvent &event) { setVisible(false); current_npc = 0; + return; } // The following actions require a valid selection @@ -152,21 +142,19 @@ void BuyDialog::action(const gcn::ActionEvent &event) if (event.getId() == "slider") { - mAmountItems = (int)(mSlider->getValue() * mMaxItems); + mAmountItems = (int) mSlider->getValue(); updateButtonsAndLabels(); } else if (event.getId() == "+" && mAmountItems < mMaxItems) { mAmountItems++; - - mSlider->setValue((double) mAmountItems / (double) mMaxItems); + mSlider->setValue(mAmountItems); updateButtonsAndLabels(); } - else if (event.getId() == "-" && mAmountItems > 0) + else if (event.getId() == "-" && mAmountItems > 1) { mAmountItems--; - - mSlider->setValue((double) mAmountItems / (double) mMaxItems); + mSlider->setValue(mAmountItems); updateButtonsAndLabels(); } // TODO: Actually we'd have a bug elsewhere if this check for the number @@ -178,25 +166,69 @@ void BuyDialog::action(const gcn::ActionEvent &event) Net::GameServer::Player::tradeWithNPC (mShopItems->at(selectedItem).id, mAmountItems); - // Update money and adjust the max number of items that can be bought - mMoney -= mAmountItems * mShopItems->at(selectedItem).price; - mMaxItems -= mAmountItems; - // Reset selection - mAmountItems = 0; - mSlider->setValue(0.0); + mAmountItems = 1; + mSlider->setValue(1); + mSlider->gcn::Slider::setScale(1, mMaxItems); - updateButtonsAndLabels(); + // Update money and adjust the max number of items that can be bought + mMaxItems -= mAmountItems; + setMoney(mMoney - mAmountItems * mShopItems->at(selectedItem).price); } } void BuyDialog::selectionChanged(const SelectionEvent &event) { + // Reset amount of items and update labels - mAmountItems = 0; - mSlider->setValue(0.0); + mAmountItems = 1; + mSlider->setValue(1); updateButtonsAndLabels(); + mSlider->gcn::Slider::setScale(1, mMaxItems); +} + +void BuyDialog::windowResized(const WindowEvent &event) +{ + gcn::Rectangle area = getChildrenArea(); + int width = area.width; + int height = area.height; + + mDecreaseButton->setPosition(8, height - 8 - mDecreaseButton->getHeight()); + mIncreaseButton->setPosition( + mDecreaseButton->getX() + mDecreaseButton->getWidth() + 5, + mDecreaseButton->getY()); + + mQuitButton->setPosition( + width - 8 - mQuitButton->getWidth(), + height - 8 - mQuitButton->getHeight()); + mBuyButton->setPosition( + mQuitButton->getX() - 5 - mBuyButton->getWidth(), + mQuitButton->getY()); + + mItemDescLabel->setDimension(gcn::Rectangle(8, + mBuyButton->getY() - 5 - mItemDescLabel->getHeight(), + width - 16, + mItemDescLabel->getHeight())); + mItemEffectLabel->setDimension(gcn::Rectangle(8, + mItemDescLabel->getY() - 5 - mItemEffectLabel->getHeight(), + width - 16, + mItemEffectLabel->getHeight())); + mMoneyLabel->setDimension(gcn::Rectangle(8, + mItemEffectLabel->getY() - 5 - mMoneyLabel->getHeight(), + width - 16, + mMoneyLabel->getHeight())); + + mQuantityLabel->setPosition( + width - mQuantityLabel->getWidth() - 8, + mMoneyLabel->getY() - 5 - mQuantityLabel->getHeight()); + mSlider->setDimension(gcn::Rectangle(8, + mQuantityLabel->getY(), + mQuantityLabel->getX() - 8 - 8, + 10)); + + mScrollArea->setDimension(gcn::Rectangle(8, 8, width - 16, + mSlider->getY() - 5 - 8)); } void @@ -232,14 +264,13 @@ BuyDialog::updateButtonsAndLabels() // Enable or disable buttons and slider mIncreaseButton->setEnabled(mAmountItems < mMaxItems); - mDecreaseButton->setEnabled(mAmountItems > 0); + mDecreaseButton->setEnabled(mAmountItems > 1); mBuyButton->setEnabled(mAmountItems > 0); - mSlider->setEnabled(mMaxItems > 0); + mSlider->setEnabled(mMaxItems > 1); // Update quantity and money labels - mQuantityLabel->setCaption(toString(mAmountItems)); - mQuantityLabel->adjustSize(); + mQuantityLabel->setCaption( + toString(mAmountItems) + " / " + toString(mMaxItems)); mMoneyLabel->setCaption("Price: " + toString(price) + " GP / " + toString(mMoney - price) + " GP" ); - mMoneyLabel->adjustSize(); } diff --git a/src/gui/buy.h b/src/gui/buy.h index 875deef9..63d25583 100644 --- a/src/gui/buy.h +++ b/src/gui/buy.h @@ -28,11 +28,11 @@ #include "window.h" #include "selectionlistener.h" -#include "shoplistbox.h" #include "../guichanfwd.h" class ShopItems; +class ShopListBox; class ListBox; /** @@ -40,7 +40,8 @@ class ListBox; * * \ingroup Interface */ -class BuyDialog : public Window, public gcn::ActionListener, SelectionListener +class BuyDialog : public Window, public gcn::ActionListener, SelectionListener, + WindowListener { public: /** @@ -98,6 +99,11 @@ class BuyDialog : public Window, public gcn::ActionListener, SelectionListener void updateButtonsAndLabels(); + /** + * Called whenever the window is resized. + */ + void windowResized(const WindowEvent &event); + private: gcn::Button *mBuyButton; gcn::Button *mQuitButton; diff --git a/src/gui/char_select.cpp b/src/gui/char_select.cpp index d752cdb3..e8381bef 100644 --- a/src/gui/char_select.cpp +++ b/src/gui/char_select.cpp @@ -48,6 +48,7 @@ #include "../utils/gettext.h" #include "../utils/strprintf.h" #include "../utils/tostring.h" +#include "../utils/trim.h" // Defined in main.cpp, used here for setting the char create dialog extern CharServerHandler charServerHandler; @@ -255,11 +256,6 @@ bool CharSelectDialog::selectByName(const std::string &name) return false; } -std::string CharSelectDialog::getName() -{ - return mNameLabel->getCaption(); -} - CharCreateDialog::CharCreateDialog(Window *parent, int slot): Window(_("Create Character"), true, parent), mSlot(slot) { @@ -410,10 +406,12 @@ CharCreateDialog::action(const gcn::ActionEvent &event) } } -const std::string& +std::string CharCreateDialog::getName() { - return mNameField->getText(); + std::string name = mNameField->getText(); + trim(name); + return name; } void CharCreateDialog::UpdateSliders() diff --git a/src/gui/char_select.h b/src/gui/char_select.h index 9d9184ea..5d0b42fa 100644 --- a/src/gui/char_select.h +++ b/src/gui/char_select.h @@ -60,11 +60,6 @@ class CharSelectDialog : public Window, public gcn::ActionListener bool selectByName(const std::string &name); - /** - * Returns name of selected player - */ - std::string getName(); - private: LockedArray *mCharInfo; @@ -114,22 +109,28 @@ class CharCreateDialog : public Window, public gcn::ActionListener */ ~CharCreateDialog(); - void - action(const gcn::ActionEvent &event); - - const std::string& - getName(); + void action(const gcn::ActionEvent &event); /** * Unlocks the dialog, enabling the create character button again. */ - void - unlock(); + void unlock(); private: int getDistributedPoints(); + void UpdateSliders(); + /** + * Returns the name of the character to create. + */ + std::string getName(); + + /** + * Communicate character creation to the server. + */ + void attemptCharCreate(); + gcn::TextField *mNameField; gcn::Label *mNameLabel; gcn::Button *mNextHairColorButton; @@ -154,12 +155,6 @@ class CharCreateDialog : public Window, public gcn::ActionListener static const int mMaxPoints = 70; int mUsedPoints; - - - /** - * Communicate character creation to the server. - */ - void attemptCharCreate(); }; #endif diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index ba7c7f02..4ed8bb97 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -44,6 +44,7 @@ #include "../net/gameserver/player.h" #include "../utils/dtor.h" +#include "../utils/trim.h" ChatWindow::ChatWindow(): Window(), @@ -125,7 +126,7 @@ void ChatWindow::chatLog(std::string line, int own, std::string channelName) { // Delete overhead from the end of the list - while ((int)mChatlog.size() > mItemsKeep) { + while ((int) mChatlog.size() > mItemsKeep) { mChatlog.pop_back(); } @@ -142,12 +143,15 @@ ChatWindow::chatLog(std::string line, int own, std::string channelName) own = BY_SERVER; } - int pos = line.find(" : "); - if (pos > 0) { + std::string::size_type pos = line.find(" : "); + if (pos != std::string::npos) { tmp.nick = line.substr(0, pos); line.erase(0, pos + 3); } + // Trim whitespace + trim(line); + std::string lineColor = "##0"; // Equiv. to BrowserBox::BLACK switch (own) { case BY_GM: diff --git a/src/gui/debugwindow.cpp b/src/gui/debugwindow.cpp index 11ad37c2..884cdf7e 100644 --- a/src/gui/debugwindow.cpp +++ b/src/gui/debugwindow.cpp @@ -42,6 +42,7 @@ DebugWindow::DebugWindow(): Window("Debug") { setResizable(true); + setCloseButton(true); setDefaultSize(0, 0, 400, 100); loadWindowState("Debug"); @@ -60,15 +61,11 @@ DebugWindow::DebugWindow(): mParticleCountLabel = new gcn::Label("[Particle count: 0]"); mParticleCountLabel->setPosition(100, 60); - Button *closeButton = new Button("Close", "close", this); - closeButton->setPosition(5, 60); - add(mFPSLabel); add(mMusicFileLabel); add(mMapFileLabel); add(mTileMouseLabel); add(mParticleCountLabel); - add(closeButton); } void @@ -106,12 +103,3 @@ DebugWindow::logic() +"]"); mParticleCountLabel->adjustSize(); } - -void -DebugWindow::action(const gcn::ActionEvent &event) -{ - if (event.getId() == "close") - { - setVisible(false); - } -} diff --git a/src/gui/debugwindow.h b/src/gui/debugwindow.h index d082b2ca..9b6f2017 100644 --- a/src/gui/debugwindow.h +++ b/src/gui/debugwindow.h @@ -33,11 +33,11 @@ #include "../guichanfwd.h" /** - * The chat window. + * The debug window. * * \ingroup Interface */ -class DebugWindow : public Window, public gcn::ActionListener +class DebugWindow : public Window { public: /** @@ -50,11 +50,6 @@ class DebugWindow : public Window, public gcn::ActionListener */ void logic(); - /** - * Performs action. - */ - void action(const gcn::ActionEvent &event); - private: gcn::Label *mMusicFileLabel, *mMapFileLabel; gcn::Label *mTileMouseLabel, *mFPSLabel; diff --git a/src/gui/equipmentwindow.cpp b/src/gui/equipmentwindow.cpp index 5e835985..c86a27fc 100644 --- a/src/gui/equipmentwindow.cpp +++ b/src/gui/equipmentwindow.cpp @@ -59,6 +59,7 @@ EquipmentWindow::EquipmentWindow(Equipment *equipment): mBackground(NULL), mSelected(-1) { + setCloseButton(true); setDefaultSize(5, 195, 216, 260); loadWindowState("Equipment"); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index dc51054c..97dd4d44 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -42,7 +42,7 @@ #include "../graphics.h" #include "../log.h" -#include "../resources/image.h" +#include "../resources/imageset.h" #include "../resources/resourcemanager.h" #include "../resources/imageloader.h" @@ -77,8 +77,9 @@ class GuiConfigListener : public ConfigListener }; Gui::Gui(Graphics *graphics): - mMouseCursor(NULL), - mCustomCursor(false) + mCustomCursor(false), + mMouseCursors(NULL), + mCursorType(CURSOR_POINTER) { logger->log("Initializing GUI..."); // Set graphics @@ -106,7 +107,7 @@ Gui::Gui(Graphics *graphics): // Set global font try { - mGuiFont = new TrueTypeFont("data/fonts/dejavusans.ttf", 12); + mGuiFont = new TrueTypeFont("data/fonts/dejavusans.ttf", 11); } catch (gcn::Exception e) { @@ -139,7 +140,7 @@ Gui::Gui(Graphics *graphics): hitBlueFont = new gcn::ImageFont("graphics/gui/hits_blue.png", "0123456789"); hitYellowFont = new gcn::ImageFont("graphics/gui/hits_yellow.png", - "mis"); + "0123456789misxp "); } catch (gcn::Exception e) { @@ -169,8 +170,8 @@ Gui::~Gui() delete hitBlueFont; delete hitYellowFont; - if (mMouseCursor) { - mMouseCursor->decRef(); + if (mMouseCursors) { + mMouseCursors->decRef(); } delete mGuiFont; @@ -181,12 +182,6 @@ Gui::~Gui() delete guiInput; } -void -Gui::logic() -{ - gcn::Gui::logic(); -} - void Gui::draw() { @@ -196,11 +191,13 @@ Gui::draw() int mouseX, mouseY; Uint8 button = SDL_GetMouseState(&mouseX, &mouseY); - if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS || button & SDL_BUTTON(1)) - && mCustomCursor) + if ((SDL_GetAppState() & SDL_APPMOUSEFOCUS || button & SDL_BUTTON(1)) && + mCustomCursor) { - static_cast(mGraphics)-> - drawImage(mMouseCursor, mouseX - 5, mouseY - 2); + static_cast(mGraphics)->drawImage( + mMouseCursors->get(mCursorType), + mouseX - 15, + mouseY - 17); } mGraphics->popClipArea(); @@ -220,9 +217,11 @@ Gui::setUseCustomCursor(bool customCursor) // Load the mouse cursor ResourceManager *resman = ResourceManager::getInstance(); - mMouseCursor = resman->getImage("graphics/gui/mouse.png"); - if (!mMouseCursor) { - logger->error("Unable to load mouse cursor."); + mMouseCursors = + resman->getImageSet("graphics/gui/mouse.png", 40, 40); + + if (!mMouseCursors) { + logger->error("Unable to load mouse cursors."); } } else @@ -231,9 +230,9 @@ Gui::setUseCustomCursor(bool customCursor) SDL_ShowCursor(SDL_ENABLE); // Unload the mouse cursor - if (mMouseCursor) { - mMouseCursor->decRef(); - mMouseCursor = NULL; + if (mMouseCursors) { + mMouseCursors->decRef(); + mMouseCursors = NULL; } } } diff --git a/src/gui/gui.h b/src/gui/gui.h index 5f2cc810..1e4b9348 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -30,7 +30,7 @@ class GuiConfigListener; class Graphics; -class Image; +class ImageSet; class Viewport; /** @@ -59,36 +59,49 @@ class Gui : public gcn::Gui */ ~Gui(); - /** - * Works around Guichan bug - */ - void - logic(); - /** * Draws the whole Gui by calling draw functions down in the * Gui hierarchy. It also draws the mouse pointer. */ - void - draw(); + void draw(); /** - * Return game font + * Return game font. */ - gcn::Font* - getFont() { return mGuiFont; } + gcn::Font* getFont() const + { return mGuiFont; } /** * Sets whether a custom cursor should be rendered. */ - void - setUseCustomCursor(bool customCursor); + void setUseCustomCursor(bool customCursor); + + /** + * Sets which cursor should be used. + */ + void setCursorType(int index) + { mCursorType = index; } + + /** + * Cursors are in graphic order from left to right. + * CURSOR_POINTER should be left untouched. + * CURSOR_TOTAL should always be last. + */ + enum { + CURSOR_POINTER = 0, + CURSOR_RESIZE_ACROSS, + CURSOR_RESIZE_DOWN, + CURSOR_RESIZE_DOWN_LEFT, + CURSOR_RESIZE_DOWN_RIGHT, + CURSOR_TOTAL + }; private: GuiConfigListener *mConfigListener; gcn::Font *mGuiFont; /**< The global GUI font */ - Image *mMouseCursor; /**< Mouse cursor image */ bool mCustomCursor; /**< Show custom cursor */ + ImageSet *mMouseCursors; /**< Mouse cursor images */ + int mCursorType; }; extern Gui *gui; /**< The GUI system */ diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp index 085ab188..1e62b130 100644 --- a/src/gui/inventorywindow.cpp +++ b/src/gui/inventorywindow.cpp @@ -51,6 +51,7 @@ InventoryWindow::InventoryWindow(): mSplit(false) { setResizable(true); + setCloseButton(true); setMinWidth(240); setMinHeight(172); // If you adjust these defaults, don't forget to adjust the trade window's. @@ -69,7 +70,6 @@ InventoryWindow::InventoryWindow(): mItems->addSelectionListener(this); mInvenScroll = new ScrollArea(mItems); - mInvenScroll->setPosition(8, 8); mItemNameLabel = new gcn::Label(strprintf(_("Name: %s"), "")); mItemDescriptionLabel = new gcn::Label( @@ -100,8 +100,8 @@ InventoryWindow::InventoryWindow(): mSplitButton->setWidth(48); } + addWindowListener(this); loadWindowState("Inventory"); - updateContentSize(); } InventoryWindow::~InventoryWindow() @@ -130,7 +130,6 @@ void InventoryWindow::logic() mWeightLabel->setCaption( strprintf(_("Total Weight: %d - Maximum Weight: %d"), player_node->getTotalWeight(), player_node->getMaxWeight())); - mWeightLabel->adjustSize(); } void InventoryWindow::action(const gcn::ActionEvent &event) @@ -215,7 +214,7 @@ void InventoryWindow::mouseClicked(gcn::MouseEvent &event) } } -void InventoryWindow::updateContentSize() +void InventoryWindow::windowResized(const WindowEvent &event) { const gcn::Rectangle area = getChildrenArea(); @@ -260,8 +259,7 @@ Item* InventoryWindow::getItem() return mItems->getItem(); } -void -InventoryWindow::keyPressed(gcn::KeyEvent &event) +void InventoryWindow::keyPressed(gcn::KeyEvent &event) { switch (event.getKey().getValue()) { @@ -271,8 +269,7 @@ InventoryWindow::keyPressed(gcn::KeyEvent &event) } } -void -InventoryWindow::keyReleased(gcn::KeyEvent &event) +void InventoryWindow::keyReleased(gcn::KeyEvent &event) { switch (event.getKey().getValue()) { diff --git a/src/gui/inventorywindow.h b/src/gui/inventorywindow.h index 37ef0406..a9fdadf2 100644 --- a/src/gui/inventorywindow.h +++ b/src/gui/inventorywindow.h @@ -29,8 +29,9 @@ #include -#include "window.h" #include "selectionlistener.h" +#include "window.h" +#include "windowlistener.h" #include "../guichanfwd.h" @@ -45,7 +46,8 @@ class ItemContainer; class InventoryWindow : public Window, public gcn::ActionListener, public gcn::KeyListener, - public SelectionListener + public SelectionListener, + public WindowListener { public: /** @@ -92,7 +94,10 @@ class InventoryWindow : public Window, */ void selectionChanged(const SelectionEvent &event); - void updateContentSize(); /**< Updates widgets size/position. */ + /** + * Called whenever the window is resized. + */ + void windowResized(const WindowEvent &event); private: void updateButtons(); /**< Updates button states. */ diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cpp index b032bd49..bddf7cee 100644 --- a/src/gui/itemcontainer.cpp +++ b/src/gui/itemcontainer.cpp @@ -30,6 +30,7 @@ #include "../graphics.h" #include "../inventory.h" #include "../item.h" +#include "../itemshortcut.h" #include "../localplayer.h" #include "../resources/image.h" @@ -38,6 +39,9 @@ #include "../utils/tostring.h" +// TODO: Add support for adding items to the item shortcut window (global +// itemShortcut). + static const int BOX_WIDTH = 36; static const int BOX_HEIGHT = 44; diff --git a/src/gui/itemshortcutcontainer.cpp b/src/gui/itemshortcutcontainer.cpp new file mode 100644 index 00000000..1943ef93 --- /dev/null +++ b/src/gui/itemshortcutcontainer.cpp @@ -0,0 +1,224 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "itemshortcutcontainer.h" + +#include "../graphics.h" +#include "../item.h" +#include "../itemshortcut.h" +#include "../keyboardconfig.h" + +#include "../resources/image.h" +#include "../resources/resourcemanager.h" + +#include "../utils/tostring.h" + +ItemShortcutContainer::ItemShortcutContainer(): + mGridWidth(1), + mGridHeight(1), + mItemClicked(false), + mItemMoved(NULL) +{ + addMouseListener(this); + + ResourceManager *resman = ResourceManager::getInstance(); + + mBackgroundImg = resman->getImage("graphics/gui/item_shortcut_bgr.png"); + mMaxItems = itemShortcut->getItemCount(); + + mBoxHeight = 42; + mBoxWidth = 36; +} + +ItemShortcutContainer::~ItemShortcutContainer() +{ + mBackgroundImg->decRef(); +} + +void +ItemShortcutContainer::logic() +{ + gcn::Widget::logic(); + + int i = itemShortcut->getItemCount(); + + if (i != mMaxItems) + { + mMaxItems = i; + setWidth(getWidth()); + } +} + +void +ItemShortcutContainer::draw(gcn::Graphics *graphics) +{ + Graphics *g = static_cast(graphics); + + for (int i = 0; i < mMaxItems; i++) + { + const int itemX = (i % mGridWidth) * mBoxWidth; + const int itemY = (i / mGridWidth) * mBoxHeight; + + g->drawImage(mBackgroundImg, itemX, itemY); + + // Draw item keyboard shortcut. + const char *key = SDL_GetKeyName( + (SDLKey) keyboard.getKeyValue(keyboard.KEY_SHORTCUT_0+i)); + g->drawText(key, itemX + 2, itemY + 2, gcn::Graphics::LEFT); + + Item *item = itemShortcut->getItem(i); + if (item) { + // Draw item icon. + Image* image = item->getInfo().getImage(); + if (image) { + g->drawImage(image, itemX, itemY); + g->drawText( + toString(item->getQuantity()), + itemX + mBoxWidth / 2, + itemY + mBoxHeight - 14, + gcn::Graphics::CENTER); + } + } + } + if (mItemMoved) + { + // Draw the item image being dragged by the cursor. + Image* image = mItemMoved->getInfo().getImage(); + if (image) + { + const int tPosX = mCursorPosX - (image->getWidth() / 2); + const int tPosY = mCursorPosY - (image->getHeight() / 2); + + g->drawImage(image, tPosX, tPosY); + g->drawText( + toString(mItemMoved->getQuantity()), + tPosX + mBoxWidth / 2, + tPosY + mBoxHeight - 14, + gcn::Graphics::CENTER); + } + } +} + +void +ItemShortcutContainer::setWidth(int width) +{ + gcn::Widget::setWidth(width); + + mGridWidth = getWidth() / mBoxWidth; + if (mGridWidth < 1) { + mGridWidth = 1; + } + + setHeight((mMaxItems / mGridWidth + + (mMaxItems % mGridWidth > 0 ? 1 : 0)) * mBoxHeight); + + mGridHeight = getHeight() / mBoxHeight; + if (mGridHeight < 1) { + mGridHeight = 1; + } +} + +void +ItemShortcutContainer::mouseDragged(gcn::MouseEvent &event) +{ + if (event.getButton() == gcn::MouseEvent::LEFT) { + if (!mItemMoved && mItemClicked) { + const int index = getIndexFromGrid(event.getX(), event.getY()); + if (index == -1) { + return; + } + Item *item = itemShortcut->getItem(index); + if (item) + { + mItemMoved = item; + itemShortcut->removeItem(index); + } + } + if (mItemMoved) { + mCursorPosX = event.getX(); + mCursorPosY = event.getY(); + } + } +} + +void +ItemShortcutContainer::mousePressed(gcn::MouseEvent &event) +{ + const int index = getIndexFromGrid(event.getX(), event.getY()); + if (index == -1) { + return; + } + + // Stores the selected item if theirs one. + if (itemShortcut->isItemSelected()) { + itemShortcut->setItem(index); + itemShortcut->setItemSelected(NULL); + } + else if (itemShortcut->getItem(index)) { + mItemClicked = true; + } +} + +void +ItemShortcutContainer::mouseReleased(gcn::MouseEvent &event) +{ + if (event.getButton() == gcn::MouseEvent::LEFT) + { + if (itemShortcut->isItemSelected()) + { + itemShortcut->setItemSelected(NULL); + } + const int index = getIndexFromGrid(event.getX(), event.getY()); + if (index == -1) { + mItemMoved = NULL; + return; + } + if (mItemMoved) { + itemShortcut->setItems(index, mItemMoved); + mItemMoved = NULL; + } + else if (itemShortcut->getItem(index) && mItemClicked) + { + itemShortcut->useItem(index); + } + if (mItemClicked) { + mItemClicked = false; + } + } +} + +int +ItemShortcutContainer::getIndexFromGrid(int pointX, int pointY) const +{ + const gcn::Rectangle tRect = gcn::Rectangle( + 0, 0, mGridWidth * mBoxWidth, mGridHeight * mBoxHeight); + if (!tRect.isPointInRect(pointX, pointY)) { + return -1; + } + const int index = ((pointY / mBoxHeight) * mGridWidth) + + pointX / mBoxWidth; + if (index >= mMaxItems) + { + return -1; + } + return index; +} diff --git a/src/gui/itemshortcutcontainer.h b/src/gui/itemshortcutcontainer.h new file mode 100644 index 00000000..4b154cbb --- /dev/null +++ b/src/gui/itemshortcutcontainer.h @@ -0,0 +1,115 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _TMW_ITEMSHORTCUTCONTAINER_H__ +#define _TMW_ITEMSHORTCUTCONTAINER_H__ + +#include +#include + +#include + +class Image; +class Item; + +/** + * An item shortcut container. Used to quickly use items. + * + * \ingroup GUI + */ +class ItemShortcutContainer : public gcn::Widget, public gcn::MouseListener +{ + public: + /** + * Constructor. Initializes the graphic. + */ + ItemShortcutContainer(); + + /** + * Destructor. + */ + virtual ~ItemShortcutContainer(); + + /** + * Handles the logic of the ItemContainer + */ + void logic(); + + /** + * Draws the items. + */ + void draw(gcn::Graphics *graphics); + + /** + * Sets the width of the container. This is used to determine the new + * height of the container. + */ + void setWidth(int width); + + /** + * Handles mouse when dragged. + */ + void mouseDragged(gcn::MouseEvent &event); + + /** + * Handles mouse when pressed. + */ + void mousePressed(gcn::MouseEvent &event); + + /** + * Handles mouse release. + */ + void mouseReleased(gcn::MouseEvent &event); + + + int getMaxItems() + { return mMaxItems; } + + int getBoxWidth() + { return mBoxWidth; } + + int getBoxHeight() + { return mBoxHeight; } + + private: + /** + * Gets the index from the grid provided the point is in an item box. + * + * @param pointX X coordinate of the point. + * @param pointY Y coordinate of the point. + * @return index on success, -1 on failure. + */ + int getIndexFromGrid(int pointX, int pointY) const; + + Image *mBackgroundImg; + + int mMaxItems; + int mBoxWidth; + int mBoxHeight; + int mCursorPosX, mCursorPosY; + int mGridWidth, mGridHeight; + bool mItemClicked; + Item *mItemMoved; + +}; + +#endif diff --git a/src/gui/itemshortcutwindow.cpp b/src/gui/itemshortcutwindow.cpp new file mode 100644 index 00000000..dd97a7db --- /dev/null +++ b/src/gui/itemshortcutwindow.cpp @@ -0,0 +1,74 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "itemshortcutwindow.h" + +#include "itemshortcutcontainer.h" +#include "scrollarea.h" + +static const int SCROLL_PADDING = 0; + +ItemShortcutWindow::ItemShortcutWindow() +{ + // no title presented, title bar is padding so window can be moved. + gcn::Window::setTitleBarHeight(gcn::Window::getPadding()); + setShowTitle(false); + setResizable(true); + setDefaultSize(758, 174, 42, 426); + + mItems = new ItemShortcutContainer(); + + int border = SCROLL_PADDING * 2 + getPadding() * 2; + setMinWidth(mItems->getBoxWidth() + border); + setMinHeight(mItems->getBoxHeight() + border); + setMaxWidth(mItems->getBoxWidth() * mItems->getMaxItems() + border); + setMaxHeight(mItems->getBoxHeight() * mItems->getMaxItems() + border); + + mInvenScroll = new ScrollArea(mItems); + mInvenScroll->setPosition(SCROLL_PADDING, SCROLL_PADDING); + mInvenScroll->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER); + + add(mInvenScroll); + + addWindowListener(this); + loadWindowState("ItemShortcut"); +} + +ItemShortcutWindow::~ItemShortcutWindow() +{ + delete mItems; + delete mInvenScroll; +} + +void ItemShortcutWindow::logic() +{ + Window::logic(); +} + +void ItemShortcutWindow::windowResized(const WindowEvent &event) +{ + const gcn::Rectangle area = getChildrenArea(); + + mInvenScroll->setSize( + area.width - SCROLL_PADDING, + area.height - SCROLL_PADDING); +} diff --git a/src/gui/itemshortcutwindow.h b/src/gui/itemshortcutwindow.h new file mode 100644 index 00000000..83bc348d --- /dev/null +++ b/src/gui/itemshortcutwindow.h @@ -0,0 +1,69 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _TMW_ITEMSHORTCUTWINDOW_H +#define _TMW_ITEMSHORTCUTWINDOW_H + +#include "window.h" +#include "windowlistener.h" + +#include "../guichanfwd.h" + +class ItemShortcutContainer; + +/** + * Inventory dialog. + * + * \ingroup Interface + */ +class ItemShortcutWindow : public Window, WindowListener +{ + public: + /** + * Constructor. + */ + ItemShortcutWindow(); + + /** + * Destructor. + */ + ~ItemShortcutWindow(); + + /** + * Logic (updates buttons and weight information). + */ + void logic(); + + /** + * Called whenever the window is resized. + */ + void windowResized(const WindowEvent &event); + + private: + ItemShortcutContainer *mItems; + + gcn::ScrollArea *mInvenScroll; +}; + +extern ItemShortcutWindow *itemShortcutWindow; + +#endif diff --git a/src/gui/menuwindow.cpp b/src/gui/menuwindow.cpp index bfa2f1f2..8d4d184d 100644 --- a/src/gui/menuwindow.cpp +++ b/src/gui/menuwindow.cpp @@ -37,6 +37,7 @@ extern Window *inventoryWindow; extern Window *equipmentWindow; extern Window *skillDialog; extern Window *statusWindow; +extern Window *itemShortcutWindow; namespace { struct MenuWindowListener : public gcn::ActionListener @@ -62,6 +63,7 @@ MenuWindow::MenuWindow(): N_("Equipment"), N_("Inventory"), N_("Skills"), + N_("Shortcut"), N_("Setup"), 0 }; @@ -109,14 +111,20 @@ void MenuWindowListener::action(const gcn::ActionEvent &event) { window = skillDialog; } + else if (event.getId() == "Shortcut") + { + window = itemShortcutWindow; + } else if (event.getId() == "Setup") { window = setupWindow; } - if (window) { + if (window) + { window->setVisible(!window->isVisible()); - if (window->isVisible()) { + if (window->isVisible()) + { window->requestMoveToTop(); } } diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp index 48bbd3d0..aeb6637d 100644 --- a/src/gui/popupmenu.cpp +++ b/src/gui/popupmenu.cpp @@ -200,12 +200,6 @@ void PopupMenu::handleLink(const std::string& link) setVisible(false); - /* - * This is need cause of a bug in guichan that leave - * the focus on the popup menu even if is not visible. - */ - _getFocusHandler()->focusNone(); - mBeing = NULL; mFloorItem = NULL; mItem = NULL; diff --git a/src/gui/selectionlistener.h b/src/gui/selectionlistener.h index b39672b5..917a4871 100644 --- a/src/gui/selectionlistener.h +++ b/src/gui/selectionlistener.h @@ -25,33 +25,23 @@ #define _TMW_SELECTIONLISTENER_H__ #include +#include /** * An event that characterizes a change in the current selection. * * \ingroup GUI */ -class SelectionEvent +class SelectionEvent : public gcn::Event { public: /** * Constructor. */ SelectionEvent(gcn::Widget *source): - mSource(source) + gcn::Event(source) { } - - /** - * The widget from which the event originated. - */ - gcn::Widget* getSource() const - { - return mSource; - } - - private: - gcn::Widget *mSource; }; /** diff --git a/src/gui/sell.cpp b/src/gui/sell.cpp index b601d70c..5f1011c1 100644 --- a/src/gui/sell.cpp +++ b/src/gui/sell.cpp @@ -44,58 +44,44 @@ SellDialog::SellDialog(): Window("Sell"), mMaxItems(0), mAmountItems(0) { + setResizable(true); + setMinWidth(260); + setMinHeight(230); + setDefaultSize(0, 0, 260, 230); + mShopItems = new ShopItems(); mShopItemList = new ShopListBox(mShopItems, mShopItems); - ScrollArea *scrollArea = new ScrollArea(mShopItemList); + mScrollArea = new ScrollArea(mShopItemList); mSlider = new Slider(1.0); mQuantityLabel = new gcn::Label("0"); mMoneyLabel = new gcn::Label("Money: 0 GP / Total: 0 GP"); - mItemDescLabel = new gcn::Label("Description:"); - mItemEffectLabel = new gcn::Label("Effect:"); mIncreaseButton = new Button("+", "+", this); mDecreaseButton = new Button("-", "-", this); mSellButton = new Button("Sell", "sell", this); - Button *quitButton = new Button("Quit", "quit", this); - mSellButton->setEnabled(false); - - setContentSize(260, 210); - scrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER); - scrollArea->setDimension(gcn::Rectangle(5, 5, 250, 110)); - mShopItemList->setDimension(gcn::Rectangle(5, 5, 238, 110)); - - mSlider->setDimension(gcn::Rectangle(5, 120, 200, 10)); - mSlider->setEnabled(false); - - mQuantityLabel->setPosition(215, 120); + mQuitButton = new Button("Quit", "quit", this); + mItemDescLabel = new gcn::Label("Description:"); + mItemEffectLabel = new gcn::Label("Effect:"); - mIncreaseButton->setPosition(40, 186); mIncreaseButton->setSize(20, 20); - mIncreaseButton->setEnabled(false); - - mDecreaseButton->setPosition(10, 186); mDecreaseButton->setSize(20, 20); - mDecreaseButton->setEnabled(false); + mQuantityLabel->setWidth(60); - mMoneyLabel->setPosition(5, 130); - mItemEffectLabel->setDimension(gcn::Rectangle(5, 150, 240, 14)); - mItemDescLabel->setDimension(gcn::Rectangle(5, 169, 240, 14)); - - mSellButton->setPosition(175, 186); + mScrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER); + mIncreaseButton->setEnabled(false); + mDecreaseButton->setEnabled(false); mSellButton->setEnabled(false); + mSlider->setEnabled(false); - quitButton->setPosition(208, 186); - + mShopItemList->setPriceCheck(false); mShopItemList->setActionEventId("item"); mSlider->setActionEventId("slider"); - mShopItemList->setPriceCheck(false); - mShopItemList->addActionListener(this); mShopItemList->addSelectionListener(this); mSlider->addActionListener(this); - add(scrollArea); + add(mScrollArea); add(mSlider); add(mQuantityLabel); add(mMoneyLabel); @@ -104,8 +90,10 @@ SellDialog::SellDialog(): add(mIncreaseButton); add(mDecreaseButton); add(mSellButton); - add(quitButton); + add(mQuitButton); + addWindowListener(this); + loadWindowState("Sell"); setLocationRelativeTo(getParent()); } @@ -117,7 +105,7 @@ SellDialog::~SellDialog() void SellDialog::reset() { mShopItems->clear(); - mSlider->setValue(0.0); + mSlider->setValue(0); // Reset previous selected item to prevent failing asserts mShopItemList->setSelected(-1); @@ -135,16 +123,11 @@ void SellDialog::action(const gcn::ActionEvent &event) { int selectedItem = mShopItemList->getSelected(); - if (event.getId() == "item") - { - mAmountItems = 0; - mSlider->setValue(0); - updateButtonsAndLabels(); - } - else if (event.getId() == "quit") + if (event.getId() == "quit") { setVisible(false); current_npc = 0; + return; } // The following actions require a valid item selection @@ -156,21 +139,19 @@ void SellDialog::action(const gcn::ActionEvent &event) if (event.getId() == "slider") { - mAmountItems = (int) (mSlider->getValue() * mMaxItems); + mAmountItems = (int) mSlider->getValue(); updateButtonsAndLabels(); } else if (event.getId() == "+" && mAmountItems < mMaxItems) { mAmountItems++; - - mSlider->setValue((double) mAmountItems /(double) mMaxItems); + mSlider->setValue(mAmountItems); updateButtonsAndLabels(); } - else if (event.getId() == "-" && mAmountItems > 0) + else if (event.getId() == "-" && mAmountItems > 1) { mAmountItems--; - - mSlider->setValue((double) mAmountItems / (double) mMaxItems); + mSlider->setValue(mAmountItems); updateButtonsAndLabels(); } else if (event.getId() == "sell" && mAmountItems > 0 @@ -182,8 +163,7 @@ void SellDialog::action(const gcn::ActionEvent &event) mMaxItems -= mAmountItems; mShopItems->getShop()->at(selectedItem).quantity = mMaxItems; mPlayerMoney += (mAmountItems * mShopItems->at(selectedItem).price); - mAmountItems = 0; - mSlider->setValue(0); + mAmountItems = 1; if (!mMaxItems) { @@ -194,6 +174,7 @@ void SellDialog::action(const gcn::ActionEvent &event) } else { + mSlider->gcn::Slider::setScale(1, mMaxItems); // Update only when there are items left, the entry doesn't exist // otherwise and can't be updated updateButtonsAndLabels(); @@ -204,10 +185,54 @@ void SellDialog::action(const gcn::ActionEvent &event) void SellDialog::selectionChanged(const SelectionEvent &event) { // Reset amount of items and update labels - mAmountItems = 0; + mAmountItems = 1; mSlider->setValue(0); updateButtonsAndLabels(); + mSlider->gcn::Slider::setScale(1, mMaxItems); +} + +void SellDialog::windowResized(const WindowEvent &event) +{ + gcn::Rectangle area = getChildrenArea(); + int width = area.width; + int height = area.height; + + mDecreaseButton->setPosition(8, height - 8 - mDecreaseButton->getHeight()); + mIncreaseButton->setPosition( + mDecreaseButton->getX() + mDecreaseButton->getWidth() + 5, + mDecreaseButton->getY()); + + mQuitButton->setPosition( + width - 8 - mQuitButton->getWidth(), + height - 8 - mQuitButton->getHeight()); + mSellButton->setPosition( + mQuitButton->getX() - 5 - mSellButton->getWidth(), + mQuitButton->getY()); + + mItemDescLabel->setDimension(gcn::Rectangle(8, + mSellButton->getY() - 5 - mItemDescLabel->getHeight(), + width - 16, + mItemDescLabel->getHeight())); + mItemEffectLabel->setDimension(gcn::Rectangle(8, + mItemDescLabel->getY() - 5 - mItemEffectLabel->getHeight(), + width - 16, + mItemEffectLabel->getHeight())); + mMoneyLabel->setDimension(gcn::Rectangle(8, + mItemEffectLabel->getY() - 5 - mMoneyLabel->getHeight(), + width - 16, + mMoneyLabel->getHeight())); + + mQuantityLabel->setPosition( + width - mQuantityLabel->getWidth() - 8, + mMoneyLabel->getY() - 5 - mQuantityLabel->getHeight()); + mSlider->setDimension(gcn::Rectangle(8, + mQuantityLabel->getY(), + mQuantityLabel->getX() - 8 - 8, + 10)); + + mScrollArea->setDimension(gcn::Rectangle(8, 8, width - 16, + mSlider->getY() - 5 - 8)); } void SellDialog::setMoney(int amount) @@ -246,15 +271,13 @@ SellDialog::updateButtonsAndLabels() // Update Buttons and slider mSellButton->setEnabled(mAmountItems > 0); - mDecreaseButton->setEnabled(mAmountItems > 0); + mDecreaseButton->setEnabled(mAmountItems > 1); mIncreaseButton->setEnabled(mAmountItems < mMaxItems); - mSlider->setEnabled(selectedItem > -1); + mSlider->setEnabled(mMaxItems > 1); // Update the quantity and money labels mQuantityLabel->setCaption( toString(mAmountItems) + " / " + toString(mMaxItems)); - mQuantityLabel->adjustSize(); mMoneyLabel->setCaption("Money: " + toString(income) + " GP / Total: " + toString(mPlayerMoney + income) + " GP"); - mMoneyLabel->adjustSize(); } diff --git a/src/gui/sell.h b/src/gui/sell.h index fc42fd1c..d1e2ddd2 100644 --- a/src/gui/sell.h +++ b/src/gui/sell.h @@ -28,6 +28,7 @@ #include "window.h" #include "selectionlistener.h" +#include "windowlistener.h" #include "../guichanfwd.h" @@ -40,7 +41,8 @@ class ShopListBox; * * \ingroup Interface */ -class SellDialog : public Window, gcn::ActionListener, SelectionListener +class SellDialog : public Window, gcn::ActionListener, SelectionListener, + WindowListener { public: /** @@ -77,22 +79,28 @@ class SellDialog : public Window, gcn::ActionListener, SelectionListener */ void selectionChanged(const SelectionEvent &event); + /** + * Called whenever the window is resized. + */ + void windowResized(const WindowEvent &event); + /** * Gives Player's Money amount */ void setMoney(int amount); + private: /** * Updates the state of buttons and labels. */ - void - updateButtonsAndLabels(); + void updateButtonsAndLabels(); - private: gcn::Button *mSellButton; + gcn::Button *mQuitButton; gcn::Button *mIncreaseButton; gcn::Button *mDecreaseButton; ShopListBox *mShopItemList; + gcn::ScrollArea *mScrollArea; gcn::Label *mMoneyLabel; gcn::Label *mItemDescLabel; gcn::Label *mItemEffectLabel; diff --git a/src/gui/setup.cpp b/src/gui/setup.cpp index 3ea19059..6a13232a 100644 --- a/src/gui/setup.cpp +++ b/src/gui/setup.cpp @@ -27,6 +27,7 @@ #include "setup_audio.h" #include "setup_joystick.h" #include "setup_video.h" +#include "setup_keyboard.h" #include "tabbedcontainer.h" #include "../utils/dtor.h" @@ -43,7 +44,8 @@ extern Window *skillDialog; Setup::Setup(): Window(_("Setup")) { - int width = 230; + setCloseButton(true); + int width = 250; int height = 245; setContentSize(width, height); @@ -59,7 +61,7 @@ Setup::Setup(): } TabbedContainer *panel = new TabbedContainer(); - panel->setDimension(gcn::Rectangle(5, 5, 220, 205)); + panel->setDimension(gcn::Rectangle(5, 5, 250, 205)); panel->setOpaque(false); SetupTab *tab; @@ -76,6 +78,10 @@ Setup::Setup(): panel->addTab(tab, _("Joystick")); mTabs.push_back(tab); + tab = new Setup_Keyboard(); + panel->addTab(tab, "Keyboard"); + mTabs.push_back(tab); + add(panel); setLocationRelativeTo(getParent()); diff --git a/src/gui/setup_keyboard.cpp b/src/gui/setup_keyboard.cpp new file mode 100644 index 00000000..e88080b5 --- /dev/null +++ b/src/gui/setup_keyboard.cpp @@ -0,0 +1,187 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "setup_keyboard.h" + +#include +#include + +#include "button.h" +#include "listbox.h" +#include "ok_dialog.h" +#include "scrollarea.h" + +#include "../configuration.h" +#include "../keyboardconfig.h" + +#include "../utils/tostring.h" + +#include + +/** + * The list model for key function list. + * + * \ingroup Interface + */ +class KeyListModel : public gcn::ListModel +{ + public: + /** + * Returns the number of elements in container. + */ + int getNumberOfElements() { return keyboard.KEY_TOTAL; } + + /** + * Returns element from container. + */ + std::string getElementAt(int i) { return mKeyFunctions[i]; } + + /** + * Sets element from container. + */ + void setElementAt(int i, std::string caption) + { + mKeyFunctions[i] = caption; + } + + private: + std::string mKeyFunctions[KeyboardConfig::KEY_TOTAL]; +}; + +Setup_Keyboard::Setup_Keyboard(): + mKeyListModel(new KeyListModel()), + mKeyList(new ListBox(mKeyListModel)), + mKeySetting(false) +{ + keyboard.setSetupKeyboard(this); + setOpaque(false); + + refreshKeys(); + + mKeyList->setDimension(gcn::Rectangle(0, 0, 185, 140)); + mKeyList->addActionListener(this); + mKeyList->setSelected(-1); + + ScrollArea *scrollArea = new ScrollArea(mKeyList); + scrollArea->setDimension(gcn::Rectangle(10, 10, 200, 140)); + add(scrollArea); + + mAssignKeyButton = new Button("Assign", "assign", this); + mAssignKeyButton->setPosition(165, 155); + mAssignKeyButton->addActionListener(this); + mAssignKeyButton->setEnabled(false); + add(mAssignKeyButton); + + mMakeDefaultButton = new Button("Default", "makeDefault", this); + mMakeDefaultButton->setPosition(10, 155); + mMakeDefaultButton->addActionListener(this); + add(mMakeDefaultButton); +} + +Setup_Keyboard::~Setup_Keyboard() +{ + delete mKeyList; + delete mKeyListModel; + + delete mAssignKeyButton; + delete mMakeDefaultButton; +} + +void Setup_Keyboard::apply() +{ + keyUnresolved(); + + if (keyboard.hasConflicts()) + { + new OkDialog("Key Conflict(s) Detected.", + "Resolve them, or gameplay may result in strange behaviour."); + } + keyboard.setEnabled(true); + keyboard.store(); +} + +void Setup_Keyboard::cancel() +{ + keyUnresolved(); + + keyboard.retrieve(); + keyboard.setEnabled(true); + + refreshKeys(); +} + +void Setup_Keyboard::action(const gcn::ActionEvent &event) +{ + if (event.getSource() == mKeyList) + { + if (!mKeySetting) { + mAssignKeyButton->setEnabled(true); + } + } + else if (event.getId() == "assign") + { + mKeySetting = true; + mAssignKeyButton->setEnabled(false); + keyboard.setEnabled(false); + int i(mKeyList->getSelected()); + keyboard.setNewKeyIndex(i); + mKeyListModel->setElementAt(i, keyboard.getKeyCaption(i) + ": ?"); + } + else if (event.getId() == "makeDefault") + { + keyboard.makeDefault(); + refreshKeys(); + } +} + +void Setup_Keyboard::refreshAssignedKey(int index) +{ + std::string caption; + char *temp = SDL_GetKeyName( + (SDLKey) keyboard.getKeyValue(index)); + caption = keyboard.getKeyCaption(index) + ": " + toString(temp); + mKeyListModel->setElementAt(index, caption); +} + +void Setup_Keyboard::newKeyCallback(int index) +{ + mKeySetting = false; + refreshAssignedKey(index); + mAssignKeyButton->setEnabled(true); +} + +void Setup_Keyboard::refreshKeys() +{ + for(int i = 0; i < keyboard.KEY_TOTAL; i++) + { + refreshAssignedKey(i); + } +} + +void Setup_Keyboard::keyUnresolved() +{ + if (mKeySetting) { + newKeyCallback(keyboard.getNewKeyIndex()); + keyboard.setNewKeyIndex(keyboard.KEY_NO_VALUE); + } +} diff --git a/src/gui/setup_keyboard.h b/src/gui/setup_keyboard.h new file mode 100644 index 00000000..b72e8746 --- /dev/null +++ b/src/gui/setup_keyboard.h @@ -0,0 +1,84 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_GUI_SETUP_KEYBOARD_H +#define _TMW_GUI_SETUP_KEYBOARD_H + +#include "setuptab.h" +#include "button.h" +#include "../guichanfwd.h" + +#include + + +#include + +class Setup_Keyboard : public SetupTab, public gcn::ActionListener +{ + public: + /** + * Constructor + */ + Setup_Keyboard(); + + /** + * Destructor + */ + ~Setup_Keyboard(); + + void apply(); + void cancel(); + + void action(const gcn::ActionEvent &event); + + /** + * Get an update on the assigned key. + */ + void refreshAssignedKey(int index); + + /** + * The callback function when a new key has been pressed. + */ + void newKeyCallback(int index); + + /** + * Shorthand method to update all the keys. + */ + void refreshKeys(); + + /** + * If a key function is unresolved, then this reverts it. + */ + void keyUnresolved(); + + private: + class KeyListModel *mKeyListModel; + gcn::ListBox *mKeyList; + + gcn::Button *mAssignKeyButton; + gcn::Button *mMakeDefaultButton; + + bool mKeySetting; /**< flag to check if key being set. */ +}; + +#endif diff --git a/src/gui/shoplistbox.cpp b/src/gui/shoplistbox.cpp index 0e2ea6d3..ae787ab7 100644 --- a/src/gui/shoplistbox.cpp +++ b/src/gui/shoplistbox.cpp @@ -129,24 +129,8 @@ void ShopListBox::mousePressed(gcn::MouseEvent &event) { if (event.getButton() == gcn::MouseEvent::LEFT) { - bool enoughMoney = false; - int y = event.getY(); - - if (mShopItems && mPriceCheck) - { - if (mPlayerMoney >= mShopItems->at(y / mRowHeight).price) - enoughMoney = true; - } - else // Old Behaviour - { - enoughMoney = true; - } - - if (enoughMoney) - { - setSelected(y / mRowHeight); - generateAction(); - } + setSelected(event.getY() / mRowHeight); + generateAction(); } } diff --git a/src/gui/skill.cpp b/src/gui/skill.cpp index 884b3744..d5cfe76a 100644 --- a/src/gui/skill.cpp +++ b/src/gui/skill.cpp @@ -63,22 +63,18 @@ const char *skill_db[] = { SkillDialog::SkillDialog(): Window("Skills") { + setCloseButton(true); setDefaultSize(windowContainer->getWidth() - 255, 25, 240, 240); mSkillListBox = new ListBox(this); ScrollArea *skillScrollArea = new ScrollArea(mSkillListBox); - mCloseButton = new Button("Close", "close", this); mSkillListBox->setActionEventId("skill"); skillScrollArea->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER); skillScrollArea->setDimension(gcn::Rectangle(5, 5, 230, 180)); - mCloseButton->setPosition( - skillScrollArea->getX() + skillScrollArea->getWidth() - mCloseButton->getWidth(), - 210); add(skillScrollArea); - add(mCloseButton); mSkillListBox->addActionListener(this); diff --git a/src/gui/skill.h b/src/gui/skill.h index b8794e35..f1a14d50 100644 --- a/src/gui/skill.h +++ b/src/gui/skill.h @@ -71,7 +71,6 @@ class SkillDialog : public Window, public gcn::ActionListener, private: gcn::ListBox *mSkillListBox; - gcn::Button *mCloseButton; std::vector mSkillList; }; diff --git a/src/gui/status.cpp b/src/gui/status.cpp index 7da3b905..323a6b16 100644 --- a/src/gui/status.cpp +++ b/src/gui/status.cpp @@ -39,6 +39,7 @@ StatusWindow::StatusWindow(LocalPlayer *player): mPlayer(player) { setResizable(true); + setCloseButton(true); setDefaultSize((windowContainer->getWidth() - 365) / 2, (windowContainer->getHeight() - 255) / 2, 365, 280); loadWindowState("Status"); @@ -219,7 +220,7 @@ void StatusWindow::update() mHpBar->setColor(0, 171, 34); // Green } - mHpBar->setProgress((float)hp / maxHp); + mHpBar->setProgress((float) hp / maxHp); // Stats Part // ---------- @@ -235,7 +236,8 @@ void StatusWindow::update() int statusPoints = mPlayer->getAttributeIncreasePoints(); // Update labels - for (int i = 0; i < 7; i++) { + for (int i = 0; i < 7; i++) + { mStatsLabel[i]->setCaption(attrNames[i]); mStatsDisplayLabel[i]->setCaption( strprintf("%d / %d", diff --git a/src/gui/status.h b/src/gui/status.h index 40d25a2a..62cd8805 100644 --- a/src/gui/status.h +++ b/src/gui/status.h @@ -41,7 +41,8 @@ class ProgressBar; * * \ingroup Interface */ -class StatusWindow : public Window, public gcn::ActionListener { +class StatusWindow : public Window, public gcn::ActionListener +{ public: /** * Constructor. diff --git a/src/gui/updatewindow.cpp b/src/gui/updatewindow.cpp index ed75e5b3..5d81bb9c 100644 --- a/src/gui/updatewindow.cpp +++ b/src/gui/updatewindow.cpp @@ -46,6 +46,8 @@ #include "../resources/resourcemanager.h" +extern std::string homeDir; + /** * Calculates the Alder-32 checksum for the given file. */ @@ -119,7 +121,7 @@ UpdaterWindow::UpdaterWindow(): mUpdateHost = config.getValue("updatehost", "http://updates.themanaworld.org"); - mBasePath = config.getValue("homeDir", "."); + mBasePath = homeDir; // Try to download the updates list download(); diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index 2af1d960..4c6b04a2 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -55,8 +55,7 @@ Viewport::Viewport(): mCameraX(0), mCameraY(0), mShowDebugPath(false), - mPlayerFollowMouse(false), - mPopupActive(false) + mPlayerFollowMouse(false) { setOpaque(false); addMouseListener(this); @@ -372,21 +371,20 @@ Viewport::mousePressed(gcn::MouseEvent &event) if ((being = beingManager->findBeing(tilex, tiley)) && being->getType() != Being::LOCALPLAYER) { - showPopup(event.getX(), event.getY(), being); + mPopupMenu->showPopup(event.getX(), event.getY(), being); return; } else if((floorItem = floorItemManager->findByCoordinates(tilex, tiley))) { - showPopup(event.getX(), event.getY(), floorItem); + mPopupMenu->showPopup(event.getX(), event.getY(), floorItem); return; } } // If a popup is active, just remove it - if (mPopupActive) + if (mPopupMenu->isVisible()) { mPopupMenu->setVisible(false); - mPopupActive = false; return; } @@ -450,21 +448,6 @@ void Viewport::showPopup(int x, int y, Item *item) { mPopupMenu->showPopup(x, y, item); - mPopupActive = true; -} - -void -Viewport::showPopup(int x, int y, FloorItem *floorItem) -{ - mPopupMenu->showPopup(x, y, floorItem); - mPopupActive = true; -} - -void -Viewport::showPopup(int x, int y, Being *being) -{ - mPopupMenu->showPopup(x, y, being); - mPopupActive = true; } void diff --git a/src/gui/viewport.h b/src/gui/viewport.h index 22d0f249..eeb31bae 100644 --- a/src/gui/viewport.h +++ b/src/gui/viewport.h @@ -129,18 +129,6 @@ class Viewport : public WindowContainer, public gcn::MouseListener, getCameraY() { return mCameraY; } private: - /** - * Shows a popup for a floor item. - * TODO Find some way to get rid of FloorItem here - */ - void showPopup(int x, int y, FloorItem *floorItem); - - /** - * Shows a popup for a being. - * TODO Find some way to get rid of Being here - */ - void showPopup(int x, int y, Being *being); - /** * Helper function for loading target cursors */ @@ -187,7 +175,6 @@ class Viewport : public WindowContainer, public gcn::MouseListener, int mWalkTime; PopupMenu *mPopupMenu; /**< Popup menu. */ - bool mPopupActive; }; #endif diff --git a/src/gui/window.cpp b/src/gui/window.cpp index 84f4466c..17447009 100644 --- a/src/gui/window.cpp +++ b/src/gui/window.cpp @@ -26,6 +26,7 @@ #include #include +#include "gui.h" #include "gccontainer.h" #include "windowcontainer.h" @@ -42,7 +43,9 @@ ConfigListener *Window::windowConfigListener = 0; WindowContainer *Window::windowContainer = 0; int Window::instances = 0; +int Window::mouseResize = 0; ImageRect Window::border; +Image *Window::closeImage = NULL; class WindowConfigListener : public ConfigListener { @@ -60,7 +63,7 @@ Window::Window(const std::string& caption, bool modal, Window *parent): mParent(parent), mModal(modal), mResizable(false), - mMouseResize(0), + mCloseButton(false), mSticky(false), mMinWinWidth(100), mMinWinHeight(40), @@ -88,6 +91,8 @@ Window::Window(const std::string& caption, bool modal, Window *parent): border.grid[7] = dBorders->getSubImage(4, 15, 3, 4); border.grid[8] = dBorders->getSubImage(7, 15, 4, 4); dBorders->decRef(); + closeImage = resman->getImage("graphics/gui/close_button.png"); + windowConfigListener = new WindowConfigListener(); // Send GUI alpha changed for initialization windowConfigListener->optionChanged("guialpha"); @@ -110,6 +115,7 @@ Window::Window(const std::string& caption, bool modal, Window *parent): if (mModal) { + gui->setCursorType(Gui::CURSOR_POINTER); requestModalFocus(); } @@ -153,6 +159,7 @@ Window::~Window() delete border.grid[6]; delete border.grid[7]; delete border.grid[8]; + closeImage->decRef(); } delete mChrome; @@ -173,11 +180,19 @@ void Window::draw(gcn::Graphics *graphics) // Draw title if (getTitleBarHeight()) { - graphics->setColor(gcn::Color(0, 0, 0)); - graphics->setFont(getFont()); - graphics->drawText(getCaption(), 7, 5, gcn::Graphics::LEFT); + g->setColor(gcn::Color(0, 0, 0)); + g->setFont(getFont()); + g->drawText(getCaption(), 7, 5, gcn::Graphics::LEFT); } + // Draw Close Button + if (mCloseButton) + { + g->drawImage(closeImage, + getWidth() - closeImage->getWidth() - getPadding(), + getPadding() + ); + } drawChildren(graphics); } @@ -207,6 +222,8 @@ void Window::setWidth(int width) { mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x); } + + fireWindowEvent(WindowEvent(this, WindowEvent::WINDOW_RESIZED)); } void Window::setHeight(int height) @@ -217,6 +234,8 @@ void Window::setHeight(int height) { mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y); } + + fireWindowEvent(WindowEvent(this, WindowEvent::WINDOW_RESIZED)); } void Window::setDimension(const gcn::Rectangle &dimension) @@ -228,6 +247,27 @@ void Window::setDimension(const gcn::Rectangle &dimension) mGrip->setX(getWidth() - mGrip->getWidth() - getChildrenArea().x); mGrip->setY(getHeight() - mGrip->getHeight() - getChildrenArea().y); } + + fireWindowEvent(WindowEvent(this, WindowEvent::WINDOW_RESIZED)); + fireWindowEvent(WindowEvent(this, WindowEvent::WINDOW_MOVED)); +} + +void Window::setPosition(int x, int y) +{ + gcn::Window::setPosition(x, y); + fireWindowEvent(WindowEvent(this, WindowEvent::WINDOW_MOVED)); +} + +void Window::setX(int x) +{ + gcn::Window::setX(x); + fireWindowEvent(WindowEvent(this, WindowEvent::WINDOW_MOVED)); +} + +void Window::setY(int y) +{ + gcn::Window::setY(y); + fireWindowEvent(WindowEvent(this, WindowEvent::WINDOW_MOVED)); } void Window::setLocationRelativeTo(gcn::Widget *widget) @@ -280,6 +320,11 @@ void Window::setResizable(bool r) } } +void Window::setCloseButton(bool flag) +{ + mCloseButton = flag; +} + bool Window::isResizable() { return mResizable; @@ -327,27 +372,73 @@ void Window::mousePressed(gcn::MouseEvent &event) // Let Guichan move window to top and figure out title bar drag gcn::Window::mousePressed(event); - const int x = event.getX(); - const int y = event.getY(); - mMouseResize = 0; + if (event.getButton() == gcn::MouseEvent::LEFT) + { + const int x = event.getX(); + const int y = event.getY(); + + // Handle close button + if (mCloseButton) + { + gcn::Rectangle closeButtonRect( + getWidth() - closeImage->getWidth() - getPadding(), + getPadding(), + closeImage->getWidth(), + closeImage->getHeight()); + + if (closeButtonRect.isPointInRect(x, y)) + { + setVisible(false); + } + } + + // Handle window resizing + mouseResize = getResizeHandles(event); + } +} + +void Window::mouseReleased(gcn::MouseEvent &event) +{ + if (mResizable && mouseResize) + { + mouseResize = 0; + gui->setCursorType(Gui::CURSOR_POINTER); + } + + // This should be the responsibility of Guichan (and is from 0.8.0 on) + mIsMoving = false; +} - // Activate resizing handles as appropriate - if (event.getSource() == this && isResizable() && - event.getButton() == gcn::MouseEvent::LEFT && - !getChildrenArea().isPointInRect(x, y)) +void Window::mouseExited(gcn::MouseEvent &event) +{ + if (mResizable && !mouseResize) { - mMouseResize |= (x > getWidth() - resizeBorderWidth) ? RIGHT : - (x < resizeBorderWidth) ? LEFT : 0; - mMouseResize |= (y > getHeight() - resizeBorderWidth) ? BOTTOM : - (y < resizeBorderWidth) ? TOP : 0; + gui->setCursorType(Gui::CURSOR_POINTER); } - else if (event.getSource() == mGrip && - event.getButton() == gcn::MouseEvent::LEFT) +} + +void Window::mouseMoved(gcn::MouseEvent &event) +{ + int resizeHandles = getResizeHandles(event); + + // Changes the custom mouse cursor based on it's current position. + switch (resizeHandles) { - mDragOffsetX = x; - mDragOffsetY = y; - mMouseResize |= BOTTOM | RIGHT; - mIsMoving = false; + case BOTTOM | RIGHT: + gui->setCursorType(Gui::CURSOR_RESIZE_DOWN_RIGHT); + break; + case BOTTOM | LEFT: + gui->setCursorType(Gui::CURSOR_RESIZE_DOWN_LEFT); + break; + case BOTTOM: + gui->setCursorType(Gui::CURSOR_RESIZE_DOWN); + break; + case RIGHT: + case LEFT: + gui->setCursorType(Gui::CURSOR_RESIZE_ACROSS); + break; + default: + gui->setCursorType(Gui::CURSOR_POINTER); } } @@ -366,31 +457,31 @@ void Window::mouseDragged(gcn::MouseEvent &event) setPosition(newX, newY); } - if (mMouseResize && !mIsMoving) + if (mouseResize && !mIsMoving) { const int dx = event.getX() - mDragOffsetX; const int dy = event.getY() - mDragOffsetY; gcn::Rectangle newDim = getDimension(); - if (mMouseResize & (TOP | BOTTOM)) + if (mouseResize & (TOP | BOTTOM)) { - int newHeight = newDim.height + ((mMouseResize & TOP) ? -dy : dy); + int newHeight = newDim.height + ((mouseResize & TOP) ? -dy : dy); newDim.height = std::min(mMaxWinHeight, std::max(mMinWinHeight, newHeight)); - if (mMouseResize & TOP) + if (mouseResize & TOP) { newDim.y -= newDim.height - getHeight(); } } - if (mMouseResize & (LEFT | RIGHT)) + if (mouseResize & (LEFT | RIGHT)) { - int newWidth = newDim.width + ((mMouseResize & LEFT) ? -dx : dx); + int newWidth = newDim.width + ((mouseResize & LEFT) ? -dx : dx); newDim.width = std::min(mMaxWinWidth, std::max(mMinWinWidth, newWidth)); - if (mMouseResize & LEFT) + if (mouseResize & LEFT) { newDim.x -= newDim.width - getWidth(); } @@ -417,11 +508,11 @@ void Window::mouseDragged(gcn::MouseEvent &event) } // Update mouse offset when dragging bottom or right border - if (mMouseResize & BOTTOM) + if (mouseResize & BOTTOM) { mDragOffsetY += newDim.height - getHeight(); } - if (mMouseResize & RIGHT) + if (mouseResize & RIGHT) { mDragOffsetX += newDim.width - getWidth(); } @@ -469,3 +560,50 @@ void Window::resetToDefaultSize() setContentSize(mDefaultWidth, mDefaultHeight); updateContentSize(); } + +int Window::getResizeHandles(gcn::MouseEvent &event) +{ + int resizeHandles = 0; + const int y = event.getY(); + + if (mResizable && y > (int) mTitleBarHeight) + { + const int x = event.getX(); + + if (!getChildrenArea().isPointInRect(x, y) && + event.getSource() == this) + { + resizeHandles |= (x > getWidth() - resizeBorderWidth) ? RIGHT : + (x < resizeBorderWidth) ? LEFT : 0; + resizeHandles |= (y > getHeight() - resizeBorderWidth) ? BOTTOM : + (y < resizeBorderWidth) ? TOP : 0; + } + + if (event.getSource() == mGrip) + { + mDragOffsetX = x; + mDragOffsetY = y; + resizeHandles |= BOTTOM | RIGHT; + } + } + + return resizeHandles; +} + +void Window::fireWindowEvent(const WindowEvent &event) +{ + WindowListeners::iterator i_end = mListeners.end(); + WindowListeners::iterator i = mListeners.begin(); + + switch (event.getType()) + { + case WindowEvent::WINDOW_MOVED: + for (; i != i_end; ++i) + { (*i)->windowMoved(event); } + break; + case WindowEvent::WINDOW_RESIZED: + for (; i != i_end; ++i) + { (*i)->windowResized(event); } + break; + } +} diff --git a/src/gui/window.h b/src/gui/window.h index 1ba23fb2..ab266422 100644 --- a/src/gui/window.h +++ b/src/gui/window.h @@ -28,11 +28,14 @@ #include "../guichanfwd.h" +#include "windowlistener.h" + class ConfigListener; class GCContainer; class ImageRect; class ResizeGrip; class WindowContainer; +class Image; /** * A window. This window can be dragged around and has a title bar. Windows are @@ -119,16 +122,36 @@ class Window : public gcn::Window */ void setDimension(const gcn::Rectangle &dimension); + /** + * Sets the position of this window. + */ + void setPosition(int x, int y); + + /** + * Sets the window x coordinate. + */ + void setX(int x); + + /** + * Sets the window y coordinate. + */ + void setY(int y); + /** * Sets the location relative to the given widget. */ void setLocationRelativeTo(gcn::Widget *widget); /** - * Sets whether of not the window can be resized. + * Sets whether or not the window can be resized. */ void setResizable(bool resize); + /** + * Sets whether or not the window has a close button. + */ + void setCloseButton(bool flag); + /** * Returns whether the window can be resized. */ @@ -155,9 +178,14 @@ class Window : public gcn::Window void setMaxHeight(unsigned int height); /** - * Sets whether the window is sticky. - * A sticky window will not have its visibility set to false - * on a general setVisible(false) call. + * Sets flag to show a title or not. + */ + void setShowTitle(bool flag) + { mShowTitle = flag; } + + /** + * Sets whether the window is sticky. A sticky window will not have + * its visibility set to false on a general setVisible(false) call. */ void setSticky(bool sticky); @@ -167,10 +195,9 @@ class Window : public gcn::Window bool isSticky(); /** - * Overloads window setVisible by guichan to allow sticky window - * Handling + * Overloads window setVisible by Guichan to allow sticky window + * handling. */ - void setVisible(bool visible); /** @@ -198,6 +225,24 @@ class Window : public gcn::Window */ void mouseDragged(gcn::MouseEvent &event); + /** + * Implements custom cursor image changing context, based on mouse + * relative position. + */ + void mouseMoved(gcn::MouseEvent &event); + + /** + * When the mouse button has been let go, this ensures that the mouse + * custom cursor is restored back to it's standard image. + */ + void mouseReleased(gcn::MouseEvent &event); + + /** + * When the mouse leaves the window this ensures that the custom cursor + * is restored back to it's standard image. + */ + void mouseExited(gcn::MouseEvent &event); + /** * Read the x, y, and width and height for resizables in the config * based on the given string. @@ -216,11 +261,25 @@ class Window : public gcn::Window int defaultWidth, int defaultHeight); /** - * Reset the win pos and size to default. - * Don't forget to set defaults first. + * Reset the win pos and size to default. Don't forget to set defaults + * first. */ void resetToDefaultSize(); + /** + * Adds a listener to the list that's notified when the window is + * moved or resized. + */ + void addWindowListener(WindowListener *listener) + { mListeners.push_back(listener); } + + /** + * Removes a listener from the list that's notified when the window is + * moved or resized. + */ + void removeWindowListener(WindowListener *listener) + { mListeners.remove(listener); } + enum ResizeHandles { TOP = 0x01, @@ -233,13 +292,23 @@ class Window : public gcn::Window static WindowContainer *windowContainer; private: + /** + * Determines if the mouse is in a resize area and returns appropriate + * resize handles. Also initializes drag offset in case the resize + * grip is used. + * + * @see ResizeHandles + */ + int getResizeHandles(gcn::MouseEvent &event); + GCContainer *mChrome; /**< Contained container */ ResizeGrip *mGrip; /**< Resize grip */ Window *mParent; /**< The parent window */ std::string mConfigName; /**< Name used for saving window-related data */ + bool mShowTitle; /**< Window has a title bar */ bool mModal; /**< Window is modal */ bool mResizable; /**< Window can be resized */ - int mMouseResize; /**< Window is being resized */ + bool mCloseButton; /**< Window has a close button */ bool mSticky; /**< Window resists minimization */ int mMinWinWidth; /**< Minimum window width */ int mMinWinHeight; /**< Minimum window height */ @@ -255,8 +324,10 @@ class Window : public gcn::Window */ static ConfigListener *windowConfigListener; + static int mouseResize; /**< Active resize handles */ static int instances; /**< Number of Window instances */ static ImageRect border; /**< The window border and background */ + static Image *closeImage; /**< Close Button Image */ /** * The width of the resize border. Is independent of the actual window @@ -264,6 +335,14 @@ class Window : public gcn::Window * where two borders are moved at the same time. */ static const int resizeBorderWidth = 10; + + private: + /** + * Sends out a window event to the list of selection listeners. + */ + void fireWindowEvent(const WindowEvent &event); + + WindowListeners mListeners; }; #endif diff --git a/src/gui/windowlistener.h b/src/gui/windowlistener.h new file mode 100644 index 00000000..08aab71d --- /dev/null +++ b/src/gui/windowlistener.h @@ -0,0 +1,86 @@ +/* + * The Mana World + * Copyright 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_WINDOW_LISTENER_H_ +#define _TMW_WINDOW_LISTENER_H_ + +#include +#include + +/** + * An event that characterizes a window move or resize. + * + * \ingroup GUI + */ +class WindowEvent : public gcn::Event +{ + public: + /** + * Constructor. + */ + WindowEvent(gcn::Window *source, int type): + gcn::Event(source) + { + mType = type; + } + + /** + * Returns the event type. + */ + int getType() const + { return mType; } + + enum WindowEventType + { + WINDOW_MOVED, + WINDOW_RESIZED + }; +}; + +/** + * The listener that's notified when a window is moved or resized. + * + * \ingroup GUI + */ +class WindowListener +{ + public: + /** + * Virtual destructor. + */ + virtual ~WindowListener() {} + + /** + * Called whenever the window is moved. + */ + virtual void windowMoved(const WindowEvent &event) {} + + /** + * Called whenever the window is resized. + */ + virtual void windowResized(const WindowEvent &event) {} +}; + +typedef std::list WindowListeners; + +#endif diff --git a/src/imageparticle.cpp b/src/imageparticle.cpp index 35cc21ad..17581a2a 100644 --- a/src/imageparticle.cpp +++ b/src/imageparticle.cpp @@ -31,12 +31,12 @@ ImageParticle::ImageParticle(Map *map, Image *image): Particle(map), mImage(image) { - mImage->incRef(); + if (mImage) mImage->incRef(); } ImageParticle::~ImageParticle() { - mImage->decRef(); + if (mImage) mImage->decRef(); } void ImageParticle::draw(Graphics *graphics, int offsetX, int offsetY) const @@ -44,8 +44,8 @@ void ImageParticle::draw(Graphics *graphics, int offsetX, int offsetY) const if (!mAlive) return; - int screenX = (int) mPosX + offsetX - mImage->getWidth() / 2; - int screenY = (int) mPosY - (int) mPosZ + offsetY - mImage->getHeight()/2; + int screenX = (int) mPos.x + offsetX - mImage->getWidth() / 2; + int screenY = (int) mPos.y - (int)mPos.z + offsetY - mImage->getHeight()/2; // Check if on screen if (screenX + mImage->getWidth() < 0 || diff --git a/src/itemshortcut.cpp b/src/itemshortcut.cpp new file mode 100644 index 00000000..8a514c7e --- /dev/null +++ b/src/itemshortcut.cpp @@ -0,0 +1,87 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "itemshortcut.h" + +#include "localplayer.h" +#include "configuration.h" + +#include "utils/tostring.h" + +ItemShortcut::ItemShortcut *itemShortcut; + +ItemShortcut::ItemShortcut(): + mItemSelected(NULL) +{ + for (int i = 0; i < SHORTCUT_ITEMS; i++) + { + mItems[i] = NULL; + } +} + +ItemShortcut::~ItemShortcut() +{ + save(); +} + +void ItemShortcut::load() +{ + for (int i = 0; i < SHORTCUT_ITEMS; i++) + { + int itemId = (int) config.getValue("itemShortcut" + toString(i), -1); + + if (itemId != -1) + { + ItemPtr item = player_node->searchForItem(itemId); + if (item) + { + mItems[i] = item; + } + } + } +} + +void ItemShortcut::save() +{ + for (int i = 0; i < SHORTCUT_ITEMS; i++) + { + if (mItems[i]) + { + config.setValue("shortcut" + toString(i), mItems[i]->getId()); + } + else + { + config.setValue("shortcut" + toString(i), -1); + } + } +} + +void ItemShortcut::useItem(int index) +{ + if (mItems[index]) + { + if (mItems[index]->getQuantity()) { + // TODO: Fix this (index vs. pointer mismatch) + //player_node->useItem(mItems[index]); + } + } +} diff --git a/src/itemshortcut.h b/src/itemshortcut.h new file mode 100644 index 00000000..d211c7f3 --- /dev/null +++ b/src/itemshortcut.h @@ -0,0 +1,130 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef _TMW_ITEMSHORTCUT_H__ +#define _TMW_ITEMSHORTCUT_H__ + +#include "item.h" + +#define SHORTCUT_ITEMS 10 + +/** + * The item pointer + */ +typedef Item* ItemPtr; + +class ItemShortcut +{ + public: + /** + * Constructor. + */ + ItemShortcut(); + + /** + * Destructor. + */ + ~ItemShortcut(); + + /** + * Load the configuration information. + */ + void load(); + + /** + * Returns the shortcut item specified by the index. + * + * @param index Index of the shortcut item. + */ + ItemPtr getItem(int index) const + { return mItems[index]; } + + /** + * Returns the amount of shortcut items. + */ + int getItemCount() const + { return SHORTCUT_ITEMS; } + + /** + * Returns the item that is currently selected. + */ + ItemPtr getItemSelected() const + { return mItemSelected; } + + /** + * Adds the selected item to the items specified by the index. + * + * @param index Index of the items. + */ + void setItem(int index) + { mItems[index] = mItemSelected; } + + /** + * Adds an item to the items store specified by the index. + * + * @param index Index of the items. + * @param item Item to store. + */ + void setItems(int index, Item *item) + { mItems[index] = item; } + + /** + * Set the item that is selected. + * + * @param item The item that is to be assigned. + */ + void setItemSelected(ItemPtr item) + { mItemSelected = item; } + + /** + * A flag to check if the item is selected. + */ + bool isItemSelected() + { return (mItemSelected) ? true : false; } + + /** + * Remove a item from the shortcut. + */ + void removeItem(int index) + { mItems[index] = NULL; } + + /** + * Try to use the item specified by the index. + * + * @param index Index of the item shortcut. + */ + void useItem(int index); + + private: + /** + * Save the configuration information. + */ + void save(); + + ItemPtr mItems[SHORTCUT_ITEMS]; /**< the items stored */ + ItemPtr mItemSelected; /**< the item held by cursor */ + +}; + +extern ItemShortcut *itemShortcut; + +#endif diff --git a/src/keyboardconfig.cpp b/src/keyboardconfig.cpp new file mode 100644 index 00000000..271961c8 --- /dev/null +++ b/src/keyboardconfig.cpp @@ -0,0 +1,144 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#include "keyboardconfig.h" +#include "configuration.h" +#include "log.h" + +#include + +#include "gui/setup_keyboard.h" + +struct KeyData +{ + const char *configField; + int defaultValue; + const char *caption; +}; + +// keyData must be in same order as enum keyAction. +static KeyData const keyData[KeyboardConfig::KEY_TOTAL] = { + {"keyMoveUp", SDLK_UP, "Move Up"}, + {"keyMoveDown", SDLK_DOWN, "Move Down"}, + {"keyMoveLeft", SDLK_LEFT, "Move Left"}, + {"keyMoveRight", SDLK_RIGHT, "Move Right"}, + {"keyAttack", SDLK_LCTRL, "Attack"}, + {"keyTarget", SDLK_LSHIFT, "Target"}, + {"keyTargetClosest", SDLK_a, "Target Closest"}, + {"keyPickup", SDLK_z, "Pickup"}, + {"keyHideWindows", SDLK_h, "Hide Windows"}, + {"keyBeingSit", SDLK_s, "Sit"}, + {"keyShortcut0", SDLK_0, "Item Shortcut 0"}, + {"keyShortcut1", SDLK_1, "Item Shortcut 1"}, + {"keyShortcut2", SDLK_2, "Item Shortcut 2"}, + {"keyShortcut3", SDLK_3, "Item Shortcut 3"}, + {"keyShortcut4", SDLK_4, "Item Shortcut 4"}, + {"keyShortcut5", SDLK_5, "Item Shortcut 5"}, + {"keyShortcut6", SDLK_6, "Item Shortcut 6"}, + {"keyShortcut7", SDLK_7, "Item Shortcut 7"}, + {"keyShortcut8", SDLK_8, "Item Shortcut 8"}, + {"keyShortcut9", SDLK_9, "Item Shortcut 9"} +}; + +void KeyboardConfig::init() +{ + for (int i = 0; i < KEY_TOTAL; i++) + { + mKey[i].configField = keyData[i].configField; + mKey[i].defaultValue = keyData[i].defaultValue; + mKey[i].caption = keyData[i].caption; + mKey[i].value = KEY_NO_VALUE; + } + mNewKeyIndex = KEY_NO_VALUE; + mEnabled = true; + + retrieve(); +} + +void KeyboardConfig::retrieve() +{ + for (int i = 0; i < KEY_TOTAL; i++) + { + mKey[i].value = (int) config.getValue( + mKey[i].configField, mKey[i].defaultValue); + } +} + +void KeyboardConfig::store() +{ + for (int i = 0; i < KEY_TOTAL; i++) + { + config.setValue(mKey[i].configField, mKey[i].value); + } +} + +void KeyboardConfig::makeDefault() +{ + for (int i = 0; i < KEY_TOTAL; i++) + { + mKey[i].value = mKey[i].defaultValue; + } +} + +bool KeyboardConfig::hasConflicts() +{ + int i, j; + for (i = 0; i < KEY_TOTAL; i++) + { + for (j = 0; j < KEY_TOTAL; j++) + { + if (i != j && mKey[i].value == mKey[j].value) + { + return true; + } + } + } + return false; +} + +void KeyboardConfig::callbackNewKey() +{ + mSetupKey->newKeyCallback(mNewKeyIndex); +} + +int KeyboardConfig::getKeyIndex(int keyValue) const +{ + for (int i = 0; i < KEY_TOTAL; i++) + { + if(keyValue == mKey[i].value) + { + return i; + } + } + return KEY_NO_VALUE; +} + +bool KeyboardConfig::isKeyActive(int index) +{ + return mActiveKeys[ mKey[index].value]; +} + +void KeyboardConfig::refreshActiveKeys() +{ + mActiveKeys = SDL_GetKeyState(NULL); +} diff --git a/src/keyboardconfig.h b/src/keyboardconfig.h new file mode 100644 index 00000000..46394fa5 --- /dev/null +++ b/src/keyboardconfig.h @@ -0,0 +1,185 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_KEYBOARDCONFIG_H +#define _TMW_KEYBOARDCONFIG_H + +#include + +#include "gui/setup_keyboard.h" + +#include + +/** + * Each key represents a key function. Such as 'Move up', 'Attack' etc. + */ +struct KeyFunction +{ + const char* configField; /** Field index that is in the config file. */ + int defaultValue; /** The default key value used. */ + std::string caption; /** The caption value for the key function. */ + int value; /** The actual value that is used. */ +}; + +class KeyboardConfig +{ + public: + /** + * Initializes the keyboard config explicitly. + */ + void init(); + + /** + * Retrieve the key values from config file. + */ + void retrieve(); + + /** + * Store the key values to config file. + */ + void store(); + + /** + * Make the keys their default values. + */ + void makeDefault(); + + /** + * Determines if any key assignments are the same as each other. + */ + bool hasConflicts(); + + /** + * Calls a function back so the key re-assignment(s) can be seen. + */ + void callbackNewKey(); + + /** + * Obtain the value stored in memory. + */ + int getKeyValue(int index) const + { return mKey[index].value; } + + /** + * Get the index of the new key to be assigned. + */ + int getNewKeyIndex() const + { return mNewKeyIndex; } + + /** + * Get the enable flag, which will stop the user from doing actions. + */ + bool isEnabled() const + { return mEnabled; } + + /** + * Get the key caption, providing more meaning to the user. + */ + const std::string &getKeyCaption(int index) const + { return mKey[index].caption; } + + /** + * Get the key function index by providing the keys value. + */ + int getKeyIndex(int keyValue) const; + + /** + * Set the enable flag, which will stop the user from doing actions. + */ + void setEnabled(bool flag) + { mEnabled = flag; } + + /** + * Set the index of the new key to be assigned. + */ + void setNewKeyIndex(int value) + { mNewKeyIndex = value; } + + /** + * Set the value of the new key. + */ + void setNewKey(int value) + { mKey[mNewKeyIndex].value = value; } + + /** + * Set a reference to the key setup window. + */ + void setSetupKeyboard(Setup_Keyboard *setupKey) + { mSetupKey = setupKey; } + + /** + * Checks if the key is active, by providing the key function index. + */ + bool isKeyActive(int index); + + /** + * Takes a snapshot of all the active keys. + */ + void refreshActiveKeys(); + + /** + * All the key functions. + * KEY_NO_VALUE is used in initialization, and should be unchanged. + * KEY_TOTAL should always be last (used as a conditional in loops). + * The key assignment view gets arranged according to the order of + * these values. + */ + enum KeyAction { + KEY_NO_VALUE = -1, + KEY_MOVE_UP, + KEY_MOVE_DOWN, + KEY_MOVE_LEFT, + KEY_MOVE_RIGHT, + KEY_ATTACK, + KEY_TARGET, + KEY_TARGET_CLOSEST, + KEY_PICKUP, + KEY_HIDE_WINDOWS, + KEY_SIT, + KEY_SHORTCUT_0, + KEY_SHORTCUT_1, + KEY_SHORTCUT_2, + KEY_SHORTCUT_3, + KEY_SHORTCUT_4, + KEY_SHORTCUT_5, + KEY_SHORTCUT_6, + KEY_SHORTCUT_7, + KEY_SHORTCUT_8, + KEY_SHORTCUT_9, + KEY_TOTAL + }; + + private: + int mNewKeyIndex; /**< Index of new key to be assigned */ + bool mEnabled; /**< Flag to respond to key input */ + + Setup_Keyboard *mSetupKey; /**< Reference to setup window */ + + KeyFunction mKey[KEY_TOTAL]; /**< Pointer to all the key data */ + + Uint8 *mActiveKeys; /**< Stores a list of all the keys */ +}; + +extern KeyboardConfig keyboard; + +#endif diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 95e7a478..f4ad7587 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -29,11 +29,19 @@ #include "inventory.h" #include "item.h" #include "main.h" +#include "particle.h" #include "sound.h" #include "log.h" #include "net/gameserver/player.h" +#include "gui/gui.h" + +#include "net/messageout.h" +#include "net/protocol.h" + +#include "utils/tostring.h" + LocalPlayer *player_node = NULL; LocalPlayer::LocalPlayer(): @@ -46,6 +54,7 @@ LocalPlayer::LocalPlayer(): mLevel(1), mMoney(0), mTotalWeight(1), mMaxWeight(1), mHP(1), mMaxHP(1), + mXp(0), mTarget(NULL), mPickUpTarget(NULL), mTrading(false), mLastAction(-1), mWalkingDir(0), @@ -112,6 +121,17 @@ LocalPlayer::moveInvItem(Item *item, int newIndex) item->getInvIndex(), newIndex, item->getQuantity()); } +Item* LocalPlayer::searchForItem(int itemId) +{ + for (int i = 0; i < INVENTORY_SIZE; i++) + { + if (itemId == mInventory->getItem(i)->getId()) { + return mInventory->getItem(i); + } + } + return NULL; +} + void LocalPlayer::equipItem(Item *item) { Net::GameServer::Player::equip(item->getInvIndex()); @@ -302,10 +322,14 @@ void LocalPlayer::attack() setAction(ATTACK); - if (getWeapon() == 2) - sound.playSfx("sfx/bow_shoot_1.ogg"); - else + if (mEquippedWeapon) + { + std::string soundFile = mEquippedWeapon->getSound(EQUIP_EVENT_STRIKE); + if (soundFile != "") sound.playSfx(soundFile); + } + else { sound.playSfx("sfx/fist-swish.ogg"); + } Net::GameServer::Player::attack(getSpriteDirection()); } @@ -329,3 +353,16 @@ void LocalPlayer::raiseAttribute(size_t attr) mAttributeBase.at(attr)++; // TODO: Inform the server about our desire to raise the attribute } + +void LocalPlayer::setXp(int xp) +{ + if (mMap && xp > mXp) + { + const std::string text = toString(xp - mXp) + " xp"; + + // Show XP number + particleEngine->addTextRiseFadeOutEffect(text, hitYellowFont, + mPx + 16, mPy - 16); + } + mXp = xp; +} diff --git a/src/localplayer.h b/src/localplayer.h index 4f38fdad..ff7bf0b7 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -151,6 +151,14 @@ class LocalPlayer : public Player */ void moveInvItem(Item *item, int newIndex); + /** + * Searches for the specified item by it's identification. + * + * @param itemId The id of the item to be searched. + * @return Item found on success, NULL on failure. + */ + Item* searchForItem(int itemId); + /** * Equips an item. */ @@ -237,6 +245,19 @@ class LocalPlayer : public Player int getHP() const { return mHP; } + /** + * Sets the amount of XP. Shows XP gaining effect if the player is on + * a map. + */ + void setXp(int xp); + + /** + * Returns the amount of experience points. + */ + int getXp() const { return mXp; } + + Uint32 mCharId; + int getMaxHP() const { return mMaxHP; } @@ -298,6 +319,7 @@ class LocalPlayer : public Player int mMaxWeight; int mHP; int mMaxHP; + int mXp; /**< Experience points. */ Being *mTarget; FloorItem *mPickUpTarget; diff --git a/src/main.cpp b/src/main.cpp index 1f4eafde..30fb7c1c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,8 +48,10 @@ #endif #include "configuration.h" +#include "keyboardconfig.h" #include "game.h" #include "graphics.h" +#include "itemshortcut.h" #include "lockedarray.h" #include "localplayer.h" #include "log.h" @@ -84,7 +86,6 @@ #include "net/gameserver/gameserver.h" -#include "resources/equipmentdb.h" #include "resources/image.h" #include "resources/itemdb.h" #include "resources/monsterdb.h" @@ -108,6 +109,7 @@ Music *bgm; Configuration config; /**< XML file configuration reader */ Logger *logger; /**< Log object */ +KeyboardConfig keyboard; Net::Connection *accountServerConnection = 0; Net::Connection *gameServerConnection = 0; @@ -189,7 +191,6 @@ void initConfiguration(const Options &options) config.setValue("fpslimit", 0); config.setValue("updatehost", "http://updates.themanaworld.org"); config.setValue("customcursor", 1); - config.setValue("homeDir", homeDir); // Checking if the configuration file exists... otherwise create it with // default options. @@ -319,6 +320,9 @@ void initEngine() // Initialize for drawing graphics->_beginDraw(); + // Initialize the item shortcuts. + itemShortcut = new ItemShortcut(); + gui = new Gui(graphics); state = STATE_CHOOSE_SERVER; /**< Initial game state */ @@ -337,12 +341,19 @@ void initEngine() errorMessage = err; logger->log("Warning: %s", err); } + + // Initialize keyboard + keyboard.init(); } /** Clear the engine */ void exit_engine() { + // Before config.write() since it writes the shortcuts to the config + delete itemShortcut; + config.write(); + delete gui; delete graphics; @@ -353,7 +364,6 @@ void exit_engine() sound.close(); // Unload XML databases - EquipmentDB::unload(); ItemDB::unload(); MonsterDB::unload(); @@ -457,7 +467,6 @@ void loadUpdates() const std::string updatesFile = "updates/resources2.txt"; ResourceManager *resman = ResourceManager::getInstance(); std::vector lines = resman->loadTextFile(updatesFile); - std::string homeDir = config.getValue("homeDir", ""); for (unsigned int i = 0; i < lines.size(); ++i) { @@ -895,7 +904,6 @@ int main(int argc, char *argv[]) false); // Load XML databases - EquipmentDB::load(); ItemDB::load(); MonsterDB::load(); state = STATE_LOGIN; @@ -1039,7 +1047,6 @@ int main(int argc, char *argv[]) } } } - } catch (...) { diff --git a/src/monster.cpp b/src/monster.cpp index 768bf16a..2522a3e1 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -57,7 +57,7 @@ Monster::setAction(Action action) break; case DEAD: currentAction = ACTION_DEAD; - sound.playSfx(getInfo().getSound(EVENT_DIE)); + sound.playSfx(getInfo().getSound(MONSTER_EVENT_DIE)); break; case ATTACK: currentAction = ACTION_ATTACK; @@ -87,10 +87,10 @@ Monster::handleAttack() const MonsterInfo &mi = getInfo(); - // TODO: It's not possible to determine hit or miss here, so this stuff probably needs - // to be moved somewhere else. We may lose synchronization between attack animation and - // the sound, unless we adapt the protocol... - sound.playSfx(mi.getSound(EVENT_HIT)); + // TODO: It's not possible to determine hit or miss here, so this stuff + // probably needs to be moved somewhere else. We may lose synchronization + // between attack animation and the sound, unless we adapt the protocol... + sound.playSfx(mi.getSound(MONSTER_EVENT_HIT)); } Being::TargetCursorSize diff --git a/src/net/beinghandler.cpp b/src/net/beinghandler.cpp index 87972212..b88d443e 100644 --- a/src/net/beinghandler.cpp +++ b/src/net/beinghandler.cpp @@ -114,7 +114,7 @@ void BeingHandler::handleMessage(MessageIn &msg) dstBeing = beingManager->findBeing(id); - if (dstBeing == NULL) + if (!dstBeing) { // Being with id >= 110000000 and job 0 are better // known as ghosts, so don't create those. @@ -138,30 +138,32 @@ void BeingHandler::handleMessage(MessageIn &msg) dstBeing->setWalkSpeed(speed); dstBeing->mJob = job; - dstBeing->setHairStyle(msg.readShort()); - dstBeing->setWeapon(msg.readShort()); + dstBeing->setHairStyle(msg->readShort()); + dstBeing->setVisibleEquipment( + Being::WEAPON_SPRITE, msg->readShort()); dstBeing->setVisibleEquipment( - Being::BOTTOMCLOTHES_SPRITE, msg.readShort()); + Being::BOTTOMCLOTHES_SPRITE, msg->readShort()); if (msg.getId() == SMSG_BEING_MOVE) { msg.readLong(); // server tick } - msg.readShort(); // shield - dstBeing->setVisibleEquipment(Being::HAIT_SPRITE, msg.readShort()); - dstBeing->setVisibleEquipment( - Being::TOPCLOTHES_SPRITE, msg.readShort()); - dstBeing->setHairColor(msg.readShort()); - msg.readShort(); // unknown - msg.readShort(); // head dir - msg.readShort(); // guild - msg.readShort(); // unknown - msg.readShort(); // unknown - msg.readShort(); // manner - msg.readShort(); // karma - msg.readByte(); // unknown - dstBeing->setSex(1 - msg.readByte()); // sex + msg->readShort(); // shield + headTop = msg->readShort(); + headMid = msg->readShort(); + dstBeing->setVisibleEquipment(Being::HAT_SPRITE, headTop); + dstBeing->setVisibleEquipment(Being::TOPCLOTHES_SPRITE, headMid); + dstBeing->setHairColor(msg->readShort()); + msg->readShort(); // unknown + msg->readShort(); // head dir + msg->readShort(); // guild + msg->readShort(); // unknown + msg->readShort(); // unknown + msg->readShort(); // manner + msg->readShort(); // karma + msg->readByte(); // unknown + dstBeing->setSex(1 - msg->readByte()); // sex if (msg.getId() == SMSG_BEING_MOVE) { @@ -256,10 +258,12 @@ void BeingHandler::handleMessage(MessageIn &msg) } Particle *levelupFX; if (msg->readLong() == 0) { // type - levelupFX = particleEngine->addEffect("graphics/particles/levelup.particle.xml", 0, 0); + levelupFX = particleEngine->addEffect( + "graphics/particles/levelup.particle.xml", 0, 0); } else { - levelupFX = particleEngine->addEffect("graphics/particles/skillup.particle.xml", 0, 0); + levelupFX = particleEngine->addEffect( + "graphics/particles/skillup.particle.xml", 0, 0); } beingManager->findBeing(id)->controlParticle(levelupFX); break; @@ -289,28 +293,26 @@ void BeingHandler::handleMessage(MessageIn &msg) dstBeing->setHairStyle(id); break; case 2: - dstBeing->setWeapon(id); + dstBeing->setVisibleEquipment(Being::WEAPON_SPRITE, id); break; case 3: // Change lower headgear for eAthena, pants for us dstBeing->setVisibleEquipment( - Being::BOTTOMCLOTHES_SPRITE, - id); + Being::BOTTOMCLOTHES_SPRITE, id); break; case 4: // Change upper headgear for eAthena, hat for us dstBeing->setVisibleEquipment( - Being::HAT_SPRITE, - id); + Being::HAT_SPRITE, id); break; case 5: // Change middle headgear for eathena, armor for us dstBeing->setVisibleEquipment( - Being::TOPCLOTHES_SPRITE, - id); + Being::TOPCLOTHES_SPRITE, id); break; case 6: dstBeing->setHairColor(id); break; default: - logger->log("c3: %i\n", id); // unsupported + logger->log("SMSG_BEING_CHANGE_LOOKS: unsupported type: " + "%d, id: %d", type, id); break; } } @@ -336,17 +338,18 @@ void BeingHandler::handleMessage(MessageIn &msg) dstBeing = beingManager->findBeing(id); - if (dstBeing == NULL) + if (!dstBeing) { dstBeing = beingManager->createBeing(id, job); } dstBeing->setWalkSpeed(speed); dstBeing->mJob = job; - dstBeing->setHairStyle(msg.readShort()); - dstBeing->setWeaponById(msg.readShort()); // item id 1 - msg.readShort(); // item id 2 - headBottom = msg.readShort(); + dstBeing->setHairStyle(msg->readShort()); + dstBeing->setVisibleEquipment( + Being::WEAPON_SPRITE, msg->readShort()); + msg->readShort(); // item id 2 + headBottom = msg->readShort(); if (msg.getId() == SMSG_PLAYER_MOVE) { @@ -407,9 +410,9 @@ void BeingHandler::handleMessage(MessageIn &msg) case 0x0119: // Change in players look - logger->log("0x0119 %li %i %i %x %i\n", msg.readLong(), - msg.readShort(), msg.readShort(), msg.readShort(), - msg.readByte()); + logger->log("0x0119 %i %i %i %x %i", msg->readLong(), + msg->readShort(), msg->readShort(), msg->readShort(), + msg->readByte()); break; */ } @@ -428,11 +431,9 @@ static void handleLooks(Being *being, MessageIn &msg) if (mask & (1 << 7)) { // The equipment has to be cleared first. - being->setWeaponById(0); for (int i = 0; i < nb_slots; ++i) { - if (slots[i] != Being::WEAPON_SPRITE) - being->setVisibleEquipment(slots[i], 0); + being->setVisibleEquipment(slots[i], 0); } } @@ -441,10 +442,7 @@ static void handleLooks(Being *being, MessageIn &msg) { if (!(mask & (1 << i))) continue; int id = msg.readShort(); - if (slots[i] != Being::WEAPON_SPRITE) - being->setVisibleEquipment(slots[i], id); - else - being->setWeaponById(id); + being->setVisibleEquipment(slots[i], id); } } diff --git a/src/net/chathandler.cpp b/src/net/chathandler.cpp index 3efe3174..afdc2ab5 100644 --- a/src/net/chathandler.cpp +++ b/src/net/chathandler.cpp @@ -37,6 +37,7 @@ #include "../gui/chat.h" #include "../utils/tostring.h" +#include "../utils/trim.h" extern Being *player_node; @@ -167,6 +168,7 @@ void ChatHandler::handleMessage(MessageIn &msg) chatMsg = msg.readString(chatMsgLength); chatWindow->chatLog(chatMsg, BY_OTHER); chatMsg.erase(0, chatMsg.find(" : ", 0) + 3); + trim(chatMsg); being->setSpeech(chatMsg, SPEECH_TIME); break; diff --git a/src/net/inventoryhandler.cpp b/src/net/inventoryhandler.cpp index 354dd685..de74e8f5 100644 --- a/src/net/inventoryhandler.cpp +++ b/src/net/inventoryhandler.cpp @@ -31,6 +31,7 @@ #include "../equipment.h" #include "../inventory.h" #include "../item.h" +#include "../itemshortcut.h" #include "../localplayer.h" #include "../gui/chat.h" @@ -77,6 +78,7 @@ void InventoryHandler::handleMessage(MessageIn &msg) it->setQuantity(amount); } }; + itemShortcut->load(); break; } } diff --git a/src/net/playerhandler.cpp b/src/net/playerhandler.cpp index b94b5128..afaeca69 100644 --- a/src/net/playerhandler.cpp +++ b/src/net/playerhandler.cpp @@ -133,7 +133,8 @@ void PlayerHandler::handleMessage(MessageIn &msg) } else { - logger->log("Warning: server wants to update unknown attribute %d to %d", stat, value); + logger->log("Warning: server wants to update unknown " + "attribute %d to %d", stat, value); } } } break; diff --git a/src/particle.cpp b/src/particle.cpp index 805da102..148bbf6f 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -52,14 +52,12 @@ const float Particle::PARTICLE_SKY = 800.0f; Particle::Particle(Map *map): mAlive(true), - mPosX(0.0f), mPosY(0.0f), mPosZ(0.0f), mLifetimeLeft(-1), mLifetimePast(0), mFadeOut(0), mFadeIn(0), mAutoDelete(true), mMap(map), - mVectorX(0.0f), mVectorY(0.0f), mVectorZ(0.0f), mGravity(0.0f), mRandomnes(0), mBounce(0.0f), @@ -109,7 +107,7 @@ Particle::update() p++ ) { - (*p)->moveBy(mPosX, mPosY, mPosZ); + (*p)->moveBy(mPos.x, mPos.y, mPos.z); mChildParticles.push_back (*p); } } @@ -117,31 +115,28 @@ Particle::update() if (mMomentum != 1.0f) { - mVectorX *= mMomentum; - mVectorY *= mMomentum; - mVectorZ *= mMomentum; + mVelocity *= mMomentum; } if (mTarget && mAcceleration != 0.0f) { - float distX = (mPosX - mTarget->getPosX()) * SIN45; - float distY = mPosY - mTarget->getPosY(); - float distZ = mPosZ - mTarget->getPosZ(); + Vector dist = mPos - mTarget->getPosition(); + dist.x *= SIN45; float invHypotenuse; - switch(Particle::fastPhysics) + switch (Particle::fastPhysics) { case 1: invHypotenuse = fastInvSqrt( - distX * distX + distY * distY + distZ * distZ); + dist.x * dist.x + dist.y * dist.y + dist.z * dist.z); break; case 2: invHypotenuse = 2.0f / - fabs(distX) + fabs(distY) + fabs(distZ); + fabs(dist.x) + fabs(dist.y) + fabs(dist.z); break; default: invHypotenuse = 1.0f / sqrt( - distX * distX + distY * distY + distZ * distZ); + dist.x * dist.x + dist.y * dist.y + dist.z * dist.z); break; } @@ -152,25 +147,23 @@ Particle::update() mAlive = false; } float accFactor = invHypotenuse * mAcceleration; - mVectorX -= distX * accFactor; - mVectorY -= distY * accFactor; - mVectorZ -= distZ * accFactor; + mVelocity -= dist * accFactor; } } if (mRandomnes > 0) { - mVectorX += (rand()%mRandomnes - rand()%mRandomnes) / 1000.0f; - mVectorY += (rand()%mRandomnes - rand()%mRandomnes) / 1000.0f; - mVectorZ += (rand()%mRandomnes - rand()%mRandomnes) / 1000.0f; + mVelocity.x += (rand()%mRandomnes - rand()%mRandomnes) / 1000.0f; + mVelocity.y += (rand()%mRandomnes - rand()%mRandomnes) / 1000.0f; + mVelocity.z += (rand()%mRandomnes - rand()%mRandomnes) / 1000.0f; } - mVectorZ -= mGravity; + mVelocity.z -= mGravity; // Update position - mPosX += mVectorX; - mPosY += mVectorY * SIN45; - mPosZ += mVectorZ * SIN45; + mPos.x += mVelocity.x; + mPos.y += mVelocity.y * SIN45; + mPos.z += mVelocity.z * SIN45; // Update other stuff if (mLifetimeLeft > 0) @@ -179,14 +172,13 @@ Particle::update() } mLifetimePast++; - if (mPosZ > PARTICLE_SKY || mPosZ < 0.0f) + if (mPos.z > PARTICLE_SKY || mPos.z < 0.0f) { if (mBounce > 0.0f) { - mPosZ *= -mBounce; - mVectorX *= mBounce; - mVectorY *= mBounce; - mVectorZ *= -mBounce; + mPos.z *= -mBounce; + mVelocity *= mBounce; + mVelocity.z = -mVelocity.z; } else { mAlive = false; @@ -195,10 +187,8 @@ Particle::update() } // Update child particles - for ( ParticleIterator p = mChildParticles.begin(); - p != mChildParticles.end(); - - ) + for (ParticleIterator p = mChildParticles.begin(); + p != mChildParticles.end();) { if ((*p)->update()) { @@ -217,14 +207,9 @@ Particle::update() return true; } - -void Particle::draw(Graphics *graphics, int offsetX, int offsetY) const -{ -} - - Particle* -Particle::addEffect(std::string particleEffectFile, int pixelX, int pixelY) +Particle::addEffect(const std::string &particleEffectFile, + int pixelX, int pixelY) { Particle *newParticle = NULL; @@ -289,9 +274,9 @@ Particle::addEffect(std::string particleEffectFile, int pixelX, int pixelY) int offsetY = XML::getProperty(effectChildNode, "position-y", 0); int offsetZ = XML::getProperty(effectChildNode, "position-z", 0); - int particleX = (int)mPosX + pixelX + offsetX; - int particleY = (int)mPosY + pixelY + offsetY; - int particleZ = (int)mPosZ + offsetZ; + int particleX = (int) mPos.x + pixelX + offsetX; + int particleY = (int) mPos.y + pixelY + offsetY; + int particleZ = (int) mPos.z + offsetZ; int lifetime = XML::getProperty(effectChildNode, "lifetime", -1); @@ -317,17 +302,16 @@ Particle::addEffect(std::string particleEffectFile, int pixelX, int pixelY) Particle* -Particle::addTextSplashEffect(std::string text, +Particle::addTextSplashEffect(const std::string &text, int colorR, int colorG, int colorB, gcn::Font *font, int x, int y) { Particle *newParticle = new TextParticle(mMap, text, colorR, colorG, colorB, font); newParticle->setPosition(x, y, 0); - newParticle->setVector ( ((rand()%100) - 50) / 200.0f, // X vector - ((rand()%100) - 50) / 200.0f, // Y vector - ((rand()%100) / 200.0f) + 4.0f // Z vector - ); + newParticle->setVelocity(((rand() % 100) - 50) / 200.0f, // X + ((rand() % 100) - 50) / 200.0f, // Y + ((rand() % 100) / 200.0f) + 4.0f); // Z newParticle->setGravity(0.1f); newParticle->setBounce(0.5f); newParticle->setLifetime(200); @@ -338,14 +322,28 @@ Particle::addTextSplashEffect(std::string text, return newParticle; } +Particle* +Particle::addTextRiseFadeOutEffect(const std::string &text, gcn::Font *font, + int x, int y) +{ + Particle *newParticle = new TextParticle(mMap, text, 255, 255, 255, font); + newParticle->setPosition(x, y, 0); + newParticle->setVelocity(0.0f, 0.0f, 0.5f); + newParticle->setGravity(0.0015f); + newParticle->setLifetime(300); + newParticle->setFadeOut(50); + newParticle->setFadeIn(200); + + mChildParticles.push_back(newParticle); + + return newParticle; +} void Particle::setMap(Map *map) { mMap = map; if (mMap) setSpriteIterator(mMap->addSprite(this)); - - // TODO: Create map emitters based on emitter data in map data } diff --git a/src/particle.h b/src/particle.h index 9e9223c7..dd7c5ee2 100644 --- a/src/particle.h +++ b/src/particle.h @@ -31,7 +31,7 @@ #include "guichanfwd.h" #include "sprite.h" - +#include "vector.h" class Map; class Particle; @@ -67,43 +67,37 @@ class Particle : public Sprite ~Particle(); /** - * Deletes all child particles and emitters + * Deletes all child particles and emitters. */ void clear(); /** * Gives a particle the properties of an engine root particle and loads - * the particle-related config settings + * the particle-related config settings. */ void setupEngine(); /** * Updates particle position, returns false when the particle should - * be deleted + * be deleted. */ virtual bool update(); /** - * Draws the particle image + * Draws the particle image. */ virtual void - draw(Graphics *graphics, int offsetX, int offsetY) const; + draw(Graphics *graphics, int offsetX, int offsetY) const {} /** - * Necessary for sorting with the other sprites + * Necessary for sorting with the other sprites. */ virtual int getPixelY() const - { - return (int)(mPosY + mPosZ) - 64; - }; - - /* - Basic Particle properties: - */ + { return (int) (mPos.y + mPos.z) - 64; } /** * Sets the map the particle is on. @@ -115,15 +109,24 @@ class Particle : public Sprite * particleEffectFile. */ Particle* - addEffect(std::string particleEffectFile, int pixelX, int pixelY); + addEffect(const std::string &particleEffectFile, + int pixelX, int pixelY); /** * Creates a standalone text particle. */ Particle* - addTextSplashEffect(std::string text, int colorR, int colorG, int colorB, + addTextSplashEffect(const std::string &text, + int colorR, int colorG, int colorB, gcn::Font *font, int x, int y); + /** + * Creates a standalone text particle. + */ + Particle* + addTextRiseFadeOutEffect(const std::string &text, gcn::Font *font, + int x, int y); + /** * Adds an emitter to the particle. */ @@ -132,34 +135,31 @@ class Particle : public Sprite { mChildEmitters.push_back(emitter); } /** - * Sets the position in 3 dimensional space in pixels relative to map + * Sets the position in 3 dimensional space in pixels relative to map. */ void setPosition(float x, float y, float z) - { mPosX = x; mPosY = y; mPosZ = z; } + { mPos.x = x; mPos.y = y; mPos.z = z; } /** - * Sets the position in 2 dimensional space in pixels relative to map + * Sets the position in 2 dimensional space in pixels relative to map. */ void setPosition(float x, float y) - { mPosX = x; mPosY = y; } - - float getPosX() const - { return mPosX; } + { mPos.x = x; mPos.y = y; } - float getPosY() const - { return mPosY; } - - float getPosZ() const - { return mPosZ; } + /** + * Returns the particle position. + */ + const Vector& getPosition() const + { return mPos; } /** * Changes the particle position relative */ void moveBy(float x, float y, float z) - { mPosX += x; mPosY += y; mPosZ += z; } + { mPos.x += x; mPos.y += y; mPos.z += z; } /** * Sets the time in game ticks until the particle is destroyed. @@ -170,48 +170,48 @@ class Particle : public Sprite /** * Sets the age of the pixel in game ticks where the particle has - * faded in completely + * faded in completely. */ void - setFadeOut (int fadeOut) + setFadeOut(int fadeOut) { mFadeOut = fadeOut; } /** * Sets the remaining particle lifetime where the particle starts to - * fade out + * fade out. */ void - setFadeIn (int fadeIn) + setFadeIn(int fadeIn) { mFadeIn = fadeIn; } /** * Sets the sprite iterator of the particle on the current map to make - * it easier to remove the particle from the map when it is destroyed + * it easier to remove the particle from the map when it is destroyed. */ void setSpriteIterator(std::list::iterator spriteIterator) { mSpriteIterator = spriteIterator; } /** - * Gets the sprite iterator of the particle on the current map + * Gets the sprite iterator of the particle on the current map. */ std::list::iterator getSpriteIterator() const { return mSpriteIterator; } /** - * Sets the current velocity in 3 dimensional space + * Sets the current velocity in 3 dimensional space. */ void - setVector(float x, float y, float z) - { mVectorX = x; mVectorY = y; mVectorZ = z; } + setVelocity(float x, float y, float z) + { mVelocity.x = x; mVelocity.y = y; mVelocity.z = z; } /** - * Sets the downward acceleration + * Sets the downward acceleration. */ void - setGravity(float g) - { mGravity = g; } + setGravity(float gravity) + { mGravity = gravity; } /** * Sets the ammount of random vector changes @@ -237,8 +237,8 @@ class Particle : public Sprite /** * Sets the distance in pixel the particle can come near the target - * particle before it is destroyed. Does only make sense after a - * target particle has been set using setDestination. + * particle before it is destroyed. Does only make sense after a target + * particle has been set using setDestination. */ void setDieDistance(float dist) { mInvDieDistance = 1.0f / dist; } @@ -247,7 +247,7 @@ class Particle : public Sprite { return mAlive; } /** - * Manually marks the particle for deletion + * Manually marks the particle for deletion. */ void kill() { mAlive = false; mAutoDelete = true; } @@ -261,7 +261,7 @@ class Particle : public Sprite protected: bool mAlive; /**< Is the particle supposed to be drawn and updated?*/ - float mPosX, mPosY, mPosZ; /**< Position in 3 dimensonal space - pixel based relative to map */ + Vector mPos; /**< Position in pixels relative to map. */ int mLifetimeLeft; /**< Lifetime left in game ticks*/ int mLifetimePast; /**< Age of the particle in game ticks*/ int mFadeOut; /**< Lifetime in game ticks left where fading out begins*/ @@ -269,17 +269,19 @@ class Particle : public Sprite private: // generic properties - bool mAutoDelete; /**< May the particle request its deletion by the parent particle?*/ - Map *mMap; /**< Map the particle is on*/ + bool mAutoDelete; /**< May the particle request its deletion by the parent particle? */ + Map *mMap; /**< Map the particle is on. */ std::list::iterator mSpriteIterator; /**< iterator of the particle on the current map */ - Emitters mChildEmitters; /**< List of child emitters*/ - Particles mChildParticles; /**< List of particles controlled by this particle*/ - //dynamic particle - float mVectorX, mVectorY, mVectorZ; /**< Speed in 3 dimensional space in pixels per game-tick */ - float mGravity; /**< Downward acceleration in pixels per game-tick²*/ - int mRandomnes; /**< Ammount of random vector change*/ - float mBounce; /**< How much the particle bounces off when hitting the ground*/ - //follow-point particles + Emitters mChildEmitters; /**< List of child emitters. */ + Particles mChildParticles; /**< List of particles controlled by this particle */ + + // dynamic particle + Vector mVelocity; /**< Speed in pixels per game-tick. */ + float mGravity; /**< Downward acceleration in pixels per game-tick. */ + int mRandomnes; /**< Ammount of random vector change */ + float mBounce; /**< How much the particle bounces off when hitting the ground */ + + // follow-point particles Particle *mTarget; /**< The particle that attracts this particle*/ float mAcceleration; /**< Acceleration towards the target particle in pixels per game-tick²*/ float mInvDieDistance; /**< Distance in pixels from the target particle that causes the destruction of the particle*/ diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp index 60a98cc5..035882b6 100644 --- a/src/particleemitter.cpp +++ b/src/particleemitter.cpp @@ -248,10 +248,9 @@ ParticleEmitter::readMinMax(xmlNodePtr propertyNode, T def) { MinMax retval; - def = (T)XML::getFloatProperty(propertyNode, "value", (double)def); - retval.set ( (T)XML::getFloatProperty(propertyNode, "min", (double)def), - (T)XML::getFloatProperty(propertyNode, "max", (double)def) - ); + def = (T) XML::getFloatProperty(propertyNode, "value", (double) def); + retval.set((T) XML::getFloatProperty(propertyNode, "min", (double) def), + (T) XML::getFloatProperty(propertyNode, "max", (double) def)); return retval; } @@ -284,19 +283,17 @@ ParticleEmitter::createParticles() newParticle->setPosition( - mParticlePosX.value(), - mParticlePosY.value(), - mParticlePosZ.value() - ); + mParticlePosX.value(), + mParticlePosY.value(), + mParticlePosZ.value()); float angleH = mParticleAngleHorizontal.value(); float angleV = mParticleAngleVertical.value(); float power = mParticlePower.value(); - newParticle->setVector( - cos(angleH) * cos(angleV) * power, - sin(angleH) * cos(angleV) * power, - sin(angleV) * power - ); + newParticle->setVelocity( + cos(angleH) * cos(angleV) * power, + sin(angleH) * cos(angleV) * power, + sin(angleV) * power); newParticle->setRandomnes(mParticleRandomnes.value()); newParticle->setGravity(mParticleGravity.value()); @@ -312,10 +309,9 @@ ParticleEmitter::createParticles() newParticle->setFadeOut(mParticleFadeOut.value()); newParticle->setFadeIn(mParticleFadeIn.value()); - for ( std::list::iterator i = mParticleChildEmitters.begin(); - i != mParticleChildEmitters.end(); - i++ - ) + for (std::list::iterator i = mParticleChildEmitters.begin(); + i != mParticleChildEmitters.end(); + i++) { newParticle->addEmitter(new ParticleEmitter(*i)); } diff --git a/src/player.cpp b/src/player.cpp index d3c27aa0..b63dcd5b 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -28,7 +28,8 @@ #include "graphics.h" #include "log.h" -#include "resources/equipmentdb.h" +#include "resources/itemdb.h" +#include "resources/iteminfo.h" #include "utils/tostring.h" @@ -37,7 +38,6 @@ Player::Player(Uint16 id, Uint16 job, Map *map): Being(id, job, map) { - setWeapon(0); } Being::Type @@ -93,8 +93,8 @@ Player::setSex(Uint8 sex) if (i != HAIR_SPRITE && mEquipmentSpriteIDs.at(i) != 0) { AnimatedSprite *newEqSprite = new AnimatedSprite( - "graphics/sprites/" + EquipmentDB::get( - mEquipmentSpriteIDs.at(i))->getSprite(sex)); + "graphics/sprites/" + ItemDB::get( + mEquipmentSpriteIDs.at(i)).getSprite(sex)); delete mSprites[i]; mSprites[i] = newEqSprite; } @@ -102,39 +102,6 @@ Player::setSex(Uint8 sex) } } -void -Player::setWeapon(Uint16 weapon) -{ - if (weapon != mWeapon) - { - AnimatedSprite *newWeaponSprite = NULL; - - switch (weapon) - { - case 0: - newWeaponSprite = - new AnimatedSprite("graphics/sprites/weapon-fist.xml"); - break; - case 1: - newWeaponSprite = - new AnimatedSprite("graphics/sprites/weapon-dagger.xml"); - break; - case 2: - newWeaponSprite = - new AnimatedSprite("graphics/sprites/weapon-bow.xml"); - break; - case 3: - newWeaponSprite = - new AnimatedSprite("graphics/sprites/weapon-scythe.xml"); - break; - } - - delete mSprites[WEAPON_SPRITE]; - mSprites[WEAPON_SPRITE] = newWeaponSprite; - } - Being::setWeapon(weapon); -} - void Player::setHairColor(Uint16 color) { @@ -189,11 +156,11 @@ Player::setVisibleEquipment(Uint8 slot, int id) if (mSex == 0) { equipmentSprite = new AnimatedSprite( - "graphics/sprites/" + EquipmentDB::get(id)->getSprite(0)); + "graphics/sprites/" + ItemDB::get(id).getSprite(0)); } else { equipmentSprite = new AnimatedSprite( - "graphics/sprites/" + EquipmentDB::get(id)->getSprite(1)); + "graphics/sprites/" + ItemDB::get(id).getSprite(1)); } equipmentSprite->setDirection(getSpriteDirection()); @@ -201,6 +168,11 @@ Player::setVisibleEquipment(Uint8 slot, int id) delete mSprites[slot]; mSprites[slot] = equipmentSprite; + if (slot == WEAPON_SPRITE) + { + mEquippedWeapon = &ItemDB::get(id); + } + setAction(mAction); } diff --git a/src/player.h b/src/player.h index 8aa84992..2c06bfba 100644 --- a/src/player.h +++ b/src/player.h @@ -59,9 +59,6 @@ class Player : public Being virtual void setVisibleEquipment(Uint8 slot, int id); - - virtual void - setWeapon(Uint16 weapon); }; #endif diff --git a/src/resources/equipmentdb.cpp b/src/resources/equipmentdb.cpp deleted file mode 100644 index 38ac6415..00000000 --- a/src/resources/equipmentdb.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#include "equipmentdb.h" - -#include "resourcemanager.h" - -#include "../log.h" - -#include "../utils/dtor.h" -#include "../utils/xml.h" - -namespace -{ - EquipmentDB::EquipmentInfos mEquipmentInfos; - EquipmentInfo mUnknown; - bool mLoaded = false; -} - -void -EquipmentDB::load() -{ - if (mLoaded) - return; - - logger->log("Initializing equipment database..."); - mUnknown.setSprite("error.xml", 0); - mUnknown.setSprite("error.xml", 1); - - ResourceManager *resman = ResourceManager::getInstance(); - int size; - char *data = (char*)resman->loadFile("equipment.xml", size); - - if (!data) - { - logger->error("Equipment Database: Could not find equipment.xml!"); - } - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); - - if (!doc) - { - logger->error("Equipment Database: Error while parsing equipment database (equipment.xml)!"); - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); - if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "equipments")) - { - logger->error("Equipment Database: equipment.xml is not a valid database file!"); - } - - //iterate s - for_each_xml_child_node(equipmentNode, rootNode) - { - if (!xmlStrEqual(equipmentNode->name, BAD_CAST "equipment")) - { - continue; - } - - EquipmentInfo *currentInfo = new EquipmentInfo(); - - currentInfo->setSlot (XML::getProperty(equipmentNode, "slot", 0)); - - //iterate s - for_each_xml_child_node(spriteNode, equipmentNode) - { - if (!xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) - { - continue; - } - - std::string gender = XML::getProperty(spriteNode, "gender", "unisex"); - std::string filename = (const char*) spriteNode->xmlChildrenNode->content; - - if (gender == "male" || gender == "unisex") - { - currentInfo->setSprite(filename, 0); - } - - if (gender == "female" || gender == "unisex") - { - currentInfo->setSprite(filename, 1); - } - } - - setEquipment( XML::getProperty(equipmentNode, "id", 0), - currentInfo); - } - - mLoaded = true; -} - -void -EquipmentDB::unload() -{ - // kill EquipmentInfos - for_each ( mEquipmentInfos.begin(), mEquipmentInfos.end(), - make_dtor(mEquipmentInfos)); - mEquipmentInfos.clear(); - - mLoaded = false; -} - -EquipmentInfo* -EquipmentDB::get(int id) -{ - if (!mLoaded) { - logger->error("Error: Equipment database used before initialization!"); - } - - EquipmentInfoIterator i = mEquipmentInfos.find(id); - - if (i == mEquipmentInfos.end() ) - { - logger->log("EquipmentDB: Error, unknown equipment ID# %d", id); - return &mUnknown; - } - else - { - return i->second; - } -} - -void -EquipmentDB::setEquipment(int id, EquipmentInfo* equipmentInfo) -{ - if (mEquipmentInfos.find(id) != mEquipmentInfos.end()) { - logger->log("Warning: Equipment Piece with ID %d defined multiple times", - id); - delete equipmentInfo; - } - else { - mEquipmentInfos[id] = equipmentInfo; - }; -} diff --git a/src/resources/equipmentdb.h b/src/resources/equipmentdb.h deleted file mode 100644 index 1c1db7d1..00000000 --- a/src/resources/equipmentdb.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#ifndef _TMW_EQUIPMENT_DB_H -#define _TMW_EQUIPMENT_DB_H - -#include - -#include "equipmentinfo.h" - -/** - * Equipment information database. - */ -namespace EquipmentDB -{ - /** - * Loads the equipment info from Items.xml - */ - void load(); - - /** - * Frees equipment data - */ - void unload(); - - void setEquipment(int id, EquipmentInfo* equipmentInfo); - - EquipmentInfo* get(int id); - - // Equipment database types - typedef std::map EquipmentInfos; - typedef EquipmentInfos::iterator EquipmentInfoIterator; -} - -#endif diff --git a/src/resources/equipmentinfo.h b/src/resources/equipmentinfo.h deleted file mode 100644 index 75ed1b8a..00000000 --- a/src/resources/equipmentinfo.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * The Mana World - * Copyright 2006 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: - */ - -#ifndef _TMW_EQUIPMENTINFO_H_ -#define _TMW_EQUIPMENTINFO_H_ - -#include -#include - -class EquipmentInfo -{ - public: - EquipmentInfo(): - mSlot (0) - { - }; - - void - setSlot (int slot) { mSlot = slot; }; - - const std::string& - getSprite(int gender) {return animationFiles[gender]; }; - - void - setSprite(std::string animationFile, int gender) {animationFiles[gender] = animationFile; }; - - private: - int mSlot; //not used at the moment but maybe useful on our own server - std::map animationFiles; -}; - -#endif diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 7b16339c..18952ae9 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -18,9 +18,11 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: + * $Id$ */ +#include + #include "itemdb.h" #include @@ -36,10 +38,13 @@ namespace { ItemDB::ItemInfos mItemInfos; - ItemInfo mUnknown; + ItemInfo *mUnknown; bool mLoaded = false; } +// Forward declarations +static void loadSpriteRef(ItemInfo *itemInfo, xmlNodePtr node); +static void loadSoundRef(ItemInfo *itemInfo, xmlNodePtr node); void ItemDB::load() { @@ -47,11 +52,16 @@ void ItemDB::load() return; logger->log("Initializing item database..."); - mUnknown.setName("Unknown item"); + + mUnknown = new ItemInfo(); + mUnknown->setName("Unknown item"); + mUnknown->setImage(""); + mUnknown->setSprite("error.xml", 0); + mUnknown->setSprite("error.xml", 1); ResourceManager *resman = ResourceManager::getInstance(); int size; - char *data = (char*)resman->loadFile("items.xml", size); + char *data = (char*) resman->loadFile("items.xml", size); if (!data) { logger->error("ItemDB: Could not find items.xml!"); @@ -73,48 +83,66 @@ void ItemDB::load() for_each_xml_child_node(node, rootNode) { - if (!xmlStrEqual(node->name, BAD_CAST "item")) { + if (!xmlStrEqual(node->name, BAD_CAST "item")) continue; - } int id = XML::getProperty(node, "id", 0); - int art = XML::getProperty(node, "art", 0); + + if (id == 0) + { + logger->log("ItemDB: Invalid or missing item ID in items.xml!"); + continue; + } + else if (mItemInfos.find(id) != mItemInfos.end()) + { + logger->log("ItemDB: Redefinition of item ID %d", id); + } + int type = XML::getProperty(node, "type", 0); int weight = XML::getProperty(node, "weight", 0); + int view = XML::getProperty(node, "view", 0); int slot = XML::getProperty(node, "slot", 0); std::string name = XML::getProperty(node, "name", ""); std::string image = XML::getProperty(node, "image", ""); std::string description = XML::getProperty(node, "description", ""); std::string effect = XML::getProperty(node, "effect", ""); + std::string attackType = XML::getProperty(node, "attacktype", ""); - if (id && name != "") + if (id) { ItemInfo *itemInfo = new ItemInfo(); itemInfo->setImage(image); - itemInfo->setArt(art); - itemInfo->setName(name); + itemInfo->setName((name == "") ? "Unnamed" : name); itemInfo->setDescription(description); itemInfo->setEffect(effect); itemInfo->setType(type); + itemInfo->setView(view); itemInfo->setWeight(weight); itemInfo->setSlot(slot); - mItemInfos[id] = itemInfo; - } + itemInfo->setAttackType(attackType); + + for_each_xml_child_node(itemChild, node) + { + if (xmlStrEqual(itemChild->name, BAD_CAST "sprite")) + { + loadSpriteRef(itemInfo, itemChild); + } + else if (xmlStrEqual(itemChild->name, BAD_CAST "sound")) + { + loadSoundRef(itemInfo, itemChild); + } + } - if (id == 0) - { - logger->log("ItemDB: An item has no ID in items.xml!"); + mItemInfos[id] = itemInfo; } #define CHECK_PARAM(param, error_value) \ if (param == error_value) \ - logger->log("ItemDB: Missing" #param " parameter for item %i! %s", \ - id, name.c_str()) + logger->log("ItemDB: Missing " #param " attribute for item %i!",id) CHECK_PARAM(name, ""); CHECK_PARAM(image, ""); - // CHECK_PARAM(art, 0); // CHECK_PARAM(description, ""); // CHECK_PARAM(effect, ""); // CHECK_PARAM(type, 0); @@ -131,19 +159,65 @@ void ItemDB::load() void ItemDB::unload() { - for (ItemInfoIterator i = mItemInfos.begin(); i != mItemInfos.end(); i++) - { - delete i->second; - } - mItemInfos.clear(); + logger->log("Unloading item database..."); + + delete mUnknown; + mUnknown = NULL; + for_each(mItemInfos.begin(), mItemInfos.end(), make_dtor(mItemInfos)); + mItemInfos.clear(); mLoaded = false; } -const ItemInfo& -ItemDB::get(int id) +const ItemInfo& ItemDB::get(int id) { + assert(mLoaded); + ItemInfoIterator i = mItemInfos.find(id); - return (i != mItemInfos.end()) ? *(i->second) : mUnknown; + if (i == mItemInfos.end()) + { + logger->log("ItemDB: Error, unknown item ID# %d", id); + return *mUnknown; + } + else + { + return *(i->second); + } +} + +void loadSpriteRef(ItemInfo *itemInfo, xmlNodePtr node) +{ + std::string gender = XML::getProperty(node, "gender", "unisex"); + std::string filename = (const char*) node->xmlChildrenNode->content; + + if (gender == "male" || gender == "unisex") + { + itemInfo->setSprite(filename, 0); + } + + if (gender == "female" || gender == "unisex") + { + itemInfo->setSprite(filename, 1); + } +} + +void loadSoundRef(ItemInfo *itemInfo, xmlNodePtr node) +{ + std::string event = XML::getProperty(node, "event", ""); + std::string filename = (const char*) node->xmlChildrenNode->content; + + if (event == "hit") + { + itemInfo->addSound(EQUIP_EVENT_HIT, filename); + } + else if (event == "strike") + { + itemInfo->addSound(EQUIP_EVENT_STRIKE, filename); + } + else + { + logger->log("ItemDB: Ignoring unknown sound event '%s'", + event.c_str()); + } } diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp index 3a41c657..b5b25ac0 100644 --- a/src/resources/iteminfo.cpp +++ b/src/resources/iteminfo.cpp @@ -25,11 +25,11 @@ #include "resourcemanager.h" #include "image.h" - +#include "itemdb.h" ItemInfo::~ItemInfo() { - if (mImage != NULL) + if (mImage) { mImage->decRef(); } @@ -38,19 +38,87 @@ ItemInfo::~ItemInfo() void ItemInfo::setImage(const std::string &image) { + if (mImage) + { + mImage->decRef(); + } + + ResourceManager *resman = ResourceManager::getInstance(); mImageName = "graphics/items/" + image; + mImage = ResourceManager::getInstance()->getImage(mImageName); - if (mImageName != "") + if (!mImage) { - if (mImage != NULL) - { - mImage->decRef(); - } + mImage = resman->getImage("graphics/gui/unknown-item.png"); + } +} - mImage = ResourceManager::getInstance()->getImage(mImageName); +const std::string& +ItemInfo::getSprite(int gender) const +{ + if (mView) + { + // Forward the request to the item defining how to view this item + return ItemDB::get(mView).getSprite(gender); } else { - mImage = NULL; + static const std::string empty = ""; + std::map::const_iterator i = + mAnimationFiles.find(gender); + + return (i != mAnimationFiles.end()) ? i->second : empty; + } +} + +void +ItemInfo::setAttackType(const std::string &attackType) +{ + if (attackType == "swing") + { + mAttackType = ACTION_ATTACK_SWING; + } + else if (attackType == "stab") + { + mAttackType = ACTION_ATTACK_STAB; + } + else if (attackType == "bow") + { + mAttackType = ACTION_ATTACK_BOW; } + else if (attackType == "throw") + { + mAttackType = ACTION_ATTACK_THROW; + } + else if (attackType == "none") + { + mAttackType = ACTION_DEFAULT; + } + else + { + mAttackType = ACTION_ATTACK; + } +} + +void +ItemInfo::addSound(EquipmentSoundEvent event, const std::string &filename) +{ + if (mSounds.find(event) == mSounds.end()) + { + mSounds[event] = new std::vector; + } + + mSounds[event]->push_back("sfx/" + filename); +} + + +const std::string& +ItemInfo::getSound(EquipmentSoundEvent event) const +{ + static const std::string empty = ""; + std::map*>::const_iterator i; + i = mSounds.find(event); + + return (i == mSounds.end()) ? empty : + i->second->at(rand() % i->second->size()); } diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h index e4f851bb..4fd1638e 100644 --- a/src/resources/iteminfo.h +++ b/src/resources/iteminfo.h @@ -24,12 +24,23 @@ #ifndef _TMW_ITEMINFO_H_ #define _TMW_ITEMINFO_H_ +#include #include +#include + +#include "spritedef.h" class Image; +enum EquipmentSoundEvent +{ + EQUIP_EVENT_STRIKE, + EQUIP_EVENT_HIT +}; + /** - * Defines a class for storing item infos. + * Defines a class for storing item infos. This includes information used when + * the item is equipped. */ class ItemInfo { @@ -40,10 +51,11 @@ class ItemInfo ItemInfo(): mImageName(""), mImage(NULL), - mArt(0), mType(0), mWeight(0), - mSlot(0) + mView(0), + mSlot(0), + mAttackType(ACTION_DEFAULT) { } @@ -52,73 +64,89 @@ class ItemInfo */ ~ItemInfo(); - void - setArt(short art) { mArt = art; } + void setName(const std::string &name) + { mName = name; } - short - getArt() const { return mArt; } + const std::string& getName() const + { return mName; } - void - setName(const std::string &name) { mName = name; } + void setImage(const std::string &image); - const std::string& - getName() const { return mName; } + Image* getImage() const + { return mImage; } - void - setImage(const std::string &image); + void setDescription(const std::string &description) + { mDescription = description; } - Image* - getImage() const { return mImage; } + const std::string& getDescription() const + { return mDescription; } - void - setDescription(const std::string &description) - { - mDescription = description; - } + void setEffect(const std::string &effect) + { mEffect = effect; } const std::string& - getDescription() const { return mDescription; } + getEffect() const { return mEffect; } - void - setEffect(const std::string &effect) { mEffect = effect; } + void setType(short type) + { mType = type; } - const std::string& - getEffect() const { return mEffect; } + short getType() const + { return mType; } + + void setWeight(short weight) + { mWeight = weight; } + + short getWeight() const + { return mWeight; } + + void setView(int view) + { mView = view; } + + void setSlot(char slot) + { mSlot = slot; } - void - setType(short type) { mType = type; } + char getSlot() const + { return mSlot; } - short - getType() const { return mType; } + void setSprite(const std::string &animationFile, int gender) + { mAnimationFiles[gender] = animationFile; } - void - setWeight(short weight) { mWeight = weight; } + const std::string& getSprite(int gender) const; - short - getWeight() const { return mWeight; } + void setAttackType(const std::string &attackType); - void - setSlot(char slot) { mSlot = slot; } + const SpriteAction getAttackType() const + { return mAttackType; } - char - getSlot() const { return mSlot; } + void addSound(EquipmentSoundEvent event, const std::string &filename); + + const std::string& getSound(EquipmentSoundEvent event) const; protected: - std::string mImageName; + std::string mImageName; /**< The filename of the icon image. */ /* TODO (BL): I do not think the item info should keep a reference to * the item icon. It would probably be better if this was kept in the * Item class, so that the images can be lazily instantiated and also * unloaded when no longer used. */ - Image *mImage; - short mArt; + Image *mImage; /**< The loaded icon image. */ std::string mName; - std::string mDescription; - std::string mEffect; - short mType; - short mWeight; - char mSlot; + std::string mDescription; /**< Short description. */ + std::string mEffect; /**< Description of effects. */ + short mType; /**< Item type (never used). */ + short mWeight; /**< Weight in grams. */ + int mView; /**< Item ID of how this item looks. */ + + // Equipment related members + char mSlot; /**< Equipment slot. */ + SpriteAction mAttackType; /**< Attack type, in case of weapon. */ + + /** Maps gender to sprite filenames. */ + std::map mAnimationFiles; + + /** Stores the names of sounds to be played at certain event. */ + std::map* > mSounds; }; #endif diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index 260d5aa9..940ded36 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -156,7 +156,7 @@ MapReader::readMap(const std::string &filename) if (buffer == NULL) { - logger->log("Map file not found (%s)\n", filename.c_str()); + logger->log("Map file not found (%s)", filename.c_str()); return NULL; } diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index 339ed6ba..f4864eea 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -120,19 +120,19 @@ MonsterDB::load() if (event == "hit") { - currentInfo->addSound(EVENT_HIT, filename); + currentInfo->addSound(MONSTER_EVENT_HIT, filename); } else if (event == "miss") { - currentInfo->addSound(EVENT_MISS, filename); + currentInfo->addSound(MONSTER_EVENT_MISS, filename); } else if (event == "hurt") { - currentInfo->addSound(EVENT_HURT, filename); + currentInfo->addSound(MONSTER_EVENT_HURT, filename); } else if (event == "die") { - currentInfo->addSound(EVENT_DIE, filename); + currentInfo->addSound(MONSTER_EVENT_DIE, filename); } else { diff --git a/src/resources/monsterinfo.cpp b/src/resources/monsterinfo.cpp index 2a59419e..2e896237 100644 --- a/src/resources/monsterinfo.cpp +++ b/src/resources/monsterinfo.cpp @@ -33,15 +33,15 @@ MonsterInfo::MonsterInfo(): MonsterInfo::~MonsterInfo() { - //kill vectors in mSoundEffects - for_each ( mSounds.begin(), mSounds.end(), - make_dtor(mSounds)); + // kill vectors in mSoundEffects + for_each (mSounds.begin(), mSounds.end(), + make_dtor(mSounds)); mSounds.clear(); } void -MonsterInfo::addSound (SoundEvent event, std::string filename) +MonsterInfo::addSound(MonsterSoundEvent event, std::string filename) { if (mSounds.find(event) == mSounds.end()) { @@ -53,9 +53,9 @@ MonsterInfo::addSound (SoundEvent event, std::string filename) std::string -MonsterInfo::getSound (SoundEvent event) const +MonsterInfo::getSound(MonsterSoundEvent event) const { - std::map* >::const_iterator i; + std::map* >::const_iterator i; i = mSounds.find(event); diff --git a/src/resources/monsterinfo.h b/src/resources/monsterinfo.h index aa7db9f0..c9fbd4c9 100644 --- a/src/resources/monsterinfo.h +++ b/src/resources/monsterinfo.h @@ -31,12 +31,12 @@ #include "../being.h" -enum SoundEvent +enum MonsterSoundEvent { - EVENT_HIT, - EVENT_MISS, - EVENT_HURT, - EVENT_DIE + MONSTER_EVENT_HIT, + MONSTER_EVENT_MISS, + MONSTER_EVENT_HURT, + MONSTER_EVENT_DIE }; /** @@ -69,7 +69,7 @@ class MonsterInfo { mTargetCursorSize = targetCursorSize; } void - addSound(SoundEvent event, std::string filename); + addSound(MonsterSoundEvent event, std::string filename); const std::string& getName () const { return mName; }; @@ -81,13 +81,13 @@ class MonsterInfo getTargetCursorSize() const { return mTargetCursorSize; } std::string - getSound (SoundEvent event) const; + getSound(MonsterSoundEvent event) const; private: std::string mName; std::string mSprite; Being::TargetCursorSize mTargetCursorSize; - std::map* > mSounds; + std::map* > mSounds; }; #endif diff --git a/src/resources/spritedef.h b/src/resources/spritedef.h index 6d335b02..55d7f459 100644 --- a/src/resources/spritedef.h +++ b/src/resources/spritedef.h @@ -24,11 +24,11 @@ #ifndef _TMW_SPRITEDEF_H #define _TMW_SPRITEDEF_H -#include "resource.h" - #include #include +#include "resource.h" + #include class Action; diff --git a/src/textparticle.cpp b/src/textparticle.cpp index dd01d2fe..4bc859cd 100644 --- a/src/textparticle.cpp +++ b/src/textparticle.cpp @@ -26,7 +26,8 @@ #include "graphics.h" TextParticle::TextParticle(Map *map, const std::string &text, - int colorR, int colorG, int colorB, gcn::Font *font): + int colorR, int colorG, int colorB, + gcn::Font *font): Particle(map), mText(text), mTextFont(font), @@ -41,8 +42,8 @@ void TextParticle::draw(Graphics *graphics, int offsetX, int offsetY) const if (!mAlive) return; - int screenX = (int)mPosX + offsetX; - int screenY = (int)mPosY - int(mPosZ) + offsetY; + int screenX = (int) mPos.x + offsetX; + int screenY = (int) mPos.y - (int) mPos.z + offsetY; int alpha = 255; @@ -50,7 +51,7 @@ void TextParticle::draw(Graphics *graphics, int offsetX, int offsetY) const { alpha *= mLifetimeLeft; alpha /= mFadeOut; - }; + } if (mLifetimePast < mFadeIn) { @@ -59,6 +60,6 @@ void TextParticle::draw(Graphics *graphics, int offsetX, int offsetY) const } graphics->setFont(mTextFont); - graphics->setColor(gcn::Color (mColorR, mColorG, mColorB, alpha)); + graphics->setColor(gcn::Color(mColorR, mColorG, mColorB, alpha)); graphics->drawText(mText, screenX, screenY, gcn::Graphics::CENTER); } diff --git a/src/textparticle.h b/src/textparticle.h index b365c885..34badb57 100644 --- a/src/textparticle.h +++ b/src/textparticle.h @@ -33,21 +33,26 @@ class TextParticle : public Particle { public: + /** + * Constructor. + */ TextParticle(Map *map, const std::string &text, - int colorR, int colorG, int colorB, gcn::Font *font); + int colorR, int colorG, int colorB, + gcn::Font *font); /** - * Draws the particle image + * Draws the particle image. */ virtual void draw(Graphics *graphics, int offsetX, int offsetY) const; // hack to improve text visibility - virtual int getPixelY() const { return (int)(mPosY + mPosZ); } + virtual int getPixelY() const + { return (int) (mPos.y + mPos.z); } private: - std::string mText; /**< Text of the particle */ - gcn::Font *mTextFont; /**< Font used for drawing the text */ - int mColorR, mColorG, mColorB; /**< Color used for drawing the text */ + std::string mText; /**< Text of the particle. */ + gcn::Font *mTextFont; /**< Font used for drawing the text. */ + int mColorR, mColorG, mColorB; /**< Color used for drawing the text. */ }; #endif diff --git a/src/utils/fastsqrt.h b/src/utils/fastsqrt.h index 78768149..b7b036e9 100644 --- a/src/utils/fastsqrt.h +++ b/src/utils/fastsqrt.h @@ -5,6 +5,8 @@ * http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf * * Unfortunately the original creator of this function seems to be unknown. + * + * $Id$ */ float fastInvSqrt(float x) diff --git a/src/utils/minmax.h b/src/utils/minmax.h index 27eb2565..ea6ad9e0 100644 --- a/src/utils/minmax.h +++ b/src/utils/minmax.h @@ -18,6 +18,7 @@ * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * + * $Id$ */ /** diff --git a/src/utils/trim.h b/src/utils/trim.h new file mode 100644 index 00000000..1b5311e6 --- /dev/null +++ b/src/utils/trim.h @@ -0,0 +1,53 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_UTILS_TRIM_H_ +#define _TMW_UTILS_TRIM_H_ + +#include + +/** + * Trims spaces off the end and the beginning of the given string. + * + * @param str the string to trim spaces off + */ +static void trim(std::string &str) +{ + std::string::size_type pos = str.find_last_not_of(' '); + if (pos != std::string::npos) + { + str.erase(pos + 1); + pos = str.find_first_not_of(' '); + if (pos != std::string::npos) + { + str.erase(0, pos); + } + } + else + { + // There is nothing else but whitespace in the string + str.clear(); + } +} + +#endif diff --git a/src/vector.h b/src/vector.h new file mode 100644 index 00000000..7a5da241 --- /dev/null +++ b/src/vector.h @@ -0,0 +1,134 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_VECTOR_H_ +#define _TMW_VECTOR_H_ + +/** + * Vector class. Represents either a 3D point in space, a velocity or a force. + * Provides several convenient operator overloads. + */ +class Vector +{ + public: + /** + * Constructor. + */ + Vector(): + x(0.0f), + y(0.0f), + z(0.0f) + {} + + /** + * Constructor. + */ + Vector(float x, float y, float z): + x(x), + y(y), + z(z) + {} + + /** + * Copy constructor. + */ + Vector(const Vector &v): + x(v.x), + y(v.y), + z(v.z) + {} + + /** + * Scale vector operator. + */ + Vector operator*(float c) const + { + return Vector(x * c, + y * c, + z * c); + } + + /** + * In-place scale vector operator. + */ + void operator*=(float c) + { + x *= c; + y *= c; + z *= c; + } + + /** + * Scale vector operator. + */ + Vector operator/(float c) const + { + return Vector(x / c, + y / c, + z / c); + } + + /** + * Add vector operator. + */ + Vector operator+(const Vector &v) const + { + return Vector(x + v.x, + y + v.y, + z + v.z); + } + + /** + * In-place add vector operator. + */ + void operator+=(const Vector &v) + { + x += v.x; + y += v.y; + z += v.z; + } + + /** + * Substract vector operator. + */ + Vector operator-(const Vector &v) const + { + return Vector(x - v.x, + y - v.y, + z - v.z); + } + + /** + * In-place substract vector operator. + */ + void operator-=(const Vector &v) + { + x -= v.x; + y -= v.y; + z -= v.z; + } + + float x, y, z; +}; + +#endif diff --git a/tools/adler32.c b/tools/adler32.c new file mode 100644 index 00000000..4e851713 --- /dev/null +++ b/tools/adler32.c @@ -0,0 +1,67 @@ +/* + * adler32.c (c) 2006 Bjorn Lindeijer + * License: GPL, v2 or later + * + * Calculates Adler-32 checksums for all files passed as argument. + * + * Usage: adler32 [file]... + */ + +#include +#include + +/** + * Calculates the Adler-32 checksum for the given file. + */ +unsigned long fadler32(FILE *file) +{ + // Obtain file size + fseek(file, 0, SEEK_END); + long fileSize = ftell(file); + rewind(file); + + // Calculate Adler-32 checksum + char *buffer = (char*) malloc(fileSize); + fread(buffer, 1, fileSize, file); + unsigned long adler = adler32(0L, Z_NULL, 0); + adler = adler32(adler, (Bytef*) buffer, fileSize); + free(buffer); + + return adler; +} + +/** + * Prints out usage and exists. + */ +void print_usage() +{ + printf("Usage: adler32 [file]...\n"); + exit(0); +} + +int main(int argc, char *argv[]) +{ + int i; /**< Loops through arguments. */ + + if (argc == 1) + { + print_usage(); + } + + for (i = 1; i < argc; ++i) + { + FILE *file = fopen(argv[i], "r"); + + if (!file) + { + printf("Error while opening '%s' for reading!\n", argv[i]); + exit(1); + } + + unsigned long adler = fadler32(file); + printf("%s %lx\n", argv[i], adler); + fclose(file); + } + + return 0; +} -- cgit v1.2.3-70-g09d2 From 9cfafa755012bfd68c661996ddaea76e2e265f81 Mon Sep 17 00:00:00 2001 From: Guillaume Melquiond Date: Thu, 20 Sep 2007 20:31:24 +0000 Subject: Fixed some compilation warning. --- ChangeLog | 8 ++++++++ src/gui/browserbox.cpp | 4 ++-- src/gui/windowlistener.h | 4 ++-- src/net/chathandler.cpp | 1 - src/particle.cpp | 2 ++ src/particle.h | 3 +-- src/utils/trim.h | 2 +- 7 files changed, 16 insertions(+), 8 deletions(-) (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index d0e43d40..83d447bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-09-20 Guillaume Melquiond + + * src/gui/browserbox.cpp: Fixed missing const qualifier. + * src/gui/windowlistener.h: Reduced warning about unused parameter. + * src/particle.h, src/particle.cpp: Moved function out of header file. + * src/net/chathandler.cpp: Removed useless include. + * src/utils/trim.h: Fixed storage qualifier. + 2007-09-16 Guillaume Melquiond * src/gui/button.cpp: Fixed improper const qualifier. diff --git a/src/gui/browserbox.cpp b/src/gui/browserbox.cpp index c618fa69..717342de 100644 --- a/src/gui/browserbox.cpp +++ b/src/gui/browserbox.cpp @@ -140,7 +140,7 @@ void BrowserBox::addRow(const std::string &row) { unsigned int i, j, y = 0; unsigned int nextChar; - char *hyphen = "~"; + char const *hyphen = "~"; int hyphenWidth = font->getWidth(hyphen); int x = 0; for (i = 0; i < mTextRows.size(); i++) @@ -362,7 +362,7 @@ BrowserBox::draw(gcn::Graphics *graphics) if (mMode == AUTO_WRAP) { unsigned int nextChar = j + 1; - char *hyphen = "~"; + char const *hyphen = "~"; int hyphenWidth = font->getWidth(hyphen); // Wraping between words (at blank spaces) diff --git a/src/gui/windowlistener.h b/src/gui/windowlistener.h index 08aab71d..24f6a7b8 100644 --- a/src/gui/windowlistener.h +++ b/src/gui/windowlistener.h @@ -73,12 +73,12 @@ class WindowListener /** * Called whenever the window is moved. */ - virtual void windowMoved(const WindowEvent &event) {} + virtual void windowMoved(const WindowEvent &) {} /** * Called whenever the window is resized. */ - virtual void windowResized(const WindowEvent &event) {} + virtual void windowResized(const WindowEvent &) {} }; typedef std::list WindowListeners; diff --git a/src/net/chathandler.cpp b/src/net/chathandler.cpp index afdc2ab5..713b8f22 100644 --- a/src/net/chathandler.cpp +++ b/src/net/chathandler.cpp @@ -37,7 +37,6 @@ #include "../gui/chat.h" #include "../utils/tostring.h" -#include "../utils/trim.h" extern Being *player_node; diff --git a/src/particle.cpp b/src/particle.cpp index 148bbf6f..cdd6af41 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -81,6 +81,8 @@ Particle::setupEngine() logger->log("Particle engine set up"); } +void Particle::draw(Graphics *, int, int) const {} + bool Particle::update() { diff --git a/src/particle.h b/src/particle.h index dd7c5ee2..045ab9b9 100644 --- a/src/particle.h +++ b/src/particle.h @@ -89,8 +89,7 @@ class Particle : public Sprite /** * Draws the particle image. */ - virtual void - draw(Graphics *graphics, int offsetX, int offsetY) const {} + virtual void draw(Graphics *graphics, int offsetX, int offsetY) const; /** * Necessary for sorting with the other sprites. diff --git a/src/utils/trim.h b/src/utils/trim.h index 1b5311e6..fec99100 100644 --- a/src/utils/trim.h +++ b/src/utils/trim.h @@ -31,7 +31,7 @@ * * @param str the string to trim spaces off */ -static void trim(std::string &str) +inline void trim(std::string &str) { std::string::size_type pos = str.find_last_not_of(' '); if (pos != std::string::npos) -- cgit v1.2.3-70-g09d2 From 720f758a8c6bece45e0d2d42e48bed67167f26c6 Mon Sep 17 00:00:00 2001 From: Guillaume Melquiond Date: Sat, 22 Sep 2007 08:51:16 +0000 Subject: Cleaned a bit. --- ChangeLog | 9 ++++++++- src/channelmanager.cpp | 2 +- src/channelmanager.h | 5 ++++- src/gui/browserbox.cpp | 9 ++------- src/gui/linkhandler.h | 2 ++ src/logindata.h | 6 ++---- src/utils/minmax.h | 2 ++ 7 files changed, 21 insertions(+), 14 deletions(-) (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 84dbf71a..1d15c616 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,11 @@ -2007-09-20 Guillaume Melquiond +2007-09-22 Guillaume Melquiond + + * src/gui/browserbox.cpp: Removed some useless things. + * src/logindata.h, src/gui/linkhandler.h, src/channelmanager.h, + src/channelmanager.cpp, src/utils/minmax.h: Fixed missing includes and + cleaned a bit. + +2007-09-21 Guillaume Melquiond * src/gui/chat.cpp: Fixed resizing of chat window. diff --git a/src/channelmanager.cpp b/src/channelmanager.cpp index 07dc2bbf..082581a1 100644 --- a/src/channelmanager.cpp +++ b/src/channelmanager.cpp @@ -55,7 +55,7 @@ Channel* ChannelManager::findById(int id) return NULL; } -Channel* ChannelManager::findByName(std::string name) +Channel *ChannelManager::findByName(std::string const &name) { Channel* channel; if(name != "") diff --git a/src/channelmanager.h b/src/channelmanager.h index 3ad8f0b8..5e6b5ba1 100644 --- a/src/channelmanager.h +++ b/src/channelmanager.h @@ -24,6 +24,9 @@ #ifndef _TMW_CHANNELMANAGER_H #define _TMW_CHANNELMANAGER_H +#include +#include + class Channel; class ChannelManager @@ -32,7 +35,7 @@ public: ChannelManager(); ~ChannelManager(); Channel* findById(int id); - Channel* findByName(std::string name); + Channel *findByName(std::string const &name); void addChannel(Channel *channel); void removeChannel(Channel *channel); private: diff --git a/src/gui/browserbox.cpp b/src/gui/browserbox.cpp index b69fdcbe..18853221 100644 --- a/src/gui/browserbox.cpp +++ b/src/gui/browserbox.cpp @@ -21,14 +21,9 @@ * $Id$ */ -#include "browserbox.h" - #include -#include -#include -#include -#include +#include "browserbox.h" #include "linkhandler.h" #include "truetypefont.h" @@ -261,7 +256,7 @@ BrowserBox::draw(gcn::Graphics *graphics) } } - unsigned int i, j; + unsigned int i; int x = 0, y = 0; int wrappedLines = 0; TrueTypeFont *font = static_cast(getFont()); diff --git a/src/gui/linkhandler.h b/src/gui/linkhandler.h index 33416ec7..3a32f825 100644 --- a/src/gui/linkhandler.h +++ b/src/gui/linkhandler.h @@ -24,6 +24,8 @@ #ifndef _TMW_LINK_HANDLER_H_ #define _TMW_LINK_HANDLER_H_ +#include + /** * A simple interface to windows that need to handle links from BrowserBox * widget. diff --git a/src/logindata.h b/src/logindata.h index fbbbb573..ad6537b6 100644 --- a/src/logindata.h +++ b/src/logindata.h @@ -24,6 +24,8 @@ #ifndef _TMW_LOGINDATA_H #define _TMW_LOGINDATA_H +#include + struct LoginData { std::string username; @@ -32,10 +34,6 @@ struct LoginData std::string email; short port; - int account_ID; - int session_ID1; - int session_ID2; - bool remember; /**< Whether to store the username and host. */ bool registerLogin; /**< Whether an account is being registered. */ diff --git a/src/utils/minmax.h b/src/utils/minmax.h index ea6ad9e0..427c5da7 100644 --- a/src/utils/minmax.h +++ b/src/utils/minmax.h @@ -21,6 +21,8 @@ * $Id$ */ +#include + /** * Returns a random numeric value that is larger than or equal min and smaller * than max -- cgit v1.2.3-70-g09d2 From 427c2ec86e33c7a23ae38c862d8866fcb2c2eb16 Mon Sep 17 00:00:00 2001 From: Eugenio Favalli Date: Fri, 16 Nov 2007 10:49:58 +0000 Subject: Removed useless win32 implementation of gettimeofday. --- ChangeLog | 5 ++ src/log.cpp | 8 ++-- src/utils/wingettimeofday.h | 113 -------------------------------------------- 3 files changed, 8 insertions(+), 118 deletions(-) delete mode 100644 src/utils/wingettimeofday.h (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 628d7cac..df538a0c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-11-16 Eugenio Favalli + + * src/log.cpp, src/utils/wingettimeofday.h: Removed useless win32 + implementation of gettimeofday. + 2007-11-16 Bjørn Lindeijer * src/floor_item.cpp, src/localplayer.cpp, src/item.cpp, diff --git a/src/log.cpp b/src/log.cpp index 6f69c671..97d8e460 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -24,13 +24,11 @@ #include #include -#ifdef WIN32 -#include "utils/wingettimeofday.h" -#else #include -#endif -#ifdef __APPLE__ +#ifdef WIN32 +#include +#elif __APPLE__ #include #endif diff --git a/src/utils/wingettimeofday.h b/src/utils/wingettimeofday.h deleted file mode 100644 index 28afb7e5..00000000 --- a/src/utils/wingettimeofday.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * The Mana World - * Copyright 2004 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ - */ - -#ifndef _TMW_WINGETTIMEOFDAY_H_ -#define _TMW_WINGETTIMEOFDAY_H_ - -#ifdef WIN32 - -#include - -/* - * the function gettimeofday() is available on UNIX but not on windows. - * this header defines a windows implementation as a - * GetSystemTimeAsFileTime() wrapper. - */ - -int gettimeofday(struct timeval* tv, void *tz) -/*--------------------------------------------------------------- - * Copyright (c) 1999,2000,2001,2002,2003 - * The Board of Trustees of the University of Illinois - * All Rights Reserved. - *--------------------------------------------------------------- - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software (Iperf) and associated - * documentation files (the "Software"), to deal in the Software - * without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, - * sublicense, and/or sell copies of the Software, and to permit - * persons to whom the Software is furnished to do - * so, subject to the following conditions: - * - * - * Redistributions of source code must retain the above - * copyright notice, this list of conditions and - * the following disclaimers. - * - * - * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimers in the documentation and/or other materials - * provided with the distribution. - * - * - * Neither the names of the University of Illinois, NCSA, - * nor the names of its contributors may be used to endorse - * or promote products derived from this Software without - * specific prior written permission. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTIBUTORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * ________________________________________________________________ - * National Laboratory for Applied Network Research - * National Center for Supercomputing Applications - * University of Illinois at Urbana-Champaign - * http://www.ncsa.uiuc.edu - * ________________________________________________________________ - * - * gettimeofday.c - * by Mark Gates - * ------------------------------------------------------------------- - * A (hack) implementation of gettimeofday for Windows. - * Since I send sec/usec in UDP packets, this made the most sense. - * ------------------------------------------------------------------- */ -{ - FILETIME time; - double timed; - - GetSystemTimeAsFileTime( &time ); - - // Apparently Win32 has units of 1e-7 sec (tenths of microsecs) - // 4294967296 is 2^32, to shift high word over - // 11644473600 is the number of seconds between - // the Win32 epoch 1601-Jan-01 and the Unix epoch 1970-Jan-01 - // Tests found floating point to be 10x faster than 64bit int math. - - timed = ((time.dwHighDateTime * 4294967296e-7) - 11644473600.0) + - (time.dwLowDateTime * 1e-7); - - tv->tv_sec = (long) timed; - tv->tv_usec = (long) ((timed - tv->tv_sec) * 1e6); - - return 0; -} - - -#endif // WIN32 -#endif -- cgit v1.2.3-70-g09d2 From 4e2ced304a2013808b2481cceb7622848b073e5b Mon Sep 17 00:00:00 2001 From: Philipp Sehmisch Date: Sun, 9 Mar 2008 20:41:27 +0000 Subject: Implemented possibility to rotate particle emitters. Implemented interpretation of the attacktype parameter of attack messages and visualize monster attacks other than id 1 with a particle effect. Prepared to get attack particle effects and animation types from the monster database. --- ChangeLog | 12 ++++++++++++ src/being.cpp | 2 +- src/being.h | 2 +- src/monster.cpp | 27 ++++++++++++++++++++++++--- src/monster.h | 2 +- src/net/beinghandler.cpp | 9 +++++++-- src/particle.cpp | 4 ++-- src/particle.h | 2 +- src/particleemitter.cpp | 9 ++++----- src/particleemitter.h | 2 +- src/resources/monsterinfo.cpp | 15 +++++++++++++++ src/resources/monsterinfo.h | 8 ++++++++ src/utils/minmax.h | 21 +++++++++++++++++++++ 13 files changed, 98 insertions(+), 17 deletions(-) (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 0df6b3fc..658239ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-03-09 Philipp Sehmisch + + * src/particle.cpp, src/particle.h, src/particleemitter.cpp, + src/particleemitter.h, src/utils/minmax.h: Implemented possibility + to rotate particle emitters. + * src/being.cpp, src/being.h, src/monster.cpp, src/monster.h, + src/net/beinghandler.cpp, src/resources/monsterinfo.cpp, + src/resources/monsterinfo.h: Implemented interpretation of the + attacktype parameter of attack messages and visualize monster attacks + other than id 1 with a particle effect. Prepared to get attack particle + effects and animation types from the monster database. + 2008-03-06 David Athay * src/net/guildhandler.cpp, src/net/guildhandler.hpp: Fixed diff --git a/src/being.cpp b/src/being.cpp index 20684d8d..a55158c6 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -373,7 +373,7 @@ Being::controlParticle(Particle *particle) } void -Being::setAction(Action action) +Being::setAction(Action action, int attackType) { SpriteAction currentAction = ACTION_INVALID; switch (action) diff --git a/src/being.h b/src/being.h index a2d977db..0b56994e 100644 --- a/src/being.h +++ b/src/being.h @@ -262,7 +262,7 @@ class Being : public Sprite * Sets the current action. */ virtual void - setAction(Action action); + setAction(Action action, int attackType = 0); /** * Returns the direction the being is facing. diff --git a/src/monster.cpp b/src/monster.cpp index ae749017..5fbcfaea 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -25,6 +25,7 @@ #include "animatedsprite.h" #include "game.h" +#include "particle.h" #include "sound.h" #include "resources/monsterdb.h" @@ -50,9 +51,11 @@ Monster::getType() const } void -Monster::setAction(Action action) +Monster::setAction(Action action, int attackType) { SpriteAction currentAction = ACTION_INVALID; + int rotation = 0; + std::string particleEffect; switch (action) { @@ -64,8 +67,26 @@ Monster::setAction(Action action) sound.playSfx(getInfo().getSound(MONSTER_EVENT_DIE)); break; case ATTACK: - currentAction = ACTION_ATTACK; - mSprites[BASE_SPRITE]->reset(); + currentAction = getInfo().getAttackAction(attackType); + + //attack particle effect + particleEffect = getInfo().getAttackParticleEffect(attackType); + if (particleEffect != "") + { + switch (mDirection) + { + case DOWN: rotation = 0; break; + case LEFT: rotation = 90; break; + case UP: rotation = 180; break; + case RIGHT: rotation = 270; break; + default: break; + } + mSprites[BASE_SPRITE]->reset(); + Particle *p; + p = particleEngine->addEffect( + particleEffect, 0, 0, rotation); + controlParticle(p); + } break; case STAND: currentAction = ACTION_STAND; diff --git a/src/monster.h b/src/monster.h index fc46e11a..585f6f09 100644 --- a/src/monster.h +++ b/src/monster.h @@ -33,7 +33,7 @@ class Monster : public Being public: Monster(Uint16 id, Uint16 job, Map *map); - virtual void setAction(Action action); + virtual void setAction(Action action, int attackType); virtual Type getType() const; diff --git a/src/net/beinghandler.cpp b/src/net/beinghandler.cpp index 3e55cce9..05795cb1 100644 --- a/src/net/beinghandler.cpp +++ b/src/net/beinghandler.cpp @@ -569,10 +569,11 @@ void BeingHandler::handleBeingsMoveMessage(MessageIn &msg) void BeingHandler::handleBeingAttackMessage(MessageIn &msg) { Being *being = beingManager->findBeing(msg.readInt16()); + int direction = msg.readInt8(); + int attackType = msg.readInt8(); + if (!being) return; - being->setAction(Being::ATTACK); - int direction = msg.readInt8(); switch (direction) { case DIRECTION_UP: being->setDirection(Being::UP); break; @@ -580,6 +581,10 @@ void BeingHandler::handleBeingAttackMessage(MessageIn &msg) case DIRECTION_LEFT: being->setDirection(Being::LEFT); break; case DIRECTION_RIGHT: being->setDirection(Being::RIGHT); break; } + + logger->log("Attacktype: %d", attackType); + + being->setAction(Being::ATTACK, attackType); } void BeingHandler::handleBeingsDamageMessage(MessageIn &msg) diff --git a/src/particle.cpp b/src/particle.cpp index dac8c62e..11d91b47 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -212,7 +212,7 @@ Particle::update() Particle* Particle::addEffect(const std::string &particleEffectFile, - int pixelX, int pixelY) + int pixelX, int pixelY, int rotation) { Particle *newParticle = NULL; @@ -294,7 +294,7 @@ Particle::addEffect(const std::string &particleEffectFile, continue; ParticleEmitter *newEmitter; - newEmitter = new ParticleEmitter(emitterNode, newParticle, mMap); + newEmitter = new ParticleEmitter(emitterNode, newParticle, mMap, rotation); newParticle->addEmitter(newEmitter); } diff --git a/src/particle.h b/src/particle.h index 0dd34065..1859fe62 100644 --- a/src/particle.h +++ b/src/particle.h @@ -109,7 +109,7 @@ class Particle : public Sprite */ Particle* addEffect(const std::string &particleEffectFile, - int pixelX, int pixelY); + int pixelX, int pixelY, int rotation = 0); /** * Creates a standalone text particle. diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp index 6f66b632..f03490ac 100644 --- a/src/particleemitter.cpp +++ b/src/particleemitter.cpp @@ -38,7 +38,7 @@ #define SIN45 0.707106781f #define DEG_RAD_FACTOR 0.017453293f -ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map): +ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map, int rotation): mParticleImage(0) { mMap = map; @@ -98,14 +98,13 @@ ParticleEmitter::ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map * else if (name == "horizontal-angle") { mParticleAngleHorizontal = readMinMax(propertyNode, 0.0f); - mParticleAngleHorizontal.minVal *= DEG_RAD_FACTOR; - mParticleAngleHorizontal.maxVal *= DEG_RAD_FACTOR; + mParticleAngleHorizontal += rotation; + mParticleAngleHorizontal *= DEG_RAD_FACTOR; } else if (name == "vertical-angle") { mParticleAngleVertical = readMinMax(propertyNode, 0.0f); - mParticleAngleVertical.minVal *= DEG_RAD_FACTOR; - mParticleAngleVertical.maxVal *= DEG_RAD_FACTOR; + mParticleAngleVertical *= DEG_RAD_FACTOR; } else if (name == "power") { diff --git a/src/particleemitter.h b/src/particleemitter.h index c9524488..f5ca6232 100644 --- a/src/particleemitter.h +++ b/src/particleemitter.h @@ -45,7 +45,7 @@ class ParticleEmitter /** * Constructor. */ - ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map); + ParticleEmitter(xmlNodePtr emitterNode, Particle *target, Map *map, int rotation = 0); /** * Copy Constructor (necessary for reference counting of particle images) diff --git a/src/resources/monsterinfo.cpp b/src/resources/monsterinfo.cpp index 0a7e18dc..0ee08e42 100644 --- a/src/resources/monsterinfo.cpp +++ b/src/resources/monsterinfo.cpp @@ -70,3 +70,18 @@ MonsterInfo::getSound(MonsterSoundEvent event) const return i->second->at(rand()%i->second->size()); } } + +const std::string & +MonsterInfo::getAttackParticleEffect(int attackType) const +{ + static std::string something("graphics/particles/attack.particle.xml"); + static std::string nothing(""); + + if (attackType > 1) return something; else return nothing; +} + +SpriteAction +MonsterInfo::getAttackAction(int attackType) const +{ + return ACTION_ATTACK; +} diff --git a/src/resources/monsterinfo.h b/src/resources/monsterinfo.h index 3034f10e..3dd18c0f 100644 --- a/src/resources/monsterinfo.h +++ b/src/resources/monsterinfo.h @@ -83,6 +83,14 @@ class MonsterInfo std::string getSound(MonsterSoundEvent event) const; + const std::string & + getAttackParticleEffect(int attackType) const; + + SpriteAction + getAttackAction(int attackType) const; + + + private: std::string mName; std::string mSprite; diff --git a/src/utils/minmax.h b/src/utils/minmax.h index 427c5da7..353c60e7 100644 --- a/src/utils/minmax.h +++ b/src/utils/minmax.h @@ -40,6 +40,27 @@ template struct MinMax set(val, val); } + bool operator+= (T arg) + { + minVal += arg; + maxVal += arg; + return true; + } + + bool operator-= (T arg) + { + minVal -= arg; + maxVal -= arg; + return true; + } + + bool operator*= (T arg) + { + minVal *= arg; + maxVal *= arg; + return true; + } + T value() { return (T)(minVal + (maxVal - minVal) * (rand() / ((double) RAND_MAX + 1))); -- cgit v1.2.3-70-g09d2 From fa8b0a19084c0c2d369cda199b87c03fe838fa79 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Sun, 23 Mar 2008 22:41:21 +0000 Subject: Merged revisions 3828-3829,3831-3838,3841,3843-3844,3847-3872,3874,3876-3900 via svnmerge from https://themanaworld.svn.sourceforge.net/svnroot/themanaworld/tmw/branches/0.0 ........ r3828 | crush_tmw | 2007-12-31 17:14:27 +0100 (Mon, 31 Dec 2007) | 1 line Added config options to set the scroll center. Retained scroll offset during map change for smoother map transitions. ........ r3859 | b_lindeijer | 2008-01-26 20:38:43 +0100 (Sat, 26 Jan 2008) | 3 lines Fixed a GCC 4.3 compile error and constified the usage of auto_ptr, since that's the way in which we are using them. ........ r3876 | crush_tmw | 2008-02-11 20:00:43 +0100 (Mon, 11 Feb 2008) | 1 line Added music and overlay to snake dungeon. ........ r3883 | crush_tmw | 2008-02-12 15:00:22 +0100 (Tue, 12 Feb 2008) | 1 line Particle emitters are now activated after the parent particle has moved instead of before (small change which allows a little trick to create polar emitters) ........ r3887 | umperio | 2008-02-12 20:49:37 +0100 (Tue, 12 Feb 2008) | 1 line Made pathfinding not halt on collision destination tile, made moving around with mouse smoother. Added possibility to pass through players with key controls. ........ r3888 | crush_tmw | 2008-02-13 21:49:55 +0100 (Wed, 13 Feb 2008) | 1 line Added new headgears by Black Don (thanks to QOAL for testing and implementation) ........ r3891 | umperio | 2008-02-18 09:52:06 +0100 (Mon, 18 Feb 2008) | 1 line Fixed image name. ........ r3892 | umperio | 2008-02-18 11:00:45 +0100 (Mon, 18 Feb 2008) | 1 line Forgot a %s ........ r3899 | crush_tmw | 2008-02-19 14:23:34 +0100 (Tue, 19 Feb 2008) | 1 line Map fixes at snake dungeon by QOAL ........ r3900 | crush_tmw | 2008-02-19 14:32:24 +0100 (Tue, 19 Feb 2008) | 1 line More map fixes at snake dungeon by QOAL ........ --- ChangeLog | 43 +++++++++++++++++++++++++++++++--- src/being.cpp | 6 +++++ src/game.h | 2 +- src/gui/trade.h | 1 - src/gui/viewport.cpp | 59 ++++++++++++++++++++++------------------------- src/gui/viewport.h | 18 ++++++++++----- src/localplayer.h | 4 +++- src/map.h | 19 +++++++-------- src/net/playerhandler.cpp | 15 +++++++++--- src/particle.cpp | 41 ++++++++++++++++---------------- src/player.h | 18 ++++++++------- src/sound.cpp | 3 ++- src/utils/strprintf.cpp | 2 +- 13 files changed, 146 insertions(+), 85 deletions(-) (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 755ad5d9..696024f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -134,19 +134,53 @@ * src/gui/gui.cpp: Showing a visible error message to the user when the font file can't be found. +2008-02-19 Philipp Sehmisch + + * data/maps/new_22-1.tmx: Map fixes at snake dungeon by QOAL. + 2008-02-18 Bjørn Lindeijer * INSTALL: Added notes about installing gettext and cvs and updated required ENet version to 1.2. +2008-02-18 Eugenio Favalli + + * data/graphics/sprites/hairstyle7-female.xml, src/sound.cpp, + src/utils/strprintf.cpp, tmw.cbp: Fixed image name. + 2008-02-13 Philipp Sehmisch + * data/equipment.xml, data/items.xml, + data/graphics/items/armor-head-crusaderhelm.png, + data/graphics/items/armor-head-infantryhelm.png, + data/graphics/items/armor-head-knighthelm.png, + data/graphics/items/armor-head-warlordhelm.png, + data/graphics/sprites/head-crusaderhelm.png, + data/graphics/sprites/head-infantryhelm.png, + data/graphics/sprites/head-knighthelm.png, + data/graphics/sprites/head-warlordhelm.png, + data/graphics/sprites/head-crusaderhelm.xml, + data/graphics/sprites/head-infantryhelm.xml, + data/graphics/sprites/head-knighthelm.xml, + data/graphics/sprites/head-warlordhelm.xml: Added new headgears by + Black Don (thanks to QOAL for testing and implementation) * data/monsters.xml: Converted movement speed to pixels per second. 2008-02-12 Philipp Sehmisch * data/monsters.xml: Added size and speed to the first four monsters. +2008-02-12 Dennis Friis + + * src/localplayer.cpp, src/map.cpp, src/gui/viewport.cpp, src/being.cpp + src/map.h: Made pathfinding not halt on collision destination tile, + made moving around with mouse smoother. Added possibility to pass + through players with key controls. + +2008-02-11 Philipp Sehmisch + + * data/maps/new_22-1.tmx: Added music and overlay to snake dungeon. + 2008-02-10 Philipp Sehmisch * data/maps/new_23-1.tmx: Added Dimonds Cove outdoor map by MerlinX420. @@ -160,9 +194,6 @@ 2008-02-07 Philipp Sehmisch * src/gui/skill.cpp: Fixed unix compilation problem. - -2008-02-07 Philipp Sehmisch - * data/monsters.xml: Added different behaviors to maggots, scorpions, red scorpions and green slimes. @@ -196,6 +227,9 @@ * src/gui/truetypefont.cpp: Image alpha should also be set to 1, in case it was changed before. * src/gui/truetypefont.h: Corrected documentation. + * src/game.h, src/localplayer.h: Fixed a GCC 4.3 compile error and + constified the usage of auto_ptr, since that's the way in which we are + using them. 2008-01-26 Philipp Sehmisch @@ -280,6 +314,9 @@ * src/game.cpp, src/beingmanager.cpp, src/beingmanager.h, src/keyboardconfig.cpp, src/keyboardconfig.h: Added a key for targeting the nearest player character based on patches by Trinexx. + * src/gui/viewport.cpp: Added config options to set the scroll center. + * src/gui/viewport.h, src/net/playerhandler.cpp: Retained scroll + offset during map change for smoother map transitions. 2007-12-28 Philipp Sehmisch diff --git a/src/being.cpp b/src/being.cpp index b187d28a..5a877d85 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -500,6 +500,12 @@ Being::nextStep() setDirection(dir); + if (!mMap->getWalk(node.x / 32, node.y / 32)) + { + setAction(STAND); + return; + } + setPositionInPixels(node.x, node.y); setAction(WALK); mWalkTime += mStepTime / 10; diff --git a/src/game.h b/src/game.h index 3b27660a..28feae44 100644 --- a/src/game.h +++ b/src/game.h @@ -59,7 +59,7 @@ class Game : public ConfigListener /** The minimum frame time (used for frame limiting). */ int mMinFrameTime; - typedef std::auto_ptr MessageHandlerPtr; + typedef const std::auto_ptr MessageHandlerPtr; MessageHandlerPtr mBeingHandler; MessageHandlerPtr mBuySellHandler; MessageHandlerPtr mChatHandler; diff --git a/src/gui/trade.h b/src/gui/trade.h index b5b0db6a..cd943a41 100644 --- a/src/gui/trade.h +++ b/src/gui/trade.h @@ -92,7 +92,6 @@ class TradeWindow : public Window, gcn::ActionListener, SelectionListener void action(const gcn::ActionEvent &event); private: - enum Status { PREPARING, /**< Players are adding items. */ diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index d6c49fb2..7c68b577 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -52,8 +52,6 @@ Viewport::Viewport(): mMap(0), mViewX(0.0f), mViewY(0.0f), - mCameraX(0), - mCameraY(0), mShowDebugPath(false), mPlayerFollowMouse(false) { @@ -62,6 +60,8 @@ Viewport::Viewport(): mScrollLaziness = (int) config.getValue("ScrollLaziness", 32); mScrollRadius = (int) config.getValue("ScrollRadius", 32); + mScrollCenterOffsetX = (int) config.getValue("ScrollCenterOffsetX", 0); + mScrollCenterOffsetY = (int) config.getValue("ScrollCenterOffsetY", 0); config.addListener("ScrollLaziness", this); config.addListener("ScrollRadius", this); @@ -150,8 +150,8 @@ Viewport::draw(gcn::Graphics *gcnGraphics) } // Calculate viewpoint - int midTileX = graphics->getWidth() / 2; - int midTileY = graphics->getHeight() / 2; + int midTileX = (graphics->getWidth() + mScrollCenterOffsetX) / 2; + int midTileY = (graphics->getHeight() + mScrollCenterOffsetX) / 2; int player_x = player_node->mX - midTileX + player_node->getXOffset(); int player_y = player_node->mY - midTileY + player_node->getYOffset(); @@ -211,19 +211,16 @@ Viewport::draw(gcn::Graphics *gcnGraphics) } } - mCameraX = (int) mViewX; - mCameraY = (int) mViewY; - // Draw tiles and sprites if (mMap) { - mMap->draw(graphics, mCameraX, mCameraY, 0); + mMap->draw(graphics, (int) mViewX, (int) mViewY, 0); drawTargetCursor(graphics); - mMap->draw(graphics, mCameraX, mCameraY, 1); - mMap->draw(graphics, mCameraX, mCameraY, 2); + mMap->draw(graphics, (int) mViewX, (int) mViewY, 1); + mMap->draw(graphics, (int) mViewX, (int) mViewY, 2); if (mShowDebugPath) { - mMap->drawCollision(graphics, mCameraX, mCameraY); + mMap->drawCollision(graphics, (int) mViewX, (int) mViewY); } mMap->drawOverlay(graphics, mViewX, mViewY, (int) config.getValue("OverlayDetail", 2)); @@ -239,9 +236,9 @@ Viewport::draw(gcn::Graphics *gcnGraphics) Beings &beings = beingManager->getAll(); for (BeingIterator i = beings.begin(); i != beings.end(); i++) { - (*i)->drawSpeech(graphics, -mCameraX, -mCameraY); - (*i)->drawName(graphics, -mCameraX, -mCameraY); - (*i)->drawEmotion(graphics, -mCameraX, -mCameraY); + (*i)->drawSpeech(graphics, -(int) mViewX, -(int) mViewY); + (*i)->drawName(graphics, -(int) mViewX, -(int) mViewY); + (*i)->drawEmotion(graphics, -(int) mViewX, -(int) mViewY); } // Draw contained widgets @@ -262,8 +259,8 @@ Viewport::logic() if (mPlayerFollowMouse && button & SDL_BUTTON(1) && mWalkTime != player_node->mWalkTime) { - player_node->setDestination(mouseX + mCameraX, - mouseY + mCameraY); + player_node->setDestination(mouseX + (int) mViewX, + mouseY + (int) mViewY); mWalkTime = player_node->mWalkTime; } @@ -301,9 +298,9 @@ Viewport::drawTargetCursor(Graphics *graphics) // Draw the target cursor at the correct position int posX = target->getPixelX() + 16 - - targetCursor->getWidth() / 2 - mCameraX; + targetCursor->getWidth() / 2 - (int) mViewX; int posY = target->getPixelY() + 16 - - targetCursor->getHeight() / 2 - mCameraY; + targetCursor->getHeight() / 2 - (int) mViewY; graphics->drawImage(targetCursor, posX, posY); } @@ -320,8 +317,8 @@ Viewport::drawTargetName(Graphics *graphics) graphics->setColor(gcn::Color(255, 32, 32)); const MonsterInfo &mi = static_cast(target)->getInfo(); - int posX = target->getPixelX() + 16 - mCameraX; - int posY = target->getPixelY() + 16 - target->getHeight() - mCameraY; + int posX = target->getPixelX() + 16 - (int) mViewX; + int posY = target->getPixelY() + 16 - target->getHeight() - (int) mViewY; graphics->drawText(mi.getName(), posX, posY, gcn::Graphics::CENTER); } @@ -334,8 +331,8 @@ Viewport::drawDebugPath(Graphics *graphics) int mouseX, mouseY; SDL_GetMouseState(&mouseX, &mouseY); - int mouseTileX = (mouseX + mCameraX) / 32; - int mouseTileY = (mouseY + mCameraY) / 32; + const int mouseTileX = (mouseX + (int) mViewX) / 32; + const int mouseTileY = (mouseY + (int) mViewY) / 32; Path debugPath = mMap->findPath( player_node->mX / 32, player_node->mY / 32, @@ -344,8 +341,8 @@ Viewport::drawDebugPath(Graphics *graphics) graphics->setColor(gcn::Color(255, 0, 0)); for (PathIterator i = debugPath.begin(); i != debugPath.end(); i++) { - int squareX = i->x * 32 - mCameraX + 12; - int squareY = i->y * 32 - mCameraY + 12; + int squareX = i->x * 32 - (int) mViewX + 12; + int squareY = i->y * 32 - (int) mViewY + 12; graphics->fillRectangle(gcn::Rectangle(squareX, squareY, 8, 8)); graphics->drawText( @@ -363,8 +360,8 @@ Viewport::mousePressed(gcn::MouseEvent &event) mPlayerFollowMouse = false; - int tilex = (event.getX() + mCameraX) / 32; - int tiley = (event.getY() + mCameraY) / 32; + const int tilex = (event.getX() + (int) mViewX) / 32; + const int tiley = (event.getY() + (int) mViewY) / 32; // Right click might open a popup if (event.getButton() == gcn::MouseEvent::RIGHT) @@ -403,14 +400,14 @@ Viewport::mousePressed(gcn::MouseEvent &event) player_node->pickUp(item); } // Just walk around - else if (mMap->getWalk(tilex, tiley, player_node->getWalkMask())) + else { // XXX XXX XXX REALLY UGLY! Uint8 *keys = SDL_GetKeyState(NULL); if (!(keys[SDLK_LSHIFT] || keys[SDLK_RSHIFT])) { - player_node->setDestination(event.getX() + mCameraX, - event.getY() + mCameraY); + player_node->setDestination(event.getX() + (int) mViewX, + event.getY() + (int) mViewY); } mPlayerFollowMouse = true; } @@ -437,8 +434,8 @@ Viewport::mouseDragged(gcn::MouseEvent &event) if (mPlayerFollowMouse && mWalkTime == player_node->mWalkTime) { - player_node->setDestination(event.getX() + mCameraX, - event.getY() + mCameraY); + player_node->setDestination(event.getX() + (int) mViewX, + event.getY() + (int) mViewY); } } diff --git a/src/gui/viewport.h b/src/gui/viewport.h index 1547c0a4..c8f7a9ec 100644 --- a/src/gui/viewport.h +++ b/src/gui/viewport.h @@ -117,16 +117,22 @@ class Viewport : public WindowContainer, public gcn::MouseListener, optionChanged(const std::string &name); /** - * Returns camera x offset in tiles. + * Returns camera x offset in pixels. */ int - getCameraX() { return mCameraX; } + getCameraX() const { return (int) mViewX; } /** - * Returns camera y offset in tiles. + * Returns camera y offset in pixels. */ int - getCameraY() { return mCameraY; } + getCameraY() const { return (int) mViewY; } + + /** + * Changes viewpoint by relative pixel coordinates. + */ + void + scrollBy(float x, float y) { mViewX += x; mViewY += y; } private: /** @@ -156,10 +162,10 @@ class Viewport : public WindowContainer, public gcn::MouseListener, int mScrollRadius; int mScrollLaziness; + int mScrollCenterOffsetX; + int mScrollCenterOffsetY; float mViewX; /**< Current viewpoint in pixels. */ float mViewY; /**< Current viewpoint in pixels. */ - int mCameraX; /**< Current viewpoint in tiles. */ - int mCameraY; /**< Current viewpoint in tiles. */ bool mShowDebugPath; /**< Show a path from player to pointer. */ /** Images of in range target cursor. */ diff --git a/src/localplayer.h b/src/localplayer.h index 9bad9436..f325e19a 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -26,6 +26,8 @@ #include "player.h" +#include + // TODO move into some sane place... #define MAX_SLOT 2 @@ -336,7 +338,7 @@ class LocalPlayer : public Player float mLastAttackTime; /**< Used to synchronize the charge dialog */ Inventory *mInventory; - std::auto_ptr mEquipment; + const std::auto_ptr mEquipment; protected: void walk(unsigned char dir); diff --git a/src/map.h b/src/map.h index 3a3945d1..126cb70b 100644 --- a/src/map.h +++ b/src/map.h @@ -57,13 +57,13 @@ struct MetaTile MetaTile():whichList(0), blockmask(0) {}; // Pathfinding members - int Fcost; /**< Estimation of total path cost */ - int Gcost; /**< Cost from start to this location */ - int Hcost; /**< Estimated cost to goal */ - int whichList; /**< No list, open list or closed list */ - int parentX; /**< X coordinate of parent tile */ - int parentY; /**< Y coordinate of parent tile */ - unsigned char blockmask; /**< Can beings walk on this tile */ + int Fcost; /**< Estimation of total path cost */ + int Gcost; /**< Cost from start to this location */ + int Hcost; /**< Estimated cost to goal */ + int whichList; /**< No list, open list or closed list */ + int parentX; /**< X coordinate of parent tile */ + int parentY; /**< Y coordinate of parent tile */ + unsigned char blockmask; /**< Blocking properties of this tile */ }; /** @@ -153,9 +153,10 @@ class Map : public Properties void freeTile(int x, int y, BlockType type); /** - * Gets walkability for a tile with a blocking bitmask + * Gets walkability for a tile with a blocking bitmask. When called + * without walkmask, only blocks against colliding tiles. */ - bool getWalk(int x, int y, char walkmask) const; + bool getWalk(int x, int y, char walkmask = BLOCKMASK_WALL) const; /** * Returns the width of this map. diff --git a/src/net/playerhandler.cpp b/src/net/playerhandler.cpp index b908eae5..ea581095 100644 --- a/src/net/playerhandler.cpp +++ b/src/net/playerhandler.cpp @@ -34,11 +34,13 @@ #include "../gui/buy.h" #include "../gui/chat.h" +#include "../gui/gui.h" #include "../gui/npclistdialog.h" #include "../gui/npc_text.h" #include "../gui/ok_dialog.h" #include "../gui/sell.h" #include "../gui/skill.h" +#include "../gui/viewport.h" // TODO Move somewhere else OkDialog *weightNotice = NULL; @@ -289,9 +291,9 @@ void PlayerHandler::handleMessage(MessageIn &msg) void PlayerHandler::handleMapChangeMessage(MessageIn &msg) { - std::string mapName = msg.readString(); - unsigned short x = msg.readInt16(); - unsigned short y = msg.readInt16(); + const std::string mapName = msg.readString(); + const unsigned short x = msg.readInt16(); + const unsigned short y = msg.readInt16(); logger->log("Changing map to %s (%d, %d)", mapName.c_str(), x, y); @@ -300,6 +302,13 @@ PlayerHandler::handleMapChangeMessage(MessageIn &msg) current_npc = 0; + const float scrollOffsetX = x - player_node->mX; + const float scrollOffsetY = y - player_node->mY; + player_node->setAction(Being::STAND); player_node->setPositionInPixels(x, y); + + logger->log("Adjust scrolling by %d,%d", (int) scrollOffsetX, + (int) scrollOffsetY); + viewport->scrollBy(scrollOffsetX, scrollOffsetY); } diff --git a/src/particle.cpp b/src/particle.cpp index 11d91b47..dcb2eed3 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -96,26 +96,7 @@ Particle::update() if (mAlive) { - // Update child emitters - if (mLifetimePast%Particle::emitterSkip == 0) - { - for ( EmitterIterator e = mChildEmitters.begin(); - e != mChildEmitters.end(); - e++ - ) - { - Particles newParticles = (*e)->createParticles(); - for ( ParticleIterator p = newParticles.begin(); - p != newParticles.end(); - p++ - ) - { - (*p)->moveBy(mPos.x, mPos.y, mPos.z); - mChildParticles.push_back (*p); - } - } - } - + //calculate particle movement if (mMomentum != 1.0f) { mVelocity *= mMomentum; @@ -187,6 +168,26 @@ Particle::update() mAlive = false; } } + + // Update child emitters + if (mLifetimePast%Particle::emitterSkip == 0) + { + for ( EmitterIterator e = mChildEmitters.begin(); + e != mChildEmitters.end(); + e++ + ) + { + Particles newParticles = (*e)->createParticles(); + for ( ParticleIterator p = newParticles.begin(); + p != newParticles.end(); + p++ + ) + { + (*p)->moveBy(mPos.x, mPos.y, mPos.z); + mChildParticles.push_back (*p); + } + } + } } // Update child particles diff --git a/src/player.h b/src/player.h index 76d6b460..4949783e 100644 --- a/src/player.h +++ b/src/player.h @@ -101,34 +101,36 @@ class Player : public Being void removeGuild(int id); /** - * Returns a pointer to the specified guild + * Returns a pointer to the specified guild. */ Guild* getGuild(const std::string &guildName); /** - * Returns a pointer to the guild with matching id + * Returns a pointer to the guild with matching id. */ Guild* getGuild(int id); /** - * Get number of guilds the player belongs to + * Get number of guilds the player belongs to. */ short getNumberOfGuilds(); /** - * Gets the way the character is blocked by other objects + * Gets the way the character is blocked by other objects. */ virtual unsigned char getWalkMask() const - { return 0x82; } // blocked by walls and monsters ( bin 1000 0010) + { return 0x82; } // blocked by walls and monsters (bin 1000 0010) protected: - // Character guild information - std::map mGuilds; /** - * Gets the way the monster blocks pathfinding for other objects + * Gets the way the monster blocks pathfinding for other objects. */ virtual Map::BlockType getBlockType() const { return Map::BLOCKTYPE_CHARACTER; } + + // Character guild information + std::map mGuilds; + private: Gender mGender; Uint8 mHairStyle; diff --git a/src/sound.cpp b/src/sound.cpp index 063195ae..0a20d3f2 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -145,7 +145,8 @@ void Sound::playMusic(const std::string &filename, int loop) Mix_PlayMusic(mMusic, loop); } else { - logger->log("Sound::startMusic() Warning: error loading file."); + logger->log("Sound::startMusic() Warning: error loading file: %s", + Mix_GetError()); } } diff --git a/src/utils/strprintf.cpp b/src/utils/strprintf.cpp index 27dd5462..26313fe9 100644 --- a/src/utils/strprintf.cpp +++ b/src/utils/strprintf.cpp @@ -22,7 +22,7 @@ */ #ifndef _TMW_UTILS_TOSTRING_H -#define _TMW_UTISL_TOSTRING_H +#define _TMW_UTILS_TOSTRING_H #include -- cgit v1.2.3-70-g09d2 From 64d58b9a7e057e6d829107678b1570082be1093f Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Mon, 7 Apr 2008 08:37:23 +0000 Subject: Added XML::Document class which simplifies parsing an XML document and automatically cleans it up again. --- ChangeLog | 9 ++ src/particle.cpp | 30 +---- src/resources/itemdb.cpp | 22 +--- src/resources/mapreader.cpp | 14 +-- src/resources/monsterdb.cpp | 29 +---- src/resources/npcdb.cpp | 285 +++++++++++++++++++++----------------------- src/resources/npcdb.h | 112 ++++++++--------- src/resources/spritedef.cpp | 32 ++--- src/resources/spritedef.h | 6 +- src/utils/xml.cpp | 36 ++++++ src/utils/xml.h | 37 ++++++ 11 files changed, 303 insertions(+), 309 deletions(-) (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 6c989157..958c6a7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-04-07 Bjørn Lindeijer + + * src/particle.cpp, src/utils/xml.cpp, src/utils/xml.h, + src/resources/mapreader.cpp, src/resources/spritedef.cpp, + src/resources/npcdb.h, src/resources/monsterdb.cpp, + src/resources/itemdb.cpp, src/resources/npcdb.cpp, + src/resources/spritedef.h: Added XML::Document class which simplifies + parsing an XML document and automatically cleans it up again. + 2008-04-03 Philipp Sehmisch * src/localplayer.cpp: Spawning a particle effect whenever the client diff --git a/src/particle.cpp b/src/particle.cpp index dcb2eed3..ba5386f6 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -217,35 +217,17 @@ Particle::addEffect(const std::string &particleEffectFile, { Particle *newParticle = NULL; - // XML parser initialisation stuff - int size; - ResourceManager *resman = ResourceManager::getInstance(); - char *data = (char*) resman->loadFile(particleEffectFile.c_str(), size); - - if (!data) { - logger->log("Warning: Particle engine could not find %s !", - particleEffectFile.c_str()); - return NULL; - } - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); + XML::Document doc(particleEffectFile); + xmlNodePtr rootNode = doc.rootNode(); - if (!doc) { - logger->log("Warning: Particle engine found syntax error in %s!", - particleEffectFile.c_str()); - return NULL; - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "effect")) { - logger->log("Warning: %s is not a valid particle effect definition file!", - particleEffectFile.c_str()); - xmlFreeDoc(doc); + logger->log("Error loading particle: %s", particleEffectFile.c_str()); return NULL; } + ResourceManager *resman = ResourceManager::getInstance(); + // Parse particles for_each_xml_child_node(effectChildNode, rootNode) { @@ -302,8 +284,6 @@ Particle::addEffect(const std::string &particleEffectFile, mChildParticles.push_back(newParticle); } - xmlFreeDoc(doc); - return newParticle; } diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index d507987a..ada9482f 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -103,26 +103,12 @@ void ItemDB::load() mUnknown->setSprite("error.xml", GENDER_MALE); mUnknown->setSprite("error.xml", GENDER_FEMALE); - ResourceManager *resman = ResourceManager::getInstance(); - int size; - char *data = (char*) resman->loadFile("items.xml", size); + XML::Document doc("items.xml"); + xmlNodePtr rootNode = doc.rootNode(); - if (!data) { - logger->error("ItemDB: Could not find items.xml!"); - } - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); - - if (!doc) - { - logger->error("ItemDB: Error while parsing item database (items.xml)!"); - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "items")) { - logger->error("ItemDB: items.xml is not a valid database file!"); + logger->error("ItemDB: Error while loading items.xml!"); } for_each_xml_child_node(node, rootNode) @@ -200,8 +186,6 @@ void ItemDB::load() #undef CHECK_PARAM } - xmlFreeDoc(doc); - mLoaded = true; } diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index a07fc18d..3864580b 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -183,21 +183,19 @@ MapReader::readMap(const std::string &filename) inflatedSize = fileSize; } - xmlDocPtr doc = xmlParseMemory((char*) inflated, inflatedSize); + XML::Document doc((char*) inflated, inflatedSize); free(inflated); - // Parse the inflated map data - if (doc) { - xmlNodePtr node = xmlDocGetRootElement(doc); + xmlNodePtr node = doc.rootNode(); - if (!node || !xmlStrEqual(node->name, BAD_CAST "map")) { + // Parse the inflated map data + if (node) { + if (!xmlStrEqual(node->name, BAD_CAST "map")) { logger->log("Error: Not a map file (%s)!", filename.c_str()); } - else - { + else { map = readMap(node, filename); } - xmlFreeDoc(doc); } else { logger->log("Error while parsing map file (%s)!", filename.c_str()); } diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index e7e855fa..f531a41d 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -51,27 +51,12 @@ MonsterDB::load() logger->log("Initializing monster database..."); - ResourceManager *resman = ResourceManager::getInstance(); - int size; - char *data = (char*)resman->loadFile("monsters.xml", size); + XML::Document doc("monsters.xml"); + xmlNodePtr rootNode = doc.rootNode(); - if (!data) - { - logger->error("Monster Database: Could not find monsters.xml!"); - } - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); - - if (!doc) - { - logger->error("Monster Database: Error while parsing monster database (monsters.xml)!"); - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "monsters")) { - logger->error("Monster Database: monster.xml is not a valid database file!"); + logger->error("Monster Database: Error while loading monster.xml!"); } //iterate s @@ -161,16 +146,14 @@ MonsterDB::load() mMonsterInfos[XML::getProperty(monsterNode, "id", 0)] = currentInfo; } - xmlFreeDoc(doc); - mLoaded = true; } void MonsterDB::unload() { - for_each ( mMonsterInfos.begin(), mMonsterInfos.end(), - make_dtor(mMonsterInfos)); + for_each(mMonsterInfos.begin(), mMonsterInfos.end(), + make_dtor(mMonsterInfos)); mMonsterInfos.clear(); mLoaded = false; @@ -178,7 +161,7 @@ MonsterDB::unload() const MonsterInfo& -MonsterDB::get (int id) +MonsterDB::get(int id) { MonsterInfoIterator i = mMonsterInfos.find(id); diff --git a/src/resources/npcdb.cpp b/src/resources/npcdb.cpp index e60431c3..6c205bc9 100644 --- a/src/resources/npcdb.cpp +++ b/src/resources/npcdb.cpp @@ -1,151 +1,134 @@ -/* - * The Mana World - * Copyright 2008 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: monsterdb.cpp 3999 2008-03-23 01:27:13Z b_lindeijer $ - */ - -#include "npcdb.h" - -#include "resourcemanager.h" - -#include "../log.h" - -#include "../utils/dtor.h" -#include "../utils/xml.h" - -namespace -{ - NPCInfos mNPCInfos; - NPCInfo mUnknown; - bool mLoaded = false; -} - -void NPCDB::load() -{ - if (mLoaded) - return; - - NPCsprite *unknownSprite = new NPCsprite; - unknownSprite->sprite = "error.xml"; - unknownSprite->variant = 0; - mUnknown.push_back(unknownSprite); - - logger->log("Initializing NPC database..."); - - ResourceManager *resman = ResourceManager::getInstance(); - int size; - char *data = (char*)resman->loadFile("npcs.xml", size); - - if (!data) - { - logger->error("NPC Database: Could not find npcs.xml!"); - } - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); - - if (!doc) - { - logger->error("NPC Database: Error while parsing NPC database (npcs.xml)!"); - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); - if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "npcs")) - { - logger->error("NPC Database: npcs.xml is not a valid database file!"); - } - - //iterate s - for_each_xml_child_node(npcNode, rootNode) - { - if (!xmlStrEqual(npcNode->name, BAD_CAST "npc")) - continue; - - int id = XML::getProperty(npcNode, "id", 0); - if (id == 0) - { - logger->log("NPC Database: NPC with missing ID in npcs.xml!"); - continue; - } - - NPCInfo *currentInfo = new NPCInfo; - - for_each_xml_child_node(spriteNode, npcNode) - { - if (!xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) - continue; - - NPCsprite *currentSprite = new NPCsprite; - currentSprite->sprite = (const char*)spriteNode->xmlChildrenNode->content; - currentSprite->variant = XML::getProperty(spriteNode, "variant", 0); - currentInfo->push_back(currentSprite); - } - - mNPCInfos[id] = currentInfo; - - } - - xmlFreeDoc(doc); - - mLoaded = true; -} - -void -NPCDB::unload() -{ - for ( NPCInfosIterator i = mNPCInfos.begin(); - i != mNPCInfos.end(); - i++) - { - while (!i->second->empty()) - { - delete i->second->front(); - i->second->pop_front(); - } - delete i->second; - } - - mNPCInfos.clear(); - - while (!mUnknown.empty()) - { - delete mUnknown.front(); - mUnknown.pop_front(); - } - - mLoaded = false; -} - -const NPCInfo& -NPCDB::get (int id) -{ - NPCInfosIterator i = mNPCInfos.find(id); - - if (i == mNPCInfos.end()) - { - logger->log("NPCDB: Warning, unknown NPC ID %d requested", id); - return mUnknown; - } - else - { - return *(i->second); - } -} - +/* + * The Mana World + * Copyright 2008 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: monsterdb.cpp 3999 2008-03-23 01:27:13Z b_lindeijer $ + */ + +#include "npcdb.h" + +#include "resourcemanager.h" + +#include "../log.h" + +#include "../utils/dtor.h" +#include "../utils/xml.h" + +namespace +{ + NPCInfos mNPCInfos; + NPCInfo mUnknown; + bool mLoaded = false; +} + +void NPCDB::load() +{ + if (mLoaded) + return; + + NPCsprite *unknownSprite = new NPCsprite; + unknownSprite->sprite = "error.xml"; + unknownSprite->variant = 0; + mUnknown.push_back(unknownSprite); + + logger->log("Initializing NPC database..."); + + XML::Document doc("npcs.xml"); + xmlNodePtr rootNode = doc.rootNode(); + + if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "npcs")) + { + logger->error("NPC Database: Error while loading items.xml!"); + } + + //iterate s + for_each_xml_child_node(npcNode, rootNode) + { + if (!xmlStrEqual(npcNode->name, BAD_CAST "npc")) + continue; + + int id = XML::getProperty(npcNode, "id", 0); + if (id == 0) + { + logger->log("NPC Database: NPC with missing ID in npcs.xml!"); + continue; + } + + NPCInfo *currentInfo = new NPCInfo; + + for_each_xml_child_node(spriteNode, npcNode) + { + if (!xmlStrEqual(spriteNode->name, BAD_CAST "sprite")) + continue; + + NPCsprite *currentSprite = new NPCsprite; + currentSprite->sprite = (const char*)spriteNode->xmlChildrenNode->content; + currentSprite->variant = XML::getProperty(spriteNode, "variant", 0); + currentInfo->push_back(currentSprite); + } + + mNPCInfos[id] = currentInfo; + + } + + mLoaded = true; +} + +void +NPCDB::unload() +{ + for ( NPCInfosIterator i = mNPCInfos.begin(); + i != mNPCInfos.end(); + i++) + { + while (!i->second->empty()) + { + delete i->second->front(); + i->second->pop_front(); + } + delete i->second; + } + + mNPCInfos.clear(); + + while (!mUnknown.empty()) + { + delete mUnknown.front(); + mUnknown.pop_front(); + } + + mLoaded = false; +} + +const NPCInfo& +NPCDB::get(int id) +{ + NPCInfosIterator i = mNPCInfos.find(id); + + if (i == mNPCInfos.end()) + { + logger->log("NPCDB: Warning, unknown NPC ID %d requested", id); + return mUnknown; + } + else + { + return *(i->second); + } +} + diff --git a/src/resources/npcdb.h b/src/resources/npcdb.h index 30431e59..3b2acd89 100644 --- a/src/resources/npcdb.h +++ b/src/resources/npcdb.h @@ -1,56 +1,56 @@ -/* - * The Mana World - * Copyright 2008 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: monsterdb.h 3456 2007-08-13 21:09:12Z gmelquio $ - */ - -#ifndef _TMW_NPC_DB_H -#define _TMW_NPC_DB_H - -#include -#include -#include - -struct NPCsprite -{ - std::string sprite; - int variant; -}; - -typedef std::list NPCInfo; -typedef std::map NPCInfos; - -/** - * NPC information database. - */ -namespace NPCDB -{ - void - load(); - - void - unload(); - - const NPCInfo& get(int id); - - typedef NPCInfos::iterator NPCInfosIterator; -} - -#endif +/* + * The Mana World + * Copyright 2008 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: monsterdb.h 3456 2007-08-13 21:09:12Z gmelquio $ + */ + +#ifndef _TMW_NPC_DB_H +#define _TMW_NPC_DB_H + +#include +#include +#include + +struct NPCsprite +{ + std::string sprite; + int variant; +}; + +typedef std::list NPCInfo; +typedef std::map NPCInfos; + +/** + * NPC information database. + */ +namespace NPCDB +{ + void + load(); + + void + unload(); + + const NPCInfo& get(int id); + + typedef NPCInfos::iterator NPCInfosIterator; +} + +#endif diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp index d8dfb23d..1662e2ac 100644 --- a/src/resources/spritedef.cpp +++ b/src/resources/spritedef.cpp @@ -51,7 +51,6 @@ SpriteDef::getAction(SpriteAction action) const SpriteDef *SpriteDef::load(std::string const &animationFile, int variant) { - int size; ResourceManager *resman = ResourceManager::getInstance(); std::string::size_type pos = animationFile.find('|'); @@ -59,27 +58,18 @@ SpriteDef *SpriteDef::load(std::string const &animationFile, int variant) if (pos != std::string::npos) palettes = animationFile.substr(pos + 1); - char *data = (char*) resman->loadFile - (animationFile.substr(0, pos).c_str(), size); + XML::Document doc(animationFile.substr(0, pos)); + xmlNodePtr rootNode = doc.rootNode(); - if (!data && animationFile != "graphics/sprites/error.xml") - return load("graphics/sprites/error.xml", 0); - - xmlDocPtr doc = xmlParseMemory(data, size); - free(data); - - if (!doc) - { - logger->log("Error, failed to parse %s.", animationFile.c_str()); - return NULL; - } - - xmlNodePtr rootNode = xmlDocGetRootElement(doc); if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "sprite")) { - logger->log("Error, failed to parse %s.", animationFile.c_str()); - xmlFreeDoc(doc); - return NULL; + logger->log("Error, failed to parse %s", animationFile.c_str()); + + if (animationFile != "graphics/sprites/error.xml") { + return load("graphics/sprites/error.xml", 0); + } else { + return NULL; + } } // Get the variant @@ -109,8 +99,6 @@ SpriteDef *SpriteDef::load(std::string const &animationFile, int variant) } } - xmlFreeDoc(doc); - def->substituteActions(); return def; } @@ -277,7 +265,7 @@ SpriteDef::loadAnimation(xmlNodePtr animationNode, void SpriteDef::includeSprite(xmlNodePtr includeNode) { - std::string filename = XML::getProperty(includeNode, "file", ""); + const std::string filename = XML::getProperty(includeNode, "file", ""); ResourceManager *resman = ResourceManager::getInstance(); SpriteDef *sprite = resman->getSprite("graphics/sprites/" + filename); diff --git a/src/resources/spritedef.h b/src/resources/spritedef.h index 65105973..c94e38f6 100644 --- a/src/resources/spritedef.h +++ b/src/resources/spritedef.h @@ -97,11 +97,10 @@ class SpriteDef : public Resource makeSpriteAction(const std::string &action); private: - /** * Constructor. */ - SpriteDef(): mAction(NULL), mDirection(DIRECTION_DOWN), mLastTime(0) {} + SpriteDef() {} /** * Destructor. @@ -159,9 +158,6 @@ class SpriteDef : public Resource ImageSets mImageSets; Actions mActions; - Action *mAction; - SpriteDirection mDirection; - int mLastTime; }; #endif diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp index e30450f0..98b474cb 100644 --- a/src/utils/xml.cpp +++ b/src/utils/xml.cpp @@ -22,9 +22,45 @@ */ #include "xml.h" +#include "../log.h" +#include "../resources/resourcemanager.h" namespace XML { + Document::Document(const std::string &filename): + mDoc(NULL) + { + int size; + ResourceManager *resman = ResourceManager::getInstance(); + char *data = (char*) resman->loadFile(filename.c_str(), size); + + if (data) { + mDoc = xmlParseMemory(data, size); + free(data); + + if (!mDoc) + logger->log("Error parsing XML file %s", filename.c_str()); + } else { + logger->log("Error loading %s", filename.c_str()); + } + } + + Document::Document(const char *data, int size) + { + mDoc = xmlParseMemory(data, size); + } + + Document::~Document() + { + if (mDoc) + xmlFreeDoc(mDoc); + } + + xmlNodePtr Document::rootNode() + { + return mDoc ? xmlDocGetRootElement(mDoc) : 0; + } + int getProperty(xmlNodePtr node, const char* name, int def) { diff --git a/src/utils/xml.h b/src/utils/xml.h index ef3bad3d..5473b2ca 100644 --- a/src/utils/xml.h +++ b/src/utils/xml.h @@ -33,6 +33,43 @@ */ namespace XML { + /** + * A helper class for parsing an XML document, which also cleans it up + * again (RAII). + */ + class Document + { + public: + /** + * Constructor that attempts to load the given file through the + * resource manager. Logs errors. + */ + Document(const std::string &filename); + + /** + * Constructor that attempts to load an XML document from memory. + * Does not log errors. + * + * @param data the string to parse as XML + * @param size the length of the string in bytes + */ + Document(const char *data, int size); + + /** + * Destructor. Frees the loaded XML file. + */ + ~Document(); + + /** + * Returns the root node of the document (or NULL if there was a + * load error). + */ + xmlNodePtr rootNode(); + + private: + xmlDocPtr mDoc; + }; + /** * Gets an integer property from an xmlNodePtr. */ -- cgit v1.2.3-70-g09d2 From ac1a456a90d06ba7765716643257ec33cc513f76 Mon Sep 17 00:00:00 2001 From: Yohann Ferreira Date: Mon, 21 Apr 2008 16:18:03 +0000 Subject: Added password encryption client-side using SHA256. --- ChangeLog | 8 + src/CMakeLists.txt | 4 + src/Makefile.am | 4 + src/main.cpp | 7 +- src/net/accountserver/account.cpp | 29 +- src/net/accountserver/account.h | 10 +- src/net/accountserver/accountserver.cpp | 10 +- src/utils/encryption.cpp | 75 ++++ src/utils/encryption.h | 45 ++ src/utils/sha2.cpp | 699 ++++++++++++++++++++++++++++++++ src/utils/sha2.h | 252 ++++++++++++ 11 files changed, 1122 insertions(+), 21 deletions(-) create mode 100644 src/utils/encryption.cpp create mode 100644 src/utils/encryption.h create mode 100644 src/utils/sha2.cpp create mode 100644 src/utils/sha2.h (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index c3bfbf6b..545d31c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-04-21 Yohann Ferreira + + * src/utils/encryption.h, src/utils/encryption.cpp, src/utils/sha2.h, + src/utils/sha2.cpp, src/CMakeLists.txt, src/Makefile.am, + src/net/accountserver/accountserver.cpp, + src/net/accountserver/account.h, src/net/accountserver/account.cpp, + src/main.cpp: Added password encryption using SHA256. + 2008-04-21 David Athay * src/gui/chat.cpp, src/gui/widgets/tabbedarea.cpp, diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9a35e7fc..9ddd64d0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -301,9 +301,13 @@ SET(SRCS utils/base64.cpp utils/base64.h utils/dtor.h + utils/encryption.h + utils/encryption.cpp utils/fastsqrt.h utils/gettext.h utils/minmax.h + utils/sha2.h + utils/sha2.cpp utils/strprintf.cpp utils/strprintf.h utils/tostring.h diff --git a/src/Makefile.am b/src/Makefile.am index 4a12e72d..046a518b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -255,9 +255,13 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ utils/base64.cpp \ utils/base64.h \ utils/dtor.h \ + utils/encryption.h \ + utils/encryption.cpp \ utils/fastsqrt.h \ utils/gettext.h \ utils/minmax.h \ + utils/sha2.h \ + utils/sha2.cpp \ utils/strprintf.h \ utils/strprintf.cpp \ utils/tostring.h \ diff --git a/src/main.cpp b/src/main.cpp index 9ac4b9a3..d5d99f31 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -532,7 +532,7 @@ void accountLogin(LoginData *loginData) // Send login infos Net::AccountServer::login(accountServerConnection, 0, - loginData->username, loginData->password); + loginData->username,loginData->password); // Clear the password, avoids auto login when returning to login loginData->password = ""; @@ -565,7 +565,7 @@ void accountUnRegister(LoginData *loginData) Net::registerHandler(&logoutHandler); Net::AccountServer::Account::unregister(loginData->username, - loginData->password); + loginData->password); } @@ -573,7 +573,8 @@ void accountChangePassword(LoginData *loginData) { Net::registerHandler(&loginHandler); - Net::AccountServer::Account::changePassword(loginData->password, + Net::AccountServer::Account::changePassword(loginData->username, + loginData->password, loginData->newPassword); } diff --git a/src/net/accountserver/account.cpp b/src/net/accountserver/account.cpp index 9f3bfe5c..bb0214d3 100644 --- a/src/net/accountserver/account.cpp +++ b/src/net/accountserver/account.cpp @@ -23,6 +23,9 @@ #include "account.h" +#include +#include "../../utils/encryption.h" + #include "internal.h" #include "../connection.h" @@ -74,34 +77,36 @@ void Net::AccountServer::Account::unregister(const std::string &username, MessageOut msg(PAMSG_UNREGISTER); msg.writeString(username); - msg.writeString(password); + msg.writeString(Encryption::GetSHA2Hash( + std::string (username + password))); Net::AccountServer::connection->send(msg); } -void Net::AccountServer::Account::changeEmail(const std::string &email) +void Net::AccountServer::Account::changeEmail(const std::string &username, + const std::string &email) { MessageOut msg(PAMSG_EMAIL_CHANGE); + // Email is sent clearly so the server can validate the data. + // Encryption is assumed server-side. msg.writeString(email); Net::AccountServer::connection->send(msg); } -void Net::AccountServer::Account::getEmail() -{ - MessageOut msg(PAMSG_EMAIL_GET); - - Net::AccountServer::connection->send(msg); -} - void Net::AccountServer::Account::changePassword( - const std::string &oldPassword, const std::string &newPassword) + const std::string &username, + const std::string &oldPassword, + const std::string &newPassword) { MessageOut msg(PAMSG_PASSWORD_CHANGE); - msg.writeString(oldPassword); - msg.writeString(newPassword); + // Change password using SHA2 encryption + msg.writeString(Encryption::GetSHA2Hash( + std::string (username + oldPassword))); + msg.writeString(Encryption::GetSHA2Hash( + std::string (username + newPassword))); Net::AccountServer::connection->send(msg); } diff --git a/src/net/accountserver/account.h b/src/net/accountserver/account.h index 6a8c4e08..c8604717 100644 --- a/src/net/accountserver/account.h +++ b/src/net/accountserver/account.h @@ -44,12 +44,12 @@ namespace Net void unregister(const std::string &username, const std::string &password); - void changeEmail(const std::string &email); + void changeEmail(const std::string &username, + const std::string &email); - void getEmail(); - - void changePassword(const std::string &oldPassword, - const std::string &newPassword); + void changePassword(const std::string &username, + const std::string &oldPassword, + const std::string &newPassword); } } } diff --git a/src/net/accountserver/accountserver.cpp b/src/net/accountserver/accountserver.cpp index 651758a6..a641ab47 100644 --- a/src/net/accountserver/accountserver.cpp +++ b/src/net/accountserver/accountserver.cpp @@ -23,6 +23,9 @@ #include "accountserver.h" +#include +#include "../../utils/encryption.h" + #include "internal.h" #include "../connection.h" @@ -38,7 +41,9 @@ void Net::AccountServer::login(Net::Connection *connection, int version, msg.writeInt32(version); msg.writeString(username); - msg.writeString(password); + // The password is hashed + msg.writeString(Encryption::GetSHA2Hash( + std::string (username + password))); Net::AccountServer::connection->send(msg); } @@ -53,6 +58,9 @@ void Net::AccountServer::registerAccount(Net::Connection *connection, msg.writeInt32(version); // client version msg.writeString(username); + // When registering, the password and email hash is assumed by server. + // Hence, data can be validated safely server-side. + // This is the only time we send a clear password. msg.writeString(password); msg.writeString(email); diff --git a/src/utils/encryption.cpp b/src/utils/encryption.cpp new file mode 100644 index 00000000..e3483e07 --- /dev/null +++ b/src/utils/encryption.cpp @@ -0,0 +1,75 @@ +/* + * The Mana World + * Copyright 2008 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: $ + */ + +#include "encryption.h" + +#include + +std::string Encryption::GetSHA2Hash(std::string stringToHash) +{ + + if (stringToHash.length() == 0) + return ""; + + sha2 mySha; + return mySha.GetHash(shaType, (const sha_byte *)stringToHash.c_str(), stringToHash.size()); +} + +char _getRandomCharacter() +{ + char result = '0'; + + // Taking a number of character taken between 33 and 127 + // (Every normal characters from ASCII table). + int number = (rand() % 94) + 33; + + // Those characters are dodged to ease user input and avoid database + // breaks: " ' , ` \ ^ * / ~ | + if (number == 34 || number == 39 || number == 42 || number == 44 || + number == 47 || number == 92 || number == 94 || number == 96 || + number == 124 || number == 126) + number++; + + result = char(number); + return result; +} + +/** + * Using this function, the random salt changes at every second. + */ +std::string Encryption::CreateRandomPassword() +{ + + std::string result = ""; + + // Ititializing random seed. + srand(time(NULL)); + // Taking a number of character taken between 20 and 30. + int characterNumber = (rand() % 10) + 20; + + for (int a = 1; a < characterNumber; a++) + { + result += _getRandomCharacter(); + } + return result; +} diff --git a/src/utils/encryption.h b/src/utils/encryption.h new file mode 100644 index 00000000..79d69dc4 --- /dev/null +++ b/src/utils/encryption.h @@ -0,0 +1,45 @@ +/* + * The Mana World + * Copyright 2008 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id: $ + */ + +#ifndef _TMW_UTILS_ENCRYPTION_H +#define _TMW_UTILS_ENCRYPTION_H + +#include + +#include "sha2.h" + +namespace Encryption { + +const sha2::SHA_TYPE shaType = sha2::enuSHA256; /**< Set the encryption strength */ + +/** Create an SHA2 hash from a given string */ +std::string GetSHA2Hash(std::string stringToHash); + +/** Create a random string, suitable for a user to type, + * and that doesn't break a database */ +std::string CreateRandomPassword(); + +} + +#endif //TMW_UTILS_ENCRYPTION_H + diff --git a/src/utils/sha2.cpp b/src/utils/sha2.cpp new file mode 100644 index 00000000..aba6a532 --- /dev/null +++ b/src/utils/sha2.cpp @@ -0,0 +1,699 @@ +/* + * The Mana World + * Copyright 2008 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Additional information about this file can be read below: + * $Id:$ + */ + +/************************************************************* + + This program is a C++ implementation of the Secure Hash Algorithm (SHA) + that handles the variations from the original 160 bit to 224, 256, 384 + and 512 bit. The program is intended to be platform independant and + has been tested on little-endian (Intel) and big-endian (Sun) machines. + + This program is based on a C version written by Aaron D. Gifford + (as of 11/22/2004 his code could be found at http://www.adg.us/computers/sha.html). + Attempts to contact him were unsuccessful. I greatly condensed his version + and shared as much code and data as I could think of. I also inlined + a lot of code that were macros in his version. My version detects + endian-ness automatically and adjusts itself accordingly. This program + has been tested with Visual C++ versions 6/7 and Dev-C++ on Windows, + g++ on Linux and CC on Solaris (g++ on Solaris gave a bus error). + + While I did make half-hearted attempts to optimize as I went along + (testing on Wintel), any serious attempt at fast implementation is + probably going to need to make use of in-lined assembly which is not + very portable. + + The goal of this implementation is ease of use. As much as possible + I tried to hide implementation details while making it trivial to change + the size of the hash and get the results. The string and charactar + array value of the hash is supplied as human-readable hex; the raw value + can also be obtained. + + If you use this implementation somewhere I would like to be credited + with my work (a link to my page below is fine). I add no license + restriction beyond any that is made by the original author. This + code comes with no warrenty expressed or implied, use at your own + risk! + + Keith Oxenrider + koxenrider[at]sol[dash]biotech[dot]com + The latest version of this code should be available via the page + sol-biotech.com/code. + +*************************************************************/ + +#include "sha2.h" + +#include + +using namespace std; + +// Hash constant words K for SHA-1: +const sha_word32 K1_0_TO_19 = 0x5a827999UL; +const sha_word32 K1_20_TO_39 = 0x6ed9eba1UL; +const sha_word32 K1_40_TO_59 = 0x8f1bbcdcUL; +const sha_word32 K1_60_TO_79 = 0xca62c1d6UL; + + + +//** SHA2 INITIAL HASH VALUES AND CONSTANTS ************************** + +// Initial hash value H for SHA-1: +const static sha_word32 sha1_initial_hash_value[5] = { + 0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL, + 0xc3d2e1f0UL +}; + +// Hash constant words K for SHA-224 and SHA-256: +const static sha_word32 K256[64] = { + 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, + 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, + 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, + 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL, + 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, + 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, + 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, + 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL, + 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL, + 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, + 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, + 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, + 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL, + 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL, + 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, + 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL +}; + +// Initial hash value H for SHA-224: +const static sha_word32 sha224_initial_hash_value[8] = { + 0xc1059ed8UL, 0x367cd507UL, 0x3070dd17UL, 0xf70e5939UL, + 0xffc00b31UL, 0x68581511UL, 0x64f98fa7UL, 0xbefa4fa4UL +}; + +// Initial hash value H for SHA-256: +const static sha_word32 sha256_initial_hash_value[8] = { + 0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL, + 0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL +}; + +// ui64 Hash constant words K for SHA-384 and SHA-512: +#ifdef _VC6 + const static sha_word64 K512[80] = { + 0x428a2f98d728ae22ui64, 0x7137449123ef65cdui64, + 0xb5c0fbcfec4d3b2fui64, 0xe9b5dba58189dbbcui64, + 0x3956c25bf348b538ui64, 0x59f111f1b605d019ui64, + 0x923f82a4af194f9bui64, 0xab1c5ed5da6d8118ui64, + 0xd807aa98a3030242ui64, 0x12835b0145706fbeui64, + 0x243185be4ee4b28cui64, 0x550c7dc3d5ffb4e2ui64, + 0x72be5d74f27b896fui64, 0x80deb1fe3b1696b1ui64, + 0x9bdc06a725c71235ui64, 0xc19bf174cf692694ui64, + 0xe49b69c19ef14ad2ui64, 0xefbe4786384f25e3ui64, + 0x0fc19dc68b8cd5b5ui64, 0x240ca1cc77ac9c65ui64, + 0x2de92c6f592b0275ui64, 0x4a7484aa6ea6e483ui64, + 0x5cb0a9dcbd41fbd4ui64, 0x76f988da831153b5ui64, + 0x983e5152ee66dfabui64, 0xa831c66d2db43210ui64, + 0xb00327c898fb213fui64, 0xbf597fc7beef0ee4ui64, + 0xc6e00bf33da88fc2ui64, 0xd5a79147930aa725ui64, + 0x06ca6351e003826fui64, 0x142929670a0e6e70ui64, + 0x27b70a8546d22ffcui64, 0x2e1b21385c26c926ui64, + 0x4d2c6dfc5ac42aedui64, 0x53380d139d95b3dfui64, + 0x650a73548baf63deui64, 0x766a0abb3c77b2a8ui64, + 0x81c2c92e47edaee6ui64, 0x92722c851482353bui64, + 0xa2bfe8a14cf10364ui64, 0xa81a664bbc423001ui64, + 0xc24b8b70d0f89791ui64, 0xc76c51a30654be30ui64, + 0xd192e819d6ef5218ui64, 0xd69906245565a910ui64, + 0xf40e35855771202aui64, 0x106aa07032bbd1b8ui64, + 0x19a4c116b8d2d0c8ui64, 0x1e376c085141ab53ui64, + 0x2748774cdf8eeb99ui64, 0x34b0bcb5e19b48a8ui64, + 0x391c0cb3c5c95a63ui64, 0x4ed8aa4ae3418acbui64, + 0x5b9cca4f7763e373ui64, 0x682e6ff3d6b2b8a3ui64, + 0x748f82ee5defb2fcui64, 0x78a5636f43172f60ui64, + 0x84c87814a1f0ab72ui64, 0x8cc702081a6439ecui64, + 0x90befffa23631e28ui64, 0xa4506cebde82bde9ui64, + 0xbef9a3f7b2c67915ui64, 0xc67178f2e372532bui64, + 0xca273eceea26619cui64, 0xd186b8c721c0c207ui64, + 0xeada7dd6cde0eb1eui64, 0xf57d4f7fee6ed178ui64, + 0x06f067aa72176fbaui64, 0x0a637dc5a2c898a6ui64, + 0x113f9804bef90daeui64, 0x1b710b35131c471bui64, + 0x28db77f523047d84ui64, 0x32caab7b40c72493ui64, + 0x3c9ebe0a15c9bebcui64, 0x431d67c49c100d4cui64, + 0x4cc5d4becb3e42b6ui64, 0x597f299cfc657e2aui64, + 0x5fcb6fab3ad6faecui64, 0x6c44198c4a475817ui64 + }; + // Initial hash value H for SHA-384 + const static sha_word64 sha384_initial_hash_value[8] = { + 0xcbbb9d5dc1059ed8ui64, 0x629a292a367cd507ui64, + 0x9159015a3070dd17ui64, 0x152fecd8f70e5939ui64, + 0x67332667ffc00b31ui64, 0x8eb44a8768581511ui64, + 0xdb0c2e0d64f98fa7ui64, 0x47b5481dbefa4fa4ui64 + }; + + // Initial hash value H for SHA-512 + const static sha_word64 sha512_initial_hash_value[8] = { + 0x6a09e667f3bcc908ui64, 0xbb67ae8584caa73bui64, + 0x3c6ef372fe94f82bui64, 0xa54ff53a5f1d36f1ui64, + 0x510e527fade682d1ui64, 0x9b05688c2b3e6c1fui64, + 0x1f83d9abfb41bd6bui64, 0x5be0cd19137e2179ui64 + }; +#else + const static sha_word64 K512[80] = { + 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, + 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, + 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, + 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, + 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, + 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, + 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, + 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, + 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, + 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, + 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, + 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, + 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, + 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, + 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, + 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, + 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, + 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, + 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, + 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, + 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, + 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, + 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, + 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, + 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, + 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, + 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, + 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, + 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, + 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, + 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, + 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, + 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, + 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL + }; + // Initial hash value H for SHA-384 + const static sha_word64 sha384_initial_hash_value[8] = { + 0xcbbb9d5dc1059ed8ULL, 0x629a292a367cd507ULL, + 0x9159015a3070dd17ULL, 0x152fecd8f70e5939ULL, + 0x67332667ffc00b31ULL, 0x8eb44a8768581511ULL, + 0xdb0c2e0d64f98fa7ULL, 0x47b5481dbefa4fa4ULL + }; + + // Initial hash value H for SHA-512 + const static sha_word64 sha512_initial_hash_value[8] = { + 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, + 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, + 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, + 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL + }; +#endif + +/* + * Constant used by SHA224/256/384/512_End() functions for converting the + * digest to a readable hexadecimal character string: + */ +static const char *sha_hex_digits = "0123456789abcdef"; + + +void sha2::SHA1_Internal_Transform(const sha_word32 *data) { + sha_word32 a, b, c, d, e; + sha_word32 *state = (sha_word32*)ctx.state; + sha_word32 T1, T2, *W1=(sha_word32*)ctx.buffer; + int j; + +// Initialize registers with the prev. intermediate value + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + j = 0; + do { + if (m_boolIsBigEndian) W1[j] = *data++; + else REVERSE32(*data++, W1[j]);// Copy data while converting to host byte order + T1 = ROTL32(5, a) + Ch(b, c, d) + e + K1_0_TO_19 + W1[j]; + e = d; + d = c; + c = ROTL32(30, b); + b = a; + a = T1; + j++; + } while (j < 16); + + do { + T1 = W1[(j+13)&0x0f] ^ W1[(j+8)&0x0f] ^ W1[(j+2)&0x0f] ^ W1[j&0x0f]; + if (j < 20) T2 = Ch(b,c,d) + K1_0_TO_19; + else if (j < 40) T2 = Parity(b,c,d) + K1_20_TO_39; + else if (j < 60) T2 = Maj(b,c,d) + K1_40_TO_59; + else T2 = Parity(b,c,d) + K1_60_TO_79; + T1 = ROTL32(5, a) + T2 + e + (W1[j&0x0f] = ROTL32(1, T1)); + e = d; + d = c; + c = ROTL32(30, b); + b = a; + a = T1; + j++; + } while (j < 80); + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; +} + + + +///* SHA-256: ******************************************************** + +void sha2::SHA256_Internal_Transform(const sha_word32* data) { + sha_word32 a, b, c, d, e, f, g, h, s0, s1; + sha_word32 *state = (sha_word32*)ctx.state; + sha_word32 T1, T2, *W256=(sha_word32*)ctx.buffer;; + int j; + +// Initialize registers with the prev. intermediate value + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + j = 0; + do { + if (m_boolIsBigEndian) W256[j] = *data++; + else REVERSE32(*data++,W256[j]);// Copy data while converting to host byte order + + T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j]; + T2 = Sigma0_256(a) + Maj(a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + + j++; + } while (j < 16); + + do { +// Part of the message block expansion: + s0 = W256[(j+1)&0x0f]; + s0 = sigma0_256(s0); + s1 = W256[(j+14)&0x0f]; + s1 = sigma1_256(s1); + +// Apply the SHA-256 compression function to update a..h + T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + + (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); + T2 = Sigma0_256(a) + Maj(a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + + j++; + } while (j < 64); + +// Compute the current intermediate hash value + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; +} + +//** SHA-512: ******************************************************** + +void sha2::SHA512_Internal_Transform(const sha_word64* data) { + sha_word64 a, b, c, d, e, f, g, h, s0, s1; + sha_word64 *state = (sha_word64 *)ctx.state; + sha_word64 T1, T2, *W512 = (sha_word64*)ctx.buffer; + int j; + +// Initialize registers with the prev. intermediate value + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + j = 0; + + do { + + if (m_boolIsBigEndian){ + W512[j] = *data; + data++; + }else{ + REVERSE64(*data++, W512[j]);// copy and convert TO host byte order + } + + T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j]; + T2 = Sigma0_512(a) + Maj(a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + + j++; + } while (j < 16); + + do { +// Part of the message block expansion: + s0 = W512[(j+1)&0x0f]; + s0 = sigma0_512(s0); + s1 = W512[(j+14)&0x0f]; + s1 = sigma1_512(s1); + +// Apply the SHA-512 compression function to update a..h + T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + + (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); + T2 = Sigma0_512(a) + Maj(a, b, c); + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + + j++; + } while (j < 80); + +// Compute the current intermediate hash value + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; +} + + +void sha2::SHA256_Internal_Last(bool isSha1) { + sha_word32 usedspace; + + usedspace = (sha_word32)(ctx.bitcount[0] >> 3) % 64; + if (usedspace == 0) { + MEMSET_BZERO(ctx.buffer, 56); + ctx.buffer[0] = 0x80; + }else { + ctx.buffer[usedspace++] = 0x80; + if (usedspace <= 56) { + MEMSET_BZERO(&ctx.buffer[usedspace], 56 - usedspace); + }else { + if (usedspace < 64) { + MEMSET_BZERO(&ctx.buffer[usedspace], 64 - usedspace); + } + if (isSha1) SHA1_Internal_Transform((sha_word32*)ctx.buffer); + else SHA256_Internal_Transform((sha_word32*)ctx.buffer); + MEMSET_BZERO(ctx.buffer, 56); + } + } + + if (!m_boolIsBigEndian) REVERSE64(ctx.bitcount[0],ctx.bitcount[0]); + *(sha_word64*)&ctx.buffer[56] = ctx.bitcount[0]; + if (isSha1) SHA1_Internal_Transform((sha_word32*)ctx.buffer); + else SHA256_Internal_Transform((sha_word32*)ctx.buffer); +} + + +void sha2::SHA512_Internal_Last() { + sha_word32 usedspace; + + usedspace = (sha_word32)(ctx.bitcount[0] >> 3) % 128; + if (usedspace == 0) { + MEMSET_BZERO(ctx.buffer, 112); + ctx.buffer[0] = 0x80; + }else{ + ctx.buffer[usedspace++] = 0x80; + if (usedspace <= 112) { + MEMSET_BZERO(&ctx.buffer[usedspace], 112 - usedspace); + }else { + if (usedspace < 128) { + MEMSET_BZERO(&ctx.buffer[usedspace], 128 - usedspace); + } + SHA512_Internal_Transform((sha_word64*)ctx.buffer); + MEMSET_BZERO(ctx.buffer, 112); + } + usedspace = 0; + } + + if (!m_boolIsBigEndian){ + REVERSE64(ctx.bitcount[0],ctx.bitcount[0]); + REVERSE64(ctx.bitcount[1],ctx.bitcount[1]); + } + + *(sha_word64*)&ctx.buffer[112] = ctx.bitcount[1]; + *(sha_word64*)&ctx.buffer[120] = ctx.bitcount[0]; + SHA512_Internal_Transform((sha_word64*)ctx.buffer); +} + + + +void sha2::SHA32bit_Update(const sha_byte *data, size_t len, bool isSha1) { + sha_word32 freespace, usedspace; + + if (len<1){return;}// Calling with no data is valid - we do nothing + + usedspace = (sha_word32)(ctx.bitcount[0] >> 3) % 64; + if (usedspace > 0) {// Calculate how much free space is available in the buffer + freespace = 64 - usedspace; + if (len >= freespace) {// Fill the buffer completely and process it + MEMCPY_BCOPY(&ctx.buffer[usedspace], data, freespace); + ctx.bitcount[0] += freespace << 3; + len -= freespace; + data += freespace; + if (isSha1) SHA1_Internal_Transform((sha_word32 *)ctx.buffer); + else SHA256_Internal_Transform((sha_word32 *)ctx.buffer); + }else {// The buffer is not yet full + MEMCPY_BCOPY(&ctx.buffer[usedspace], data, len); + ctx.bitcount[0] += len << 3; + return; + } + } + while (len >= 64) {// Process as many complete blocks as we can + if (isSha1) SHA1_Internal_Transform((sha_word32*)data); + else SHA256_Internal_Transform((sha_word32*)data); + ctx.bitcount[0] += 512; + len -= 64; + data += 64; + } + if (len > 0) {// There's left-overs, so save 'em + MEMCPY_BCOPY(&ctx.buffer, data, len); + ctx.bitcount[0] += len << 3; + } +} + + + +void sha2::SHA64bit_Update(const sha_byte *data, size_t len) { + sha_word32 freespace, usedspace; + + if (len < 1){return;}// Calling with no data is valid - we do nothing + + usedspace = (sha_word32)(ctx.bitcount[0] >> 3) % 128; + if (usedspace > 0) {// Calculate how much free space is available in the buffer + freespace = 128 - usedspace; + if (len >= freespace) {// Fill the buffer completely and process it + MEMCPY_BCOPY(&ctx.buffer[usedspace], data, freespace); + ADDINC128(ctx.bitcount, freespace << 3); + len -= freespace; + data += freespace; + SHA512_Internal_Transform((sha_word64*)ctx.buffer); + }else {// The buffer is not yet full + MEMCPY_BCOPY(&ctx.buffer[usedspace], data, len); + ADDINC128(ctx.bitcount, len << 3); + return; + } + } + while (len >= 128) {// Process as many complete blocks as we can + SHA512_Internal_Transform((sha_word64*)data); + ADDINC128(ctx.bitcount, 1024); + len -= 128; + data += 128; + } + if (len > 0) {// There's left-overs, so save 'em + MEMCPY_BCOPY(ctx.buffer, data, len); + ADDINC128(ctx.bitcount, len << 3); + } +} + + +/* + * + * + * + * Public interfaces... + * + * + * + */ + +void sha2::Init(SHA_TYPE type){ + m_Type = type; + m_boolEnded = false; + MEMSET_BZERO(&ctx, sizeof(SHA_CTX)); + switch (m_Type){ + case enuSHA1 : MEMCPY_BCOPY(ctx.state, sha1_initial_hash_value, sizeof(sha_word32) * 5); break; + case enuSHA224 : MEMCPY_BCOPY(ctx.state, sha224_initial_hash_value, sizeof(sha_word32) * 8); break; + case enuSHA256 : MEMCPY_BCOPY(ctx.state, sha256_initial_hash_value, sizeof(sha_word32) * 8); break; + case enuSHA384 : MEMCPY_BCOPY(ctx.state, sha384_initial_hash_value, sizeof(sha_word64) * 8); break; + case enuSHA512 : MEMCPY_BCOPY(ctx.state, sha512_initial_hash_value, sizeof(sha_word64) * 8); break; + default : throw std::runtime_error("Invalid SHA_TYPE type!"); + } +} + + +void sha2::Update(const sha_byte* data, size_t len){ + switch (m_Type){ + case enuSHA1 : SHA32bit_Update(data, len, true); break; + case enuSHA224 : SHA32bit_Update(data, len); break; + case enuSHA256 : SHA32bit_Update(data, len); break; + case enuSHA384 : SHA64bit_Update(data, len); break; + case enuSHA512 : SHA64bit_Update(data, len); break; + default : throw std::runtime_error("Invalid SHA_TYPE type!"); + } +} + + +void sha2::End(){ + sha_byte *d = m_digest; + char *buf = m_chrHexHash; + int i, j, diglen, statecnt=8; + bool is64bit=false; + sha_word32 *state32=(sha_word32 *)ctx.state; + sha_word64 *state64=(sha_word64 *)ctx.state; + + switch (m_Type){ + case enuSHA1 : { + SHA256_Internal_Last(true); + statecnt = 5; + diglen = SHA1_DIGESTC_LENGTH; + break; + } + case enuSHA224 : { + SHA256_Internal_Last(); + diglen = SHA224_DIGESTC_LENGTH; + break; + } + case enuSHA256 : { + SHA256_Internal_Last(); + diglen = SHA256_DIGESTC_LENGTH; + break; + } + case enuSHA384 : { + SHA512_Internal_Last(); + is64bit = true; + diglen = SHA384_DIGESTC_LENGTH; + break; + } + case enuSHA512 : { + SHA512_Internal_Last(); + is64bit = true; + diglen = SHA512_DIGESTC_LENGTH; + break; + } + default : throw std::runtime_error("Invalid SHA_TYPE type!"); + } + if (m_boolIsBigEndian){ + MEMCPY_BCOPY(&m_digest, &ctx.state, diglen); + }else{ + sha_byte *dp = m_digest, *ptr; + for (i=0; i-1; --j) *dp++ = ptr[j]; + } + } + + for (i=0; i> 4]; + *buf++ = sha_hex_digits[*d & 0x0f]; + d++; + } + *buf = (char)0; + m_strHash = m_chrHexHash; + m_boolEnded = true; +} + +const string &sha2::GetHash(SHA_TYPE type, const sha_byte* data, size_t len){ + Init(type); + Update(data, len); + End(); + return m_strHash; +} + + + +const char *sha2::HexHash(){ + if (!m_boolEnded) throw std::runtime_error("Unfinished execution!"); + return m_strHash.c_str(); +} +const string &sha2::StringHash(){ + if (!m_boolEnded) throw std::runtime_error("Unfinished execution!"); + return m_strHash; +} +const char *sha2::RawHash(int &length){ + if (!m_boolEnded) throw std::runtime_error("Unfinished execution!"); + switch (m_Type){ + case enuSHA1 : length = SHA1_DIGESTC_LENGTH; break; + case enuSHA224 : length = SHA224_DIGESTC_LENGTH; break; + case enuSHA256 : length = SHA256_DIGESTC_LENGTH; break; + case enuSHA384 : length = SHA384_DIGESTC_LENGTH; break; + case enuSHA512 : length = SHA512_DIGESTC_LENGTH; break; + default : length = 0; + } + return (const char *)m_digest; +} + diff --git a/src/utils/sha2.h b/src/utils/sha2.h new file mode 100644 index 00000000..3a0f07b5 --- /dev/null +++ b/src/utils/sha2.h @@ -0,0 +1,252 @@ +/* + * The Mana World + * Copyright 2008 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Additional information about this file can be read below. + * + * $Id: $ + */ + +/************************************************************* + + This program is a C++ implementation of the Secure Hash Algorithm (SHA) + that handles the variations from the original 160 bit to 224, 256, 384 + and 512 bit. The program is intended to be platform independant and + has been tested on little-endian (Intel) and big-endian (Sun) machines. + + This program is based on a C version written by Aaron D. Gifford + (as of 11/22/2004 his code could be found at http://www.adg.us/computers/sha.html). + Attempts to contact him were unsuccessful. I greatly condensed his version + and shared as much code and data as I could think of. I also inlined + a lot of code that were macros in his version. My version detects + endian-ness automatically and adjusts itself accordingly. This program + has been tested with Visual C++ versions 6/7 and Dev-C++ on Windows, + g++ on Linux and CC on Solaris (g++ on Solaris gave a bus error). + + While I did make half-hearted attempts to optimize as I went along + (testing on Wintel), any serious attempt at fast implementation is + probably going to need to make use of in-lined assembly which is not + very portable. + + The goal of this implementation is ease of use. As much as possible + I tried to hide implementation details while making it trivial to change + the size of the hash and get the results. The string and charactar + array value of the hash is supplied as human-readable hex; the raw value + can also be obtained. + + If you use this implementation somewhere I would like to be credited + with my work (a link to my page below is fine). I add no license + restriction beyond any that is made by the original author. This + code comes with no warrenty expressed or implied, use at your own + risk! + + Keith Oxenrider + koxenrider[at]sol[dash]biotech[dot]com + The latest version of this code should be available via the page + sol-biotech.com/code. + +*************************************************************/ + + + + +#ifndef _TMW_UTILS_SHA2C_H +#define _TMW_UTILS_SHA2C_H + +#include +#include + +// NOTE: You may need to define things by hand for your system: +typedef unsigned char sha_byte; // Exactly 1 byte +typedef unsigned int sha_word32; // Exactly 4 bytes +#ifdef WIN32 + #include + typedef ULONG64 sha_word64; // 8-bytes (64-bits) +#else + typedef unsigned long long sha_word64; // 8-bytes (64-bits) +#endif + +// Digest lengths for SHA-1/224/256/384/512 +const sha_word32 SHA1_DIGESTC_LENGTH = 20; +const sha_word32 SHA1_DIGESTC_STRING_LENGTH = (SHA1_DIGESTC_LENGTH * 2 + 1); +const sha_word32 SHA224_DIGESTC_LENGTH = 28; +const sha_word32 SHA224_DIGESTC_STRING_LENGTH = (SHA224_DIGESTC_LENGTH * 2 + 1); +const sha_word32 SHA256_DIGESTC_LENGTH = 32; +const sha_word32 SHA256_DIGESTC_STRING_LENGTH = (SHA256_DIGESTC_LENGTH * 2 + 1); +const sha_word32 SHA384_DIGESTC_LENGTH = 48; +const sha_word32 SHA384_DIGESTC_STRING_LENGTH = (SHA384_DIGESTC_LENGTH * 2 + 1); +const sha_word32 SHA512_DIGESTC_LENGTH = 64; +const sha_word32 SHA512_DIGESTC_STRING_LENGTH = (SHA512_DIGESTC_LENGTH * 2 + 1); + +class sha2{ +public: + enum SHA_TYPE{ + enuSHA_NONE, + enuSHA1, + enuSHA160 = enuSHA1, + enuSHA224, + enuSHA256, + enuSHA384, + enuSHA512, + enuSHA_LAST //for easier looping during testing + }; + + sha2(){ + m_Type = enuSHA_NONE; + m_boolIsBigEndian = true; + m_boolEnded = false; + + //run-time check for endian-ness + unsigned int test = 1; + unsigned char *ptr = (unsigned char *)&test; + if (ptr[0]) m_boolIsBigEndian = false; + + //these checks here because I wasn't able to figure out how to + //check at compile time + if (sizeof(sha_byte) != 1) throw std::runtime_error("sha_byte != 1!"); + if (sizeof(sha_word32) != 4) throw std::runtime_error("sha_word32 != 4!"); + if (sizeof(sha_word64) != 8) throw std::runtime_error("sha_word64 != 8!"); + + memset(m_chrRawHash, 0, SHA512_DIGESTC_LENGTH); + memset(m_chrHexHash, 0, SHA512_DIGESTC_STRING_LENGTH); + memset(m_digest, 0, SHA512_DIGESTC_LENGTH); + }; + + SHA_TYPE GetEnumType(){return m_Type;}; + bool IsBigEndian(){return m_boolIsBigEndian;}; + const char * GetTypeString(){ + switch (m_Type){ + case sha2::enuSHA1 : return "SHA160"; + case sha2::enuSHA224 : return "SHA224"; + case sha2::enuSHA256 : return "SHA256"; + case sha2::enuSHA384 : return "SHA384"; + case sha2::enuSHA512 : return "SHA512"; + default : return "Unknown!"; + } + }; + +//call these three in order if you want to load chunk-by-chunk... + void Init(SHA_TYPE type); + //these two throw a std::runtime_error if the type is not defined + void Update(const sha_byte *data, size_t len);//call as many times as needed + void End(); + +//or call this one if you only have one chunk of data + const std::string &GetHash(SHA_TYPE type, const sha_byte* data, size_t len); + +//call one of these routines to access the hash + //these throw a std::runtime_error if End has not been called + const char *HexHash();//NULL terminated + const std::string &StringHash(); + const char *RawHash(int &length);//NO NULL termination! size stored in 'length' + + +private: + SHA_TYPE m_Type; + std::string m_strHash; + bool m_boolEnded, m_boolIsBigEndian; + char m_chrRawHash[SHA512_DIGESTC_LENGTH], m_chrHexHash[SHA512_DIGESTC_STRING_LENGTH]; + sha_byte m_digest[SHA512_DIGESTC_LENGTH]; + +//these are common buffers for maintaining the hash + struct SHA_CTX{ + sha_byte state[sizeof(sha_word64) * 8];//maximum size + sha_word64 bitcount[2];//sha1, 224 and 256 only use the first entry + sha_byte buffer[128]; + }ctx; + + +//** INTERNAL FUNCTION PROTOTYPES ************************************ + void SHA256_Internal_Last(bool isSha1 = false); + void SHA512_Internal_Last(); + + void SHA1_Internal_Transform(const sha_word32 *data); + void SHA256_Internal_Transform(const sha_word32* data); + void SHA512_Internal_Transform(const sha_word64*); + + void SHA32bit_Update(const sha_byte *data, size_t len, bool isSha1=false); + void SHA64bit_Update(const sha_byte *data, size_t len); + +//macro replacements + inline void MEMSET_BZERO(void *p, size_t l){memset(p, 0, l);}; + inline void MEMCPY_BCOPY(void *d,const void *s, size_t l) {memcpy(d, s, l);}; + + //For incrementally adding the unsigned 64-bit integer n to the + //unsigned 128-bit integer (represented using a two-element array of + //64-bit words): + inline void ADDINC128(sha_word64 *w, sha_word32 n) { + w[0] += (sha_word64)(n); + if (w[0] < (n)) w[1]++; + } + + // Shift-right (used in SHA-256, SHA-384, and SHA-512): + inline sha_word32 SHR(sha_word32 b,sha_word32 x){return (x >> b);}; + inline sha_word64 SHR(sha_word64 b,sha_word64 x){return (x >> b);}; + // 32-bit Rotate-right (used in SHA-256): + inline sha_word32 ROTR32(sha_word32 b,sha_word32 x){return ((x >> b) | (x << (32 - b)));}; + // 64-bit Rotate-right (used in SHA-384 and SHA-512): + inline sha_word64 ROTR64(sha_word64 b,sha_word64 x){return ((x >> b) | (x << (64 - b)));}; + // 32-bit Rotate-left (used in SHA-1): + inline sha_word32 ROTL32(sha_word32 b,sha_word32 x){return ((x << b) | (x >> (32 - b)));}; + + // Two logical functions used in SHA-1, SHA-254, SHA-256, SHA-384, and SHA-512: + inline sha_word32 Ch(sha_word32 x,sha_word32 y,sha_word32 z){return ((x & y) ^ ((~x) & z));}; + inline sha_word64 Ch(sha_word64 x,sha_word64 y,sha_word64 z){return ((x & y) ^ ((~x) & z));}; + inline sha_word32 Maj(sha_word32 x,sha_word32 y,sha_word32 z){return ((x & y) ^ (x & z) ^ (y & z));}; + inline sha_word64 Maj(sha_word64 x,sha_word64 y,sha_word64 z){return ((x & y) ^ (x & z) ^ (y & z));}; + + // Function used in SHA-1: + inline sha_word32 Parity(sha_word32 x,sha_word32 y,sha_word32 z){return (x ^ y ^ z);}; + +// Four logical functions used in SHA-256: + inline sha_word32 Sigma0_256(sha_word32 x){return (ROTR32(2, x) ^ ROTR32(13, x) ^ ROTR32(22, x));}; + inline sha_word32 Sigma1_256(sha_word32 x){return (ROTR32(6, x) ^ ROTR32(11, x) ^ ROTR32(25, x));}; + inline sha_word32 sigma0_256(sha_word32 x){return (ROTR32(7, x) ^ ROTR32(18, x) ^ SHR( 3 , x));}; + inline sha_word32 sigma1_256(sha_word32 x){return (ROTR32(17,x) ^ ROTR32(19, x) ^ SHR( 10, x));}; + +// Four of six logical functions used in SHA-384 and SHA-512: + inline sha_word64 Sigma0_512(sha_word64 x){return (ROTR64(28, x) ^ ROTR64(34, x) ^ ROTR64(39, x));}; + inline sha_word64 Sigma1_512(sha_word64 x){return (ROTR64(14, x) ^ ROTR64(18, x) ^ ROTR64(41, x));}; + inline sha_word64 sigma0_512(sha_word64 x){return (ROTR64( 1, x) ^ ROTR64( 8, x) ^ SHR( 7, x));}; + inline sha_word64 sigma1_512(sha_word64 x){return (ROTR64(19, x) ^ ROTR64(61, x) ^ SHR( 6, x));}; + + inline void REVERSE32(sha_word32 w, sha_word32 &x) { + w = (w >> 16) | (w << 16); + x = ((w & 0xff00ff00UL) >> 8) | ((w & 0x00ff00ffUL) << 8); + } + #ifdef _VC6 + inline void REVERSE64(sha_word64 w, sha_word64 &x) { + w = (w >> 32) | (w << 32); + w = ((w & 0xff00ff00ff00ff00ui64) >> 8) | + ((w & 0x00ff00ff00ff00ffui64) << 8); + (x) = ((w & 0xffff0000ffff0000ui64) >> 16) | + ((w & 0x0000ffff0000ffffui64) << 16); + } + #else + inline void REVERSE64(sha_word64 w, sha_word64 &x) { + w = (w >> 32) | (w << 32); + w = ((w & 0xff00ff00ff00ff00ULL) >> 8) | + ((w & 0x00ff00ff00ff00ffULL) << 8); + (x) = ((w & 0xffff0000ffff0000ULL) >> 16) | + ((w & 0x0000ffff0000ffffULL) << 16); + } + #endif + +};//end class sha2 +#endif // __SHA2C_H__ -- cgit v1.2.3-70-g09d2 From b8b4a6346a5fe4a8e1719fc476ab6c6f714446a6 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Mon, 21 Apr 2008 17:15:07 +0000 Subject: Removed our copyright header since these files are not copyright by us. --- src/utils/sha2.cpp | 24 ------------------------ src/utils/sha2.h | 28 ---------------------------- 2 files changed, 52 deletions(-) (limited to 'src/utils') diff --git a/src/utils/sha2.cpp b/src/utils/sha2.cpp index aba6a532..b2bf9c1e 100644 --- a/src/utils/sha2.cpp +++ b/src/utils/sha2.cpp @@ -1,27 +1,3 @@ -/* - * The Mana World - * Copyright 2008 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Additional information about this file can be read below: - * $Id:$ - */ - /************************************************************* This program is a C++ implementation of the Secure Hash Algorithm (SHA) diff --git a/src/utils/sha2.h b/src/utils/sha2.h index 3a0f07b5..79f6b862 100644 --- a/src/utils/sha2.h +++ b/src/utils/sha2.h @@ -1,28 +1,3 @@ -/* - * The Mana World - * Copyright 2008 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Additional information about this file can be read below. - * - * $Id: $ - */ - /************************************************************* This program is a C++ implementation of the Secure Hash Algorithm (SHA) @@ -63,9 +38,6 @@ *************************************************************/ - - - #ifndef _TMW_UTILS_SHA2C_H #define _TMW_UTILS_SHA2C_H -- cgit v1.2.3-70-g09d2 From 6f2bd00100522615ff8a5dda1166a4b3312879d0 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Wed, 23 Apr 2008 09:17:52 +0000 Subject: Replaced SHA-256 implementation with the one from InspIRCd. Thanks to Bertram for initial modifications. --- src/CMakeLists.txt | 6 +- src/Makefile.am | 6 +- src/net/accountserver/account.cpp | 14 +- src/net/accountserver/accountserver.cpp | 7 +- src/utils/encryption.cpp | 75 ---- src/utils/encryption.h | 45 --- src/utils/sha2.cpp | 675 -------------------------------- src/utils/sha2.h | 224 ----------- src/utils/sha256.cpp | 276 +++++++++++++ src/utils/sha256.h | 37 ++ 10 files changed, 326 insertions(+), 1039 deletions(-) delete mode 100644 src/utils/encryption.cpp delete mode 100644 src/utils/encryption.h delete mode 100644 src/utils/sha2.cpp delete mode 100644 src/utils/sha2.h create mode 100644 src/utils/sha256.cpp create mode 100644 src/utils/sha256.h (limited to 'src/utils') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9ddd64d0..2fb3b458 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -301,13 +301,11 @@ SET(SRCS utils/base64.cpp utils/base64.h utils/dtor.h - utils/encryption.h - utils/encryption.cpp utils/fastsqrt.h utils/gettext.h utils/minmax.h - utils/sha2.h - utils/sha2.cpp + utils/sha256.h + utils/sha256.cpp utils/strprintf.cpp utils/strprintf.h utils/tostring.h diff --git a/src/Makefile.am b/src/Makefile.am index 046a518b..9d739685 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -255,13 +255,11 @@ tmw_SOURCES = gui/widgets/dropdown.cpp \ utils/base64.cpp \ utils/base64.h \ utils/dtor.h \ - utils/encryption.h \ - utils/encryption.cpp \ utils/fastsqrt.h \ utils/gettext.h \ utils/minmax.h \ - utils/sha2.h \ - utils/sha2.cpp \ + utils/sha256.h \ + utils/sha256.cpp \ utils/strprintf.h \ utils/strprintf.cpp \ utils/tostring.h \ diff --git a/src/net/accountserver/account.cpp b/src/net/accountserver/account.cpp index bb0214d3..2d8065b5 100644 --- a/src/net/accountserver/account.cpp +++ b/src/net/accountserver/account.cpp @@ -24,7 +24,6 @@ #include "account.h" #include -#include "../../utils/encryption.h" #include "internal.h" @@ -32,6 +31,8 @@ #include "../messageout.h" #include "../protocol.h" +#include "../../utils/sha256.h" + void Net::AccountServer::Account::createCharacter( const std::string &name, char hairStyle, char hairColor, char gender, short strength, short agility, short vitality, @@ -77,14 +78,13 @@ void Net::AccountServer::Account::unregister(const std::string &username, MessageOut msg(PAMSG_UNREGISTER); msg.writeString(username); - msg.writeString(Encryption::GetSHA2Hash( - std::string (username + password))); + msg.writeString(sha256(username + password)); Net::AccountServer::connection->send(msg); } void Net::AccountServer::Account::changeEmail(const std::string &username, - const std::string &email) + const std::string &email) { MessageOut msg(PAMSG_EMAIL_CHANGE); @@ -103,10 +103,8 @@ void Net::AccountServer::Account::changePassword( MessageOut msg(PAMSG_PASSWORD_CHANGE); // Change password using SHA2 encryption - msg.writeString(Encryption::GetSHA2Hash( - std::string (username + oldPassword))); - msg.writeString(Encryption::GetSHA2Hash( - std::string (username + newPassword))); + msg.writeString(sha256(username + oldPassword)); + msg.writeString(sha256(username + newPassword)); Net::AccountServer::connection->send(msg); } diff --git a/src/net/accountserver/accountserver.cpp b/src/net/accountserver/accountserver.cpp index a641ab47..db94563b 100644 --- a/src/net/accountserver/accountserver.cpp +++ b/src/net/accountserver/accountserver.cpp @@ -24,7 +24,6 @@ #include "accountserver.h" #include -#include "../../utils/encryption.h" #include "internal.h" @@ -32,6 +31,8 @@ #include "../messageout.h" #include "../protocol.h" +#include "../../utils/sha256.h" + void Net::AccountServer::login(Net::Connection *connection, int version, const std::string &username, const std::string &password) { @@ -41,9 +42,7 @@ void Net::AccountServer::login(Net::Connection *connection, int version, msg.writeInt32(version); msg.writeString(username); - // The password is hashed - msg.writeString(Encryption::GetSHA2Hash( - std::string (username + password))); + msg.writeString(sha256(username + password)); Net::AccountServer::connection->send(msg); } diff --git a/src/utils/encryption.cpp b/src/utils/encryption.cpp deleted file mode 100644 index e3483e07..00000000 --- a/src/utils/encryption.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * The Mana World - * Copyright 2008 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: $ - */ - -#include "encryption.h" - -#include - -std::string Encryption::GetSHA2Hash(std::string stringToHash) -{ - - if (stringToHash.length() == 0) - return ""; - - sha2 mySha; - return mySha.GetHash(shaType, (const sha_byte *)stringToHash.c_str(), stringToHash.size()); -} - -char _getRandomCharacter() -{ - char result = '0'; - - // Taking a number of character taken between 33 and 127 - // (Every normal characters from ASCII table). - int number = (rand() % 94) + 33; - - // Those characters are dodged to ease user input and avoid database - // breaks: " ' , ` \ ^ * / ~ | - if (number == 34 || number == 39 || number == 42 || number == 44 || - number == 47 || number == 92 || number == 94 || number == 96 || - number == 124 || number == 126) - number++; - - result = char(number); - return result; -} - -/** - * Using this function, the random salt changes at every second. - */ -std::string Encryption::CreateRandomPassword() -{ - - std::string result = ""; - - // Ititializing random seed. - srand(time(NULL)); - // Taking a number of character taken between 20 and 30. - int characterNumber = (rand() % 10) + 20; - - for (int a = 1; a < characterNumber; a++) - { - result += _getRandomCharacter(); - } - return result; -} diff --git a/src/utils/encryption.h b/src/utils/encryption.h deleted file mode 100644 index 79d69dc4..00000000 --- a/src/utils/encryption.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * The Mana World - * Copyright 2008 The Mana World Development Team - * - * This file is part of The Mana World. - * - * The Mana World is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * The Mana World is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with The Mana World; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: $ - */ - -#ifndef _TMW_UTILS_ENCRYPTION_H -#define _TMW_UTILS_ENCRYPTION_H - -#include - -#include "sha2.h" - -namespace Encryption { - -const sha2::SHA_TYPE shaType = sha2::enuSHA256; /**< Set the encryption strength */ - -/** Create an SHA2 hash from a given string */ -std::string GetSHA2Hash(std::string stringToHash); - -/** Create a random string, suitable for a user to type, - * and that doesn't break a database */ -std::string CreateRandomPassword(); - -} - -#endif //TMW_UTILS_ENCRYPTION_H - diff --git a/src/utils/sha2.cpp b/src/utils/sha2.cpp deleted file mode 100644 index b2bf9c1e..00000000 --- a/src/utils/sha2.cpp +++ /dev/null @@ -1,675 +0,0 @@ -/************************************************************* - - This program is a C++ implementation of the Secure Hash Algorithm (SHA) - that handles the variations from the original 160 bit to 224, 256, 384 - and 512 bit. The program is intended to be platform independant and - has been tested on little-endian (Intel) and big-endian (Sun) machines. - - This program is based on a C version written by Aaron D. Gifford - (as of 11/22/2004 his code could be found at http://www.adg.us/computers/sha.html). - Attempts to contact him were unsuccessful. I greatly condensed his version - and shared as much code and data as I could think of. I also inlined - a lot of code that were macros in his version. My version detects - endian-ness automatically and adjusts itself accordingly. This program - has been tested with Visual C++ versions 6/7 and Dev-C++ on Windows, - g++ on Linux and CC on Solaris (g++ on Solaris gave a bus error). - - While I did make half-hearted attempts to optimize as I went along - (testing on Wintel), any serious attempt at fast implementation is - probably going to need to make use of in-lined assembly which is not - very portable. - - The goal of this implementation is ease of use. As much as possible - I tried to hide implementation details while making it trivial to change - the size of the hash and get the results. The string and charactar - array value of the hash is supplied as human-readable hex; the raw value - can also be obtained. - - If you use this implementation somewhere I would like to be credited - with my work (a link to my page below is fine). I add no license - restriction beyond any that is made by the original author. This - code comes with no warrenty expressed or implied, use at your own - risk! - - Keith Oxenrider - koxenrider[at]sol[dash]biotech[dot]com - The latest version of this code should be available via the page - sol-biotech.com/code. - -*************************************************************/ - -#include "sha2.h" - -#include - -using namespace std; - -// Hash constant words K for SHA-1: -const sha_word32 K1_0_TO_19 = 0x5a827999UL; -const sha_word32 K1_20_TO_39 = 0x6ed9eba1UL; -const sha_word32 K1_40_TO_59 = 0x8f1bbcdcUL; -const sha_word32 K1_60_TO_79 = 0xca62c1d6UL; - - - -//** SHA2 INITIAL HASH VALUES AND CONSTANTS ************************** - -// Initial hash value H for SHA-1: -const static sha_word32 sha1_initial_hash_value[5] = { - 0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL, - 0xc3d2e1f0UL -}; - -// Hash constant words K for SHA-224 and SHA-256: -const static sha_word32 K256[64] = { - 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL, - 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL, - 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL, - 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL, - 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL, - 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL, - 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL, - 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL, - 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL, - 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL, - 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL, - 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL, - 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL, - 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL, - 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL, - 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL -}; - -// Initial hash value H for SHA-224: -const static sha_word32 sha224_initial_hash_value[8] = { - 0xc1059ed8UL, 0x367cd507UL, 0x3070dd17UL, 0xf70e5939UL, - 0xffc00b31UL, 0x68581511UL, 0x64f98fa7UL, 0xbefa4fa4UL -}; - -// Initial hash value H for SHA-256: -const static sha_word32 sha256_initial_hash_value[8] = { - 0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL, - 0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL -}; - -// ui64 Hash constant words K for SHA-384 and SHA-512: -#ifdef _VC6 - const static sha_word64 K512[80] = { - 0x428a2f98d728ae22ui64, 0x7137449123ef65cdui64, - 0xb5c0fbcfec4d3b2fui64, 0xe9b5dba58189dbbcui64, - 0x3956c25bf348b538ui64, 0x59f111f1b605d019ui64, - 0x923f82a4af194f9bui64, 0xab1c5ed5da6d8118ui64, - 0xd807aa98a3030242ui64, 0x12835b0145706fbeui64, - 0x243185be4ee4b28cui64, 0x550c7dc3d5ffb4e2ui64, - 0x72be5d74f27b896fui64, 0x80deb1fe3b1696b1ui64, - 0x9bdc06a725c71235ui64, 0xc19bf174cf692694ui64, - 0xe49b69c19ef14ad2ui64, 0xefbe4786384f25e3ui64, - 0x0fc19dc68b8cd5b5ui64, 0x240ca1cc77ac9c65ui64, - 0x2de92c6f592b0275ui64, 0x4a7484aa6ea6e483ui64, - 0x5cb0a9dcbd41fbd4ui64, 0x76f988da831153b5ui64, - 0x983e5152ee66dfabui64, 0xa831c66d2db43210ui64, - 0xb00327c898fb213fui64, 0xbf597fc7beef0ee4ui64, - 0xc6e00bf33da88fc2ui64, 0xd5a79147930aa725ui64, - 0x06ca6351e003826fui64, 0x142929670a0e6e70ui64, - 0x27b70a8546d22ffcui64, 0x2e1b21385c26c926ui64, - 0x4d2c6dfc5ac42aedui64, 0x53380d139d95b3dfui64, - 0x650a73548baf63deui64, 0x766a0abb3c77b2a8ui64, - 0x81c2c92e47edaee6ui64, 0x92722c851482353bui64, - 0xa2bfe8a14cf10364ui64, 0xa81a664bbc423001ui64, - 0xc24b8b70d0f89791ui64, 0xc76c51a30654be30ui64, - 0xd192e819d6ef5218ui64, 0xd69906245565a910ui64, - 0xf40e35855771202aui64, 0x106aa07032bbd1b8ui64, - 0x19a4c116b8d2d0c8ui64, 0x1e376c085141ab53ui64, - 0x2748774cdf8eeb99ui64, 0x34b0bcb5e19b48a8ui64, - 0x391c0cb3c5c95a63ui64, 0x4ed8aa4ae3418acbui64, - 0x5b9cca4f7763e373ui64, 0x682e6ff3d6b2b8a3ui64, - 0x748f82ee5defb2fcui64, 0x78a5636f43172f60ui64, - 0x84c87814a1f0ab72ui64, 0x8cc702081a6439ecui64, - 0x90befffa23631e28ui64, 0xa4506cebde82bde9ui64, - 0xbef9a3f7b2c67915ui64, 0xc67178f2e372532bui64, - 0xca273eceea26619cui64, 0xd186b8c721c0c207ui64, - 0xeada7dd6cde0eb1eui64, 0xf57d4f7fee6ed178ui64, - 0x06f067aa72176fbaui64, 0x0a637dc5a2c898a6ui64, - 0x113f9804bef90daeui64, 0x1b710b35131c471bui64, - 0x28db77f523047d84ui64, 0x32caab7b40c72493ui64, - 0x3c9ebe0a15c9bebcui64, 0x431d67c49c100d4cui64, - 0x4cc5d4becb3e42b6ui64, 0x597f299cfc657e2aui64, - 0x5fcb6fab3ad6faecui64, 0x6c44198c4a475817ui64 - }; - // Initial hash value H for SHA-384 - const static sha_word64 sha384_initial_hash_value[8] = { - 0xcbbb9d5dc1059ed8ui64, 0x629a292a367cd507ui64, - 0x9159015a3070dd17ui64, 0x152fecd8f70e5939ui64, - 0x67332667ffc00b31ui64, 0x8eb44a8768581511ui64, - 0xdb0c2e0d64f98fa7ui64, 0x47b5481dbefa4fa4ui64 - }; - - // Initial hash value H for SHA-512 - const static sha_word64 sha512_initial_hash_value[8] = { - 0x6a09e667f3bcc908ui64, 0xbb67ae8584caa73bui64, - 0x3c6ef372fe94f82bui64, 0xa54ff53a5f1d36f1ui64, - 0x510e527fade682d1ui64, 0x9b05688c2b3e6c1fui64, - 0x1f83d9abfb41bd6bui64, 0x5be0cd19137e2179ui64 - }; -#else - const static sha_word64 K512[80] = { - 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, - 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, - 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, - 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, - 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, - 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, - 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, - 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, - 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, - 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, - 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, - 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, - 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, - 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, - 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, - 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, - 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, - 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, - 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, - 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, - 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, - 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, - 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, - 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, - 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, - 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, - 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, - 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, - 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, - 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, - 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, - 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, - 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, - 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, - 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, - 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, - 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, - 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, - 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, - 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL - }; - // Initial hash value H for SHA-384 - const static sha_word64 sha384_initial_hash_value[8] = { - 0xcbbb9d5dc1059ed8ULL, 0x629a292a367cd507ULL, - 0x9159015a3070dd17ULL, 0x152fecd8f70e5939ULL, - 0x67332667ffc00b31ULL, 0x8eb44a8768581511ULL, - 0xdb0c2e0d64f98fa7ULL, 0x47b5481dbefa4fa4ULL - }; - - // Initial hash value H for SHA-512 - const static sha_word64 sha512_initial_hash_value[8] = { - 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, - 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, - 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, - 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL - }; -#endif - -/* - * Constant used by SHA224/256/384/512_End() functions for converting the - * digest to a readable hexadecimal character string: - */ -static const char *sha_hex_digits = "0123456789abcdef"; - - -void sha2::SHA1_Internal_Transform(const sha_word32 *data) { - sha_word32 a, b, c, d, e; - sha_word32 *state = (sha_word32*)ctx.state; - sha_word32 T1, T2, *W1=(sha_word32*)ctx.buffer; - int j; - -// Initialize registers with the prev. intermediate value - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - j = 0; - do { - if (m_boolIsBigEndian) W1[j] = *data++; - else REVERSE32(*data++, W1[j]);// Copy data while converting to host byte order - T1 = ROTL32(5, a) + Ch(b, c, d) + e + K1_0_TO_19 + W1[j]; - e = d; - d = c; - c = ROTL32(30, b); - b = a; - a = T1; - j++; - } while (j < 16); - - do { - T1 = W1[(j+13)&0x0f] ^ W1[(j+8)&0x0f] ^ W1[(j+2)&0x0f] ^ W1[j&0x0f]; - if (j < 20) T2 = Ch(b,c,d) + K1_0_TO_19; - else if (j < 40) T2 = Parity(b,c,d) + K1_20_TO_39; - else if (j < 60) T2 = Maj(b,c,d) + K1_40_TO_59; - else T2 = Parity(b,c,d) + K1_60_TO_79; - T1 = ROTL32(5, a) + T2 + e + (W1[j&0x0f] = ROTL32(1, T1)); - e = d; - d = c; - c = ROTL32(30, b); - b = a; - a = T1; - j++; - } while (j < 80); - - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; -} - - - -///* SHA-256: ******************************************************** - -void sha2::SHA256_Internal_Transform(const sha_word32* data) { - sha_word32 a, b, c, d, e, f, g, h, s0, s1; - sha_word32 *state = (sha_word32*)ctx.state; - sha_word32 T1, T2, *W256=(sha_word32*)ctx.buffer;; - int j; - -// Initialize registers with the prev. intermediate value - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - f = state[5]; - g = state[6]; - h = state[7]; - - j = 0; - do { - if (m_boolIsBigEndian) W256[j] = *data++; - else REVERSE32(*data++,W256[j]);// Copy data while converting to host byte order - - T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j]; - T2 = Sigma0_256(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - - j++; - } while (j < 16); - - do { -// Part of the message block expansion: - s0 = W256[(j+1)&0x0f]; - s0 = sigma0_256(s0); - s1 = W256[(j+14)&0x0f]; - s1 = sigma1_256(s1); - -// Apply the SHA-256 compression function to update a..h - T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + - (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); - T2 = Sigma0_256(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - - j++; - } while (j < 64); - -// Compute the current intermediate hash value - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - state[5] += f; - state[6] += g; - state[7] += h; -} - -//** SHA-512: ******************************************************** - -void sha2::SHA512_Internal_Transform(const sha_word64* data) { - sha_word64 a, b, c, d, e, f, g, h, s0, s1; - sha_word64 *state = (sha_word64 *)ctx.state; - sha_word64 T1, T2, *W512 = (sha_word64*)ctx.buffer; - int j; - -// Initialize registers with the prev. intermediate value - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - f = state[5]; - g = state[6]; - h = state[7]; - - j = 0; - - do { - - if (m_boolIsBigEndian){ - W512[j] = *data; - data++; - }else{ - REVERSE64(*data++, W512[j]);// copy and convert TO host byte order - } - - T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j]; - T2 = Sigma0_512(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - - j++; - } while (j < 16); - - do { -// Part of the message block expansion: - s0 = W512[(j+1)&0x0f]; - s0 = sigma0_512(s0); - s1 = W512[(j+14)&0x0f]; - s1 = sigma1_512(s1); - -// Apply the SHA-512 compression function to update a..h - T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + - (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); - T2 = Sigma0_512(a) + Maj(a, b, c); - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - - j++; - } while (j < 80); - -// Compute the current intermediate hash value - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - state[5] += f; - state[6] += g; - state[7] += h; -} - - -void sha2::SHA256_Internal_Last(bool isSha1) { - sha_word32 usedspace; - - usedspace = (sha_word32)(ctx.bitcount[0] >> 3) % 64; - if (usedspace == 0) { - MEMSET_BZERO(ctx.buffer, 56); - ctx.buffer[0] = 0x80; - }else { - ctx.buffer[usedspace++] = 0x80; - if (usedspace <= 56) { - MEMSET_BZERO(&ctx.buffer[usedspace], 56 - usedspace); - }else { - if (usedspace < 64) { - MEMSET_BZERO(&ctx.buffer[usedspace], 64 - usedspace); - } - if (isSha1) SHA1_Internal_Transform((sha_word32*)ctx.buffer); - else SHA256_Internal_Transform((sha_word32*)ctx.buffer); - MEMSET_BZERO(ctx.buffer, 56); - } - } - - if (!m_boolIsBigEndian) REVERSE64(ctx.bitcount[0],ctx.bitcount[0]); - *(sha_word64*)&ctx.buffer[56] = ctx.bitcount[0]; - if (isSha1) SHA1_Internal_Transform((sha_word32*)ctx.buffer); - else SHA256_Internal_Transform((sha_word32*)ctx.buffer); -} - - -void sha2::SHA512_Internal_Last() { - sha_word32 usedspace; - - usedspace = (sha_word32)(ctx.bitcount[0] >> 3) % 128; - if (usedspace == 0) { - MEMSET_BZERO(ctx.buffer, 112); - ctx.buffer[0] = 0x80; - }else{ - ctx.buffer[usedspace++] = 0x80; - if (usedspace <= 112) { - MEMSET_BZERO(&ctx.buffer[usedspace], 112 - usedspace); - }else { - if (usedspace < 128) { - MEMSET_BZERO(&ctx.buffer[usedspace], 128 - usedspace); - } - SHA512_Internal_Transform((sha_word64*)ctx.buffer); - MEMSET_BZERO(ctx.buffer, 112); - } - usedspace = 0; - } - - if (!m_boolIsBigEndian){ - REVERSE64(ctx.bitcount[0],ctx.bitcount[0]); - REVERSE64(ctx.bitcount[1],ctx.bitcount[1]); - } - - *(sha_word64*)&ctx.buffer[112] = ctx.bitcount[1]; - *(sha_word64*)&ctx.buffer[120] = ctx.bitcount[0]; - SHA512_Internal_Transform((sha_word64*)ctx.buffer); -} - - - -void sha2::SHA32bit_Update(const sha_byte *data, size_t len, bool isSha1) { - sha_word32 freespace, usedspace; - - if (len<1){return;}// Calling with no data is valid - we do nothing - - usedspace = (sha_word32)(ctx.bitcount[0] >> 3) % 64; - if (usedspace > 0) {// Calculate how much free space is available in the buffer - freespace = 64 - usedspace; - if (len >= freespace) {// Fill the buffer completely and process it - MEMCPY_BCOPY(&ctx.buffer[usedspace], data, freespace); - ctx.bitcount[0] += freespace << 3; - len -= freespace; - data += freespace; - if (isSha1) SHA1_Internal_Transform((sha_word32 *)ctx.buffer); - else SHA256_Internal_Transform((sha_word32 *)ctx.buffer); - }else {// The buffer is not yet full - MEMCPY_BCOPY(&ctx.buffer[usedspace], data, len); - ctx.bitcount[0] += len << 3; - return; - } - } - while (len >= 64) {// Process as many complete blocks as we can - if (isSha1) SHA1_Internal_Transform((sha_word32*)data); - else SHA256_Internal_Transform((sha_word32*)data); - ctx.bitcount[0] += 512; - len -= 64; - data += 64; - } - if (len > 0) {// There's left-overs, so save 'em - MEMCPY_BCOPY(&ctx.buffer, data, len); - ctx.bitcount[0] += len << 3; - } -} - - - -void sha2::SHA64bit_Update(const sha_byte *data, size_t len) { - sha_word32 freespace, usedspace; - - if (len < 1){return;}// Calling with no data is valid - we do nothing - - usedspace = (sha_word32)(ctx.bitcount[0] >> 3) % 128; - if (usedspace > 0) {// Calculate how much free space is available in the buffer - freespace = 128 - usedspace; - if (len >= freespace) {// Fill the buffer completely and process it - MEMCPY_BCOPY(&ctx.buffer[usedspace], data, freespace); - ADDINC128(ctx.bitcount, freespace << 3); - len -= freespace; - data += freespace; - SHA512_Internal_Transform((sha_word64*)ctx.buffer); - }else {// The buffer is not yet full - MEMCPY_BCOPY(&ctx.buffer[usedspace], data, len); - ADDINC128(ctx.bitcount, len << 3); - return; - } - } - while (len >= 128) {// Process as many complete blocks as we can - SHA512_Internal_Transform((sha_word64*)data); - ADDINC128(ctx.bitcount, 1024); - len -= 128; - data += 128; - } - if (len > 0) {// There's left-overs, so save 'em - MEMCPY_BCOPY(ctx.buffer, data, len); - ADDINC128(ctx.bitcount, len << 3); - } -} - - -/* - * - * - * - * Public interfaces... - * - * - * - */ - -void sha2::Init(SHA_TYPE type){ - m_Type = type; - m_boolEnded = false; - MEMSET_BZERO(&ctx, sizeof(SHA_CTX)); - switch (m_Type){ - case enuSHA1 : MEMCPY_BCOPY(ctx.state, sha1_initial_hash_value, sizeof(sha_word32) * 5); break; - case enuSHA224 : MEMCPY_BCOPY(ctx.state, sha224_initial_hash_value, sizeof(sha_word32) * 8); break; - case enuSHA256 : MEMCPY_BCOPY(ctx.state, sha256_initial_hash_value, sizeof(sha_word32) * 8); break; - case enuSHA384 : MEMCPY_BCOPY(ctx.state, sha384_initial_hash_value, sizeof(sha_word64) * 8); break; - case enuSHA512 : MEMCPY_BCOPY(ctx.state, sha512_initial_hash_value, sizeof(sha_word64) * 8); break; - default : throw std::runtime_error("Invalid SHA_TYPE type!"); - } -} - - -void sha2::Update(const sha_byte* data, size_t len){ - switch (m_Type){ - case enuSHA1 : SHA32bit_Update(data, len, true); break; - case enuSHA224 : SHA32bit_Update(data, len); break; - case enuSHA256 : SHA32bit_Update(data, len); break; - case enuSHA384 : SHA64bit_Update(data, len); break; - case enuSHA512 : SHA64bit_Update(data, len); break; - default : throw std::runtime_error("Invalid SHA_TYPE type!"); - } -} - - -void sha2::End(){ - sha_byte *d = m_digest; - char *buf = m_chrHexHash; - int i, j, diglen, statecnt=8; - bool is64bit=false; - sha_word32 *state32=(sha_word32 *)ctx.state; - sha_word64 *state64=(sha_word64 *)ctx.state; - - switch (m_Type){ - case enuSHA1 : { - SHA256_Internal_Last(true); - statecnt = 5; - diglen = SHA1_DIGESTC_LENGTH; - break; - } - case enuSHA224 : { - SHA256_Internal_Last(); - diglen = SHA224_DIGESTC_LENGTH; - break; - } - case enuSHA256 : { - SHA256_Internal_Last(); - diglen = SHA256_DIGESTC_LENGTH; - break; - } - case enuSHA384 : { - SHA512_Internal_Last(); - is64bit = true; - diglen = SHA384_DIGESTC_LENGTH; - break; - } - case enuSHA512 : { - SHA512_Internal_Last(); - is64bit = true; - diglen = SHA512_DIGESTC_LENGTH; - break; - } - default : throw std::runtime_error("Invalid SHA_TYPE type!"); - } - if (m_boolIsBigEndian){ - MEMCPY_BCOPY(&m_digest, &ctx.state, diglen); - }else{ - sha_byte *dp = m_digest, *ptr; - for (i=0; i-1; --j) *dp++ = ptr[j]; - } - } - - for (i=0; i> 4]; - *buf++ = sha_hex_digits[*d & 0x0f]; - d++; - } - *buf = (char)0; - m_strHash = m_chrHexHash; - m_boolEnded = true; -} - -const string &sha2::GetHash(SHA_TYPE type, const sha_byte* data, size_t len){ - Init(type); - Update(data, len); - End(); - return m_strHash; -} - - - -const char *sha2::HexHash(){ - if (!m_boolEnded) throw std::runtime_error("Unfinished execution!"); - return m_strHash.c_str(); -} -const string &sha2::StringHash(){ - if (!m_boolEnded) throw std::runtime_error("Unfinished execution!"); - return m_strHash; -} -const char *sha2::RawHash(int &length){ - if (!m_boolEnded) throw std::runtime_error("Unfinished execution!"); - switch (m_Type){ - case enuSHA1 : length = SHA1_DIGESTC_LENGTH; break; - case enuSHA224 : length = SHA224_DIGESTC_LENGTH; break; - case enuSHA256 : length = SHA256_DIGESTC_LENGTH; break; - case enuSHA384 : length = SHA384_DIGESTC_LENGTH; break; - case enuSHA512 : length = SHA512_DIGESTC_LENGTH; break; - default : length = 0; - } - return (const char *)m_digest; -} - diff --git a/src/utils/sha2.h b/src/utils/sha2.h deleted file mode 100644 index 79f6b862..00000000 --- a/src/utils/sha2.h +++ /dev/null @@ -1,224 +0,0 @@ -/************************************************************* - - This program is a C++ implementation of the Secure Hash Algorithm (SHA) - that handles the variations from the original 160 bit to 224, 256, 384 - and 512 bit. The program is intended to be platform independant and - has been tested on little-endian (Intel) and big-endian (Sun) machines. - - This program is based on a C version written by Aaron D. Gifford - (as of 11/22/2004 his code could be found at http://www.adg.us/computers/sha.html). - Attempts to contact him were unsuccessful. I greatly condensed his version - and shared as much code and data as I could think of. I also inlined - a lot of code that were macros in his version. My version detects - endian-ness automatically and adjusts itself accordingly. This program - has been tested with Visual C++ versions 6/7 and Dev-C++ on Windows, - g++ on Linux and CC on Solaris (g++ on Solaris gave a bus error). - - While I did make half-hearted attempts to optimize as I went along - (testing on Wintel), any serious attempt at fast implementation is - probably going to need to make use of in-lined assembly which is not - very portable. - - The goal of this implementation is ease of use. As much as possible - I tried to hide implementation details while making it trivial to change - the size of the hash and get the results. The string and charactar - array value of the hash is supplied as human-readable hex; the raw value - can also be obtained. - - If you use this implementation somewhere I would like to be credited - with my work (a link to my page below is fine). I add no license - restriction beyond any that is made by the original author. This - code comes with no warrenty expressed or implied, use at your own - risk! - - Keith Oxenrider - koxenrider[at]sol[dash]biotech[dot]com - The latest version of this code should be available via the page - sol-biotech.com/code. - -*************************************************************/ - -#ifndef _TMW_UTILS_SHA2C_H -#define _TMW_UTILS_SHA2C_H - -#include -#include - -// NOTE: You may need to define things by hand for your system: -typedef unsigned char sha_byte; // Exactly 1 byte -typedef unsigned int sha_word32; // Exactly 4 bytes -#ifdef WIN32 - #include - typedef ULONG64 sha_word64; // 8-bytes (64-bits) -#else - typedef unsigned long long sha_word64; // 8-bytes (64-bits) -#endif - -// Digest lengths for SHA-1/224/256/384/512 -const sha_word32 SHA1_DIGESTC_LENGTH = 20; -const sha_word32 SHA1_DIGESTC_STRING_LENGTH = (SHA1_DIGESTC_LENGTH * 2 + 1); -const sha_word32 SHA224_DIGESTC_LENGTH = 28; -const sha_word32 SHA224_DIGESTC_STRING_LENGTH = (SHA224_DIGESTC_LENGTH * 2 + 1); -const sha_word32 SHA256_DIGESTC_LENGTH = 32; -const sha_word32 SHA256_DIGESTC_STRING_LENGTH = (SHA256_DIGESTC_LENGTH * 2 + 1); -const sha_word32 SHA384_DIGESTC_LENGTH = 48; -const sha_word32 SHA384_DIGESTC_STRING_LENGTH = (SHA384_DIGESTC_LENGTH * 2 + 1); -const sha_word32 SHA512_DIGESTC_LENGTH = 64; -const sha_word32 SHA512_DIGESTC_STRING_LENGTH = (SHA512_DIGESTC_LENGTH * 2 + 1); - -class sha2{ -public: - enum SHA_TYPE{ - enuSHA_NONE, - enuSHA1, - enuSHA160 = enuSHA1, - enuSHA224, - enuSHA256, - enuSHA384, - enuSHA512, - enuSHA_LAST //for easier looping during testing - }; - - sha2(){ - m_Type = enuSHA_NONE; - m_boolIsBigEndian = true; - m_boolEnded = false; - - //run-time check for endian-ness - unsigned int test = 1; - unsigned char *ptr = (unsigned char *)&test; - if (ptr[0]) m_boolIsBigEndian = false; - - //these checks here because I wasn't able to figure out how to - //check at compile time - if (sizeof(sha_byte) != 1) throw std::runtime_error("sha_byte != 1!"); - if (sizeof(sha_word32) != 4) throw std::runtime_error("sha_word32 != 4!"); - if (sizeof(sha_word64) != 8) throw std::runtime_error("sha_word64 != 8!"); - - memset(m_chrRawHash, 0, SHA512_DIGESTC_LENGTH); - memset(m_chrHexHash, 0, SHA512_DIGESTC_STRING_LENGTH); - memset(m_digest, 0, SHA512_DIGESTC_LENGTH); - }; - - SHA_TYPE GetEnumType(){return m_Type;}; - bool IsBigEndian(){return m_boolIsBigEndian;}; - const char * GetTypeString(){ - switch (m_Type){ - case sha2::enuSHA1 : return "SHA160"; - case sha2::enuSHA224 : return "SHA224"; - case sha2::enuSHA256 : return "SHA256"; - case sha2::enuSHA384 : return "SHA384"; - case sha2::enuSHA512 : return "SHA512"; - default : return "Unknown!"; - } - }; - -//call these three in order if you want to load chunk-by-chunk... - void Init(SHA_TYPE type); - //these two throw a std::runtime_error if the type is not defined - void Update(const sha_byte *data, size_t len);//call as many times as needed - void End(); - -//or call this one if you only have one chunk of data - const std::string &GetHash(SHA_TYPE type, const sha_byte* data, size_t len); - -//call one of these routines to access the hash - //these throw a std::runtime_error if End has not been called - const char *HexHash();//NULL terminated - const std::string &StringHash(); - const char *RawHash(int &length);//NO NULL termination! size stored in 'length' - - -private: - SHA_TYPE m_Type; - std::string m_strHash; - bool m_boolEnded, m_boolIsBigEndian; - char m_chrRawHash[SHA512_DIGESTC_LENGTH], m_chrHexHash[SHA512_DIGESTC_STRING_LENGTH]; - sha_byte m_digest[SHA512_DIGESTC_LENGTH]; - -//these are common buffers for maintaining the hash - struct SHA_CTX{ - sha_byte state[sizeof(sha_word64) * 8];//maximum size - sha_word64 bitcount[2];//sha1, 224 and 256 only use the first entry - sha_byte buffer[128]; - }ctx; - - -//** INTERNAL FUNCTION PROTOTYPES ************************************ - void SHA256_Internal_Last(bool isSha1 = false); - void SHA512_Internal_Last(); - - void SHA1_Internal_Transform(const sha_word32 *data); - void SHA256_Internal_Transform(const sha_word32* data); - void SHA512_Internal_Transform(const sha_word64*); - - void SHA32bit_Update(const sha_byte *data, size_t len, bool isSha1=false); - void SHA64bit_Update(const sha_byte *data, size_t len); - -//macro replacements - inline void MEMSET_BZERO(void *p, size_t l){memset(p, 0, l);}; - inline void MEMCPY_BCOPY(void *d,const void *s, size_t l) {memcpy(d, s, l);}; - - //For incrementally adding the unsigned 64-bit integer n to the - //unsigned 128-bit integer (represented using a two-element array of - //64-bit words): - inline void ADDINC128(sha_word64 *w, sha_word32 n) { - w[0] += (sha_word64)(n); - if (w[0] < (n)) w[1]++; - } - - // Shift-right (used in SHA-256, SHA-384, and SHA-512): - inline sha_word32 SHR(sha_word32 b,sha_word32 x){return (x >> b);}; - inline sha_word64 SHR(sha_word64 b,sha_word64 x){return (x >> b);}; - // 32-bit Rotate-right (used in SHA-256): - inline sha_word32 ROTR32(sha_word32 b,sha_word32 x){return ((x >> b) | (x << (32 - b)));}; - // 64-bit Rotate-right (used in SHA-384 and SHA-512): - inline sha_word64 ROTR64(sha_word64 b,sha_word64 x){return ((x >> b) | (x << (64 - b)));}; - // 32-bit Rotate-left (used in SHA-1): - inline sha_word32 ROTL32(sha_word32 b,sha_word32 x){return ((x << b) | (x >> (32 - b)));}; - - // Two logical functions used in SHA-1, SHA-254, SHA-256, SHA-384, and SHA-512: - inline sha_word32 Ch(sha_word32 x,sha_word32 y,sha_word32 z){return ((x & y) ^ ((~x) & z));}; - inline sha_word64 Ch(sha_word64 x,sha_word64 y,sha_word64 z){return ((x & y) ^ ((~x) & z));}; - inline sha_word32 Maj(sha_word32 x,sha_word32 y,sha_word32 z){return ((x & y) ^ (x & z) ^ (y & z));}; - inline sha_word64 Maj(sha_word64 x,sha_word64 y,sha_word64 z){return ((x & y) ^ (x & z) ^ (y & z));}; - - // Function used in SHA-1: - inline sha_word32 Parity(sha_word32 x,sha_word32 y,sha_word32 z){return (x ^ y ^ z);}; - -// Four logical functions used in SHA-256: - inline sha_word32 Sigma0_256(sha_word32 x){return (ROTR32(2, x) ^ ROTR32(13, x) ^ ROTR32(22, x));}; - inline sha_word32 Sigma1_256(sha_word32 x){return (ROTR32(6, x) ^ ROTR32(11, x) ^ ROTR32(25, x));}; - inline sha_word32 sigma0_256(sha_word32 x){return (ROTR32(7, x) ^ ROTR32(18, x) ^ SHR( 3 , x));}; - inline sha_word32 sigma1_256(sha_word32 x){return (ROTR32(17,x) ^ ROTR32(19, x) ^ SHR( 10, x));}; - -// Four of six logical functions used in SHA-384 and SHA-512: - inline sha_word64 Sigma0_512(sha_word64 x){return (ROTR64(28, x) ^ ROTR64(34, x) ^ ROTR64(39, x));}; - inline sha_word64 Sigma1_512(sha_word64 x){return (ROTR64(14, x) ^ ROTR64(18, x) ^ ROTR64(41, x));}; - inline sha_word64 sigma0_512(sha_word64 x){return (ROTR64( 1, x) ^ ROTR64( 8, x) ^ SHR( 7, x));}; - inline sha_word64 sigma1_512(sha_word64 x){return (ROTR64(19, x) ^ ROTR64(61, x) ^ SHR( 6, x));}; - - inline void REVERSE32(sha_word32 w, sha_word32 &x) { - w = (w >> 16) | (w << 16); - x = ((w & 0xff00ff00UL) >> 8) | ((w & 0x00ff00ffUL) << 8); - } - #ifdef _VC6 - inline void REVERSE64(sha_word64 w, sha_word64 &x) { - w = (w >> 32) | (w << 32); - w = ((w & 0xff00ff00ff00ff00ui64) >> 8) | - ((w & 0x00ff00ff00ff00ffui64) << 8); - (x) = ((w & 0xffff0000ffff0000ui64) >> 16) | - ((w & 0x0000ffff0000ffffui64) << 16); - } - #else - inline void REVERSE64(sha_word64 w, sha_word64 &x) { - w = (w >> 32) | (w << 32); - w = ((w & 0xff00ff00ff00ff00ULL) >> 8) | - ((w & 0x00ff00ff00ff00ffULL) << 8); - (x) = ((w & 0xffff0000ffff0000ULL) >> 16) | - ((w & 0x0000ffff0000ffffULL) << 16); - } - #endif - -};//end class sha2 -#endif // __SHA2C_H__ diff --git a/src/utils/sha256.cpp b/src/utils/sha256.cpp new file mode 100644 index 00000000..0cedcc89 --- /dev/null +++ b/src/utils/sha256.cpp @@ -0,0 +1,276 @@ +/* + * The Mana World + * Copyright 2008 The Mana World Development Team + * + * This file has been slighly modified as part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2008 InspIRCd Development Team + * See: http://www.inspircd.org/wiki/index.php/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +/* m_sha256 - Based on m_opersha256 written by Special + * Modified and improved by Craig Edwards, December 2006. + * + * + * FIPS 180-2 SHA-224/256/384/512 implementation + * Last update: 05/23/2005 + * Issue date: 04/30/2005 + * + * Copyright (C) 2005 Olivier Gay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "sha256.h" + +#ifdef HAS_STDINT +#include +#endif +#ifndef HAS_STDINT +typedef unsigned int uint32_t; +#endif + +#define SHA256_BLOCK_SIZE (512 / 8) + +/** An sha 256 context, used by original m_opersha256 */ +class SHA256Context +{ + public: + unsigned int tot_len; + unsigned int len; + unsigned char block[2 * SHA256_BLOCK_SIZE]; + uint32_t h[8]; +}; + +#define SHA256_DIGEST_SIZE (256 / 8) + +#define SHFR(x, n) (x >> n) +#define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) +#define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) +#define CH(x, y, z) ((x & y) ^ (~x & z)) +#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) + +#define SHA256_F1(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define SHA256_F2(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) +#define SHA256_F3(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHFR(x, 3)) +#define SHA256_F4(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHFR(x, 10)) + +#define UNPACK32(x, str) \ +{ \ + *((str) + 3) = (uint8_t) ((x) ); \ + *((str) + 2) = (uint8_t) ((x) >> 8); \ + *((str) + 1) = (uint8_t) ((x) >> 16); \ + *((str) + 0) = (uint8_t) ((x) >> 24); \ +} + +#define PACK32(str, x) \ +{ \ + *(x) = ((uint32_t) *((str) + 3) ) \ + | ((uint32_t) *((str) + 2) << 8) \ + | ((uint32_t) *((str) + 1) << 16) \ + | ((uint32_t) *((str) + 0) << 24); \ +} + +/* Macros used for loops unrolling */ + +#define SHA256_SCR(i) \ +{ \ + w[i] = SHA256_F4(w[i - 2]) + w[i - 7] \ + + SHA256_F3(w[i - 15]) + w[i - 16]; \ +} + +const unsigned int sha256_h0[8] = +{ + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 +}; + +uint32_t sha256_k[64] = +{ + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +void SHA256Init(SHA256Context *ctx) +{ + for (int i = 0; i < 8; i++) + ctx->h[i] = sha256_h0[i]; + ctx->len = 0; + ctx->tot_len = 0; +} + +void SHA256Transform(SHA256Context *ctx, + unsigned char *message, + unsigned int block_nb) +{ + uint32_t w[64]; + uint32_t wv[8]; + unsigned char *sub_block; + for (unsigned int i = 1; i <= block_nb; i++) + { + int j; + sub_block = message + ((i - 1) << 6); + + for (j = 0; j < 16; j++) + PACK32(&sub_block[j << 2], &w[j]); + for (j = 16; j < 64; j++) + SHA256_SCR(j); + for (j = 0; j < 8; j++) + wv[j] = ctx->h[j]; + for (j = 0; j < 64; j++) + { + uint32_t t1 = wv[7] + SHA256_F2(wv[4]) + CH(wv[4], wv[5], wv[6]) + sha256_k[j] + w[j]; + uint32_t t2 = SHA256_F1(wv[0]) + MAJ(wv[0], wv[1], wv[2]); + wv[7] = wv[6]; + wv[6] = wv[5]; + wv[5] = wv[4]; + wv[4] = wv[3] + t1; + wv[3] = wv[2]; + wv[2] = wv[1]; + wv[1] = wv[0]; + wv[0] = t1 + t2; + } + for (j = 0; j < 8; j++) + ctx->h[j] += wv[j]; + } +} + +void SHA256Update(SHA256Context *ctx, + unsigned char *message, + unsigned int len) +{ + /* + * XXX here be dragons! + * After many hours of pouring over this, I think I've found the problem. + * When Special created our module from the reference one, he used: + * + * unsigned int rem_len = SHA256_BLOCK_SIZE - ctx->len; + * + * instead of the reference's version of: + * + * unsigned int tmp_len = SHA256_BLOCK_SIZE - ctx->len; + * unsigned int rem_len = len < tmp_len ? len : tmp_len; + * + * I've changed back to the reference version of this code, and it seems to work with no errors. + * So I'm inclined to believe this was the problem.. + * -- w00t (January 06, 2008) + */ + unsigned int tmp_len = SHA256_BLOCK_SIZE - ctx->len; + unsigned int rem_len = len < tmp_len ? len : tmp_len; + + memcpy(&ctx->block[ctx->len], message, rem_len); + if (ctx->len + len < SHA256_BLOCK_SIZE) + { + ctx->len += len; + return; + } + unsigned int new_len = len - rem_len; + unsigned int block_nb = new_len / SHA256_BLOCK_SIZE; + unsigned char *shifted_message = message + rem_len; + SHA256Transform(ctx, ctx->block, 1); + SHA256Transform(ctx, shifted_message, block_nb); + rem_len = new_len % SHA256_BLOCK_SIZE; + memcpy(ctx->block, &shifted_message[block_nb << 6],rem_len); + ctx->len = rem_len; + ctx->tot_len += (block_nb + 1) << 6; +} + +void SHA256Final(SHA256Context *ctx, unsigned char *digest) +{ + unsigned int block_nb = (1 + ((SHA256_BLOCK_SIZE - 9) < (ctx->len % SHA256_BLOCK_SIZE))); + unsigned int len_b = (ctx->tot_len + ctx->len) << 3; + unsigned int pm_len = block_nb << 6; + memset(ctx->block + ctx->len, 0, pm_len - ctx->len); + ctx->block[ctx->len] = 0x80; + UNPACK32(len_b, ctx->block + pm_len - 4); + SHA256Transform(ctx, ctx->block, block_nb); + for (int i = 0 ; i < 8; i++) + UNPACK32(ctx->h[i], &digest[i << 2]); +} + +std::string SHA256Hash(const char *src, int len) +{ + // Generate the hash + unsigned char bytehash[SHA256_DIGEST_SIZE]; + SHA256Context ctx; + SHA256Init(&ctx); + SHA256Update(&ctx, (unsigned char *)src, (unsigned int)len); + SHA256Final(&ctx, bytehash); + // Convert it to hex + const char* hxc = "0123456789abcdef"; + std::string hash = ""; + for (int i = 0; i < SHA256_DIGEST_SIZE; i++) + { + hash += hxc[bytehash[i] / 16]; + hash += hxc[bytehash[i] % 16]; + } + return hash; +} + +std::string sha256(const std::string& string) +{ + return SHA256Hash(string.c_str(), string.length()); +} diff --git a/src/utils/sha256.h b/src/utils/sha256.h new file mode 100644 index 00000000..c03efc0c --- /dev/null +++ b/src/utils/sha256.h @@ -0,0 +1,37 @@ +/* + * The Mana World + * Copyright 2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifndef _TMW_UTILS_SHA256_H_ +#define _TMW_UTILS_SHA256_H_ + +#include + +/** + * Returns the SHA-256 hash for the given string. + * + * @param string the string to create the SHA-256 hash for + * @return the SHA-256 hash for the given string. + */ +std::string sha256(const std::string& string); + +#endif // _TMW_UTILS_SHA256_H_ -- cgit v1.2.3-70-g09d2 From 9f31058dbe774d84139c77332a6443151b66f5e6 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Thu, 22 May 2008 17:44:11 +0000 Subject: Fix compile errors when compiling with GCC 4.3 (patch by rodge) --- ChangeLog | 5 +++++ src/gui/widgets/tab.cpp | 2 ++ src/utils/sha256.cpp | 1 + 3 files changed, 8 insertions(+) (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 236d975d..b44d0185 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-05-22 Roderic Morris + + * src/gui/widgets/tab.cpp, src/utils/sha256.cpp: Fix compile errors + when compiling with GCC 4.3. + 2008-05-20 Bjørn Lindeijer * INSTALL: Mention Subversion instead of CVS. diff --git a/src/gui/widgets/tab.cpp b/src/gui/widgets/tab.cpp index 4bb85946..990c6a95 100644 --- a/src/gui/widgets/tab.cpp +++ b/src/gui/widgets/tab.cpp @@ -21,6 +21,8 @@ * $Id$ */ +#include + #include "tab.h" #include "tabbedarea.h" diff --git a/src/utils/sha256.cpp b/src/utils/sha256.cpp index 0cedcc89..209d4f96 100644 --- a/src/utils/sha256.cpp +++ b/src/utils/sha256.cpp @@ -71,6 +71,7 @@ */ #include "sha256.h" +#include #ifdef HAS_STDINT #include -- cgit v1.2.3-70-g09d2 From ef36048760f80708ac1eaccbc2a21e7a700dc2ab Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Thu, 4 Sep 2008 20:09:57 +0000 Subject: Introduced another template to make deleting all values in a container easier. Inspired by qDeleteAll() from Qt. --- ChangeLog | 12 +++++++++++- src/being.cpp | 3 +-- src/beingmanager.cpp | 3 +-- src/channelmanager.cpp | 3 +-- src/flooritemmanager.cpp | 4 +--- src/gui/setup.cpp | 2 +- src/gui/shop.cpp | 4 +--- src/gui/skill.cpp | 4 +--- src/gui/windowcontainer.cpp | 4 +--- src/map.cpp | 9 ++++----- src/resources/imageset.cpp | 4 +--- src/resources/itemdb.cpp | 3 +-- src/resources/monsterinfo.cpp | 4 +--- src/utils/dtor.h | 7 +++++++ 14 files changed, 33 insertions(+), 33 deletions(-) (limited to 'src/utils') diff --git a/ChangeLog b/ChangeLog index 1b9e866e..c76d1db8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-09-04 Bjørn Lindeijer + + * src/map.cpp, src/gui/setup.cpp, src/gui/shop.cpp, + src/gui/windowcontainer.cpp, src/gui/skill.cpp, src/beingmanager.cpp, + src/flooritemmanager.cpp, src/channelmanager.cpp, src/being.cpp, + src/utils/dtor.h, src/resources/imageset.cpp, + src/resources/monsterinfo.cpp, src/resources/itemdb.cpp: Introduced + another template to make deleting all values in a container easier. + Inspired by qDeleteAll() from Qt. + 2008-08-20 Roderic Morris * src/gui/guildlistbox.cpp, src/gui/guildwindow.h, @@ -10,7 +20,7 @@ src/net/guildhandler.h, src/net/partyhandler.cpp, src/net/guildhandler.cpp, src/net/chatserver/party.cpp, src/net/chatserver/guild.cpp, src/net/chatserver/party.h, - src/net/chatserver/guild.h, src/winver.h: fix svn properties and + src/net/chatserver/guild.h, src/winver.h: Fix svn properties and id tags. 2008-08-19 Bjørn Lindeijer diff --git a/src/being.cpp b/src/being.cpp index 2f7debfd..cf2e3772 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -22,7 +22,6 @@ */ #include "being.h" -#include #include #include @@ -84,7 +83,7 @@ Being::Being(int id, int job, Map *map): Being::~Being() { - std::for_each(mSprites.begin(), mSprites.end(), make_dtor(mSprites)); + delete_all(mSprites); clearPath(); for ( std::list::iterator i = mChildParticleEffects.begin(); diff --git a/src/beingmanager.cpp b/src/beingmanager.cpp index 214a1995..a58c97e7 100644 --- a/src/beingmanager.cpp +++ b/src/beingmanager.cpp @@ -21,7 +21,6 @@ * $Id$ */ -#include #include #include "beingmanager.h" @@ -148,7 +147,7 @@ void BeingManager::clear() mBeings.remove(player_node); } - for_each(mBeings.begin(), mBeings.end(), make_dtor(mBeings)); + delete_all(mBeings); mBeings.clear(); if (player_node) diff --git a/src/channelmanager.cpp b/src/channelmanager.cpp index 91c20e98..3c66f4bb 100644 --- a/src/channelmanager.cpp +++ b/src/channelmanager.cpp @@ -21,7 +21,6 @@ * $Id$ */ -#include #include #include "channelmanager.h" @@ -36,7 +35,7 @@ ChannelManager::ChannelManager() ChannelManager::~ChannelManager() { - for_each(mChannels.begin(), mChannels.end(), make_dtor(mChannels)); + delete_all(mChannels); mChannels.clear(); } diff --git a/src/flooritemmanager.cpp b/src/flooritemmanager.cpp index 8a00cc51..c28755fb 100644 --- a/src/flooritemmanager.cpp +++ b/src/flooritemmanager.cpp @@ -21,8 +21,6 @@ * $Id$ */ -#include - #include "flooritemmanager.h" #include "floor_item.h" @@ -50,7 +48,7 @@ void FloorItemManager::destroy(FloorItem *item) void FloorItemManager::clear() { - for_each(mFloorItems.begin(), mFloorItems.end(), make_dtor(mFloorItems)); + delete_all(mFloorItems); mFloorItems.clear(); } diff --git a/src/gui/setup.cpp b/src/gui/setup.cpp index 22b91ed4..53e7a9f1 100644 --- a/src/gui/setup.cpp +++ b/src/gui/setup.cpp @@ -92,7 +92,7 @@ Setup::Setup(): Setup::~Setup() { - for_each(mTabs.begin(), mTabs.end(), make_dtor(mTabs)); + delete_all(mTabs); } void Setup::action(const gcn::ActionEvent &event) diff --git a/src/gui/shop.cpp b/src/gui/shop.cpp index effe8858..c5e257da 100644 --- a/src/gui/shop.cpp +++ b/src/gui/shop.cpp @@ -25,8 +25,6 @@ #include "../utils/dtor.h" -#include - ShopItems::~ShopItems() { clear(); @@ -59,7 +57,7 @@ ShopItem* ShopItems::at(int i) void ShopItems::clear() { - std::for_each(mShopItems.begin(), mShopItems.end(), make_dtor(mShopItems)); + delete_all(mShopItems); mShopItems.clear(); } diff --git a/src/gui/skill.cpp b/src/gui/skill.cpp index 6cc7a294..49037cbd 100644 --- a/src/gui/skill.cpp +++ b/src/gui/skill.cpp @@ -21,8 +21,6 @@ * $Id$ */ -#include - #include #include #include @@ -78,7 +76,7 @@ SkillDialog::SkillDialog(): SkillDialog::~SkillDialog() { - for_each(mTabs.begin(), mTabs.end(), make_dtor(mTabs)); + delete_all(mTabs); } void SkillDialog::action(const gcn::ActionEvent &event) diff --git a/src/gui/windowcontainer.cpp b/src/gui/windowcontainer.cpp index d10c519c..006dbf44 100644 --- a/src/gui/windowcontainer.cpp +++ b/src/gui/windowcontainer.cpp @@ -21,15 +21,13 @@ * $Id$ */ -#include - #include "windowcontainer.h" #include "../utils/dtor.h" void WindowContainer::logic() { - for_each(mDeathList.begin(), mDeathList.end(), make_dtor(mDeathList)); + delete_all(mDeathList); mDeathList.clear(); gcn::Container::logic(); diff --git a/src/map.cpp b/src/map.cpp index 28d07022..888ea3a8 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -23,7 +23,6 @@ #include "map.h" -#include #include #include @@ -161,13 +160,13 @@ Map::~Map() { // delete metadata, layers, tilesets and overlays delete[] mMetaTiles; - for (int i=0; i < NB_BLOCKTYPES; i++) + for (int i = 0; i < NB_BLOCKTYPES; i++) { delete[] mOccupation[i]; } - for_each(mLayers.begin(), mLayers.end(), make_dtor(mLayers)); - for_each(mTilesets.begin(), mTilesets.end(), make_dtor(mTilesets)); - for_each(mOverlays.begin(), mOverlays.end(), make_dtor(mOverlays)); + delete_all(mLayers); + delete_all(mTilesets); + delete_all(mOverlays); } void Map::initializeOverlays() diff --git a/src/resources/imageset.cpp b/src/resources/imageset.cpp index 5618abfa..04faf0a3 100644 --- a/src/resources/imageset.cpp +++ b/src/resources/imageset.cpp @@ -21,8 +21,6 @@ * $Id$ */ -#include - #include "imageset.h" #include "../log.h" @@ -46,7 +44,7 @@ ImageSet::ImageSet(Image *img, int width, int height) ImageSet::~ImageSet() { - for_each(mImages.begin(), mImages.end(), make_dtor(mImages)); + delete_all(mImages); } Image* diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index ada9482f..202f4ba7 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -21,7 +21,6 @@ * $Id$ */ -#include #include #include @@ -196,7 +195,7 @@ void ItemDB::unload() delete mUnknown; mUnknown = NULL; - for_each(mItemInfos.begin(), mItemInfos.end(), make_dtor(mItemInfos)); + delete_all(mItemInfos); mItemInfos.clear(); mLoaded = false; } diff --git a/src/resources/monsterinfo.cpp b/src/resources/monsterinfo.cpp index 0af09c53..263810de 100644 --- a/src/resources/monsterinfo.cpp +++ b/src/resources/monsterinfo.cpp @@ -21,8 +21,6 @@ * $Id$ */ -#include - #include "monsterinfo.h" #include "../utils/dtor.h" @@ -35,7 +33,7 @@ MonsterInfo::MonsterInfo(): MonsterInfo::~MonsterInfo() { // kill vectors in mSoundEffects - for_each(mSounds.begin(), mSounds.end(), make_dtor(mSounds)); + delete_all(mSounds); mSounds.clear(); } diff --git a/src/utils/dtor.h b/src/utils/dtor.h index f2c6c1b8..516fd916 100644 --- a/src/utils/dtor.h +++ b/src/utils/dtor.h @@ -24,6 +24,7 @@ #ifndef _TMW_UTILS_DTOR_H #define _TMW_UTILS_DTOR_H +#include #include #include @@ -46,4 +47,10 @@ inline dtor make_dtor(Cont const&) return dtor(); } +template +inline void delete_all(Container &c) +{ + std::for_each(c.begin(), c.end(), make_dtor(c)); +} + #endif -- cgit v1.2.3-70-g09d2 From ff61662640c4053220464f34413568f06f51154a Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Sun, 16 Nov 2008 15:37:13 +0100 Subject: Got rid of CVS/Subversion $Id$ markers I don't know why we dealt with these things for so long. Did we ever get anything out of it? --- src/animatedsprite.cpp | 2 -- src/animatedsprite.h | 2 -- src/animationparticle.cpp | 1 - src/animationparticle.h | 1 - src/being.cpp | 2 -- src/being.h | 2 -- src/beingmanager.cpp | 2 -- src/beingmanager.h | 2 -- src/channel.cpp | 2 -- src/channel.h | 2 -- src/channelmanager.cpp | 2 -- src/channelmanager.h | 2 -- src/commandhandler.cpp | 2 -- src/commandhandler.h | 2 -- src/configlistener.h | 2 -- src/configuration.cpp | 2 -- src/configuration.h | 2 -- src/effectmanager.cpp | 1 - src/effectmanager.h | 1 - src/engine.cpp | 2 -- src/engine.h | 2 -- src/equipment.cpp | 2 -- src/equipment.h | 2 -- src/floor_item.cpp | 2 -- src/floor_item.h | 2 -- src/flooritemmanager.cpp | 2 -- src/flooritemmanager.h | 2 -- src/game.cpp | 2 -- src/game.h | 2 -- src/graphics.cpp | 2 -- src/graphics.h | 2 -- src/gui/box.cpp | 2 -- src/gui/box.h | 2 -- src/gui/browserbox.cpp | 2 -- src/gui/browserbox.h | 2 -- src/gui/buddywindow.cpp | 2 -- src/gui/buddywindow.h | 2 -- src/gui/button.cpp | 2 -- src/gui/button.h | 2 -- src/gui/buy.cpp | 2 -- src/gui/buy.h | 2 -- src/gui/buysell.cpp | 2 -- src/gui/buysell.h | 2 -- src/gui/changeemaildialog.cpp | 2 -- src/gui/changeemaildialog.h | 2 -- src/gui/changepassworddialog.cpp | 2 -- src/gui/changepassworddialog.h | 2 -- src/gui/char_select.cpp | 2 -- src/gui/char_select.h | 2 -- src/gui/chargedialog.cpp | 1 - src/gui/chargedialog.h | 1 - src/gui/chat.cpp | 2 -- src/gui/chat.h | 2 -- src/gui/chatinput.cpp | 2 -- src/gui/chatinput.h | 2 -- src/gui/checkbox.cpp | 2 -- src/gui/checkbox.h | 2 -- src/gui/confirm_dialog.cpp | 2 -- src/gui/confirm_dialog.h | 2 -- src/gui/connection.cpp | 2 -- src/gui/connection.h | 2 -- src/gui/debugwindow.cpp | 2 -- src/gui/debugwindow.h | 2 -- src/gui/equipmentwindow.cpp | 2 -- src/gui/equipmentwindow.h | 2 -- src/gui/focushandler.cpp | 2 -- src/gui/focushandler.h | 2 -- src/gui/gccontainer.cpp | 2 -- src/gui/gccontainer.h | 2 -- src/gui/gui.cpp | 2 -- src/gui/gui.h | 2 -- src/gui/guildlistbox.cpp | 2 -- src/gui/guildlistbox.h | 2 -- src/gui/guildwindow.cpp | 1 - src/gui/guildwindow.h | 2 -- src/gui/hbox.cpp | 2 -- src/gui/hbox.h | 2 -- src/gui/help.cpp | 2 -- src/gui/help.h | 2 -- src/gui/icon.cpp | 2 -- src/gui/icon.h | 2 -- src/gui/inttextbox.cpp | 2 -- src/gui/inttextbox.h | 2 -- src/gui/inventorywindow.cpp | 2 -- src/gui/inventorywindow.h | 2 -- src/gui/item_amount.cpp | 2 -- src/gui/item_amount.h | 2 -- src/gui/itemcontainer.cpp | 2 -- src/gui/itemcontainer.h | 2 -- src/gui/itempopup.cpp | 2 -- src/gui/itempopup.h | 3 --- src/gui/itemshortcutcontainer.cpp | 2 -- src/gui/itemshortcutcontainer.h | 2 -- src/gui/itemshortcutwindow.cpp | 2 -- src/gui/itemshortcutwindow.h | 2 -- src/gui/linkhandler.h | 2 -- src/gui/listbox.cpp | 2 -- src/gui/listbox.h | 2 -- src/gui/login.cpp | 2 -- src/gui/login.h | 2 -- src/gui/magic.cpp | 2 -- src/gui/magic.h | 3 --- src/gui/menuwindow.cpp | 2 -- src/gui/menuwindow.h | 2 -- src/gui/minimap.cpp | 2 -- src/gui/minimap.h | 2 -- src/gui/ministatus.cpp | 2 -- src/gui/ministatus.h | 2 -- src/gui/newskill.cpp | 2 -- src/gui/newskill.h | 2 -- src/gui/npc_text.cpp | 2 -- src/gui/npc_text.h | 2 -- src/gui/npclistdialog.cpp | 2 -- src/gui/npclistdialog.h | 2 -- src/gui/npcpostdialog.cpp | 2 -- src/gui/npcpostdialog.h | 2 -- src/gui/ok_dialog.cpp | 2 -- src/gui/ok_dialog.h | 2 -- src/gui/partywindow.cpp | 2 -- src/gui/partywindow.h | 2 -- src/gui/passwordfield.cpp | 2 -- src/gui/passwordfield.h | 2 -- src/gui/playerbox.cpp | 2 -- src/gui/playerbox.h | 2 -- src/gui/popupmenu.cpp | 2 -- src/gui/popupmenu.h | 2 -- src/gui/progressbar.cpp | 2 -- src/gui/progressbar.h | 2 -- src/gui/quitdialog.cpp | 1 - src/gui/quitdialog.h | 1 - src/gui/radiobutton.cpp | 2 -- src/gui/radiobutton.h | 2 -- src/gui/register.cpp | 2 -- src/gui/register.h | 2 -- src/gui/scrollarea.cpp | 2 -- src/gui/scrollarea.h | 2 -- src/gui/sdlinput.cpp | 2 -- src/gui/sdlinput.h | 2 -- src/gui/sell.cpp | 2 -- src/gui/sell.h | 2 -- src/gui/serverdialog.cpp | 2 -- src/gui/serverdialog.h | 2 -- src/gui/setup.cpp | 2 -- src/gui/setup.h | 2 -- src/gui/setup_audio.cpp | 2 -- src/gui/setup_audio.h | 2 -- src/gui/setup_joystick.cpp | 2 -- src/gui/setup_joystick.h | 2 -- src/gui/setup_keyboard.cpp | 2 -- src/gui/setup_keyboard.h | 2 -- src/gui/setup_video.cpp | 2 -- src/gui/setup_video.h | 2 -- src/gui/setuptab.h | 2 -- src/gui/shop.cpp | 2 -- src/gui/shop.h | 2 -- src/gui/shoplistbox.cpp | 2 -- src/gui/shoplistbox.h | 2 -- src/gui/skill.cpp | 2 -- src/gui/skill.h | 2 -- src/gui/slider.cpp | 2 -- src/gui/slider.h | 2 -- src/gui/speechbubble.cpp | 2 -- src/gui/speechbubble.h | 2 -- src/gui/status.cpp | 2 -- src/gui/status.h | 2 -- src/gui/textbox.cpp | 2 -- src/gui/textbox.h | 2 -- src/gui/textdialog.cpp | 2 -- src/gui/textdialog.h | 2 -- src/gui/textfield.cpp | 2 -- src/gui/textfield.h | 2 -- src/gui/trade.cpp | 2 -- src/gui/trade.h | 2 -- src/gui/truetypefont.cpp | 2 -- src/gui/truetypefont.h | 2 -- src/gui/unregisterdialog.cpp | 2 -- src/gui/unregisterdialog.h | 2 -- src/gui/updatewindow.cpp | 2 -- src/gui/updatewindow.h | 2 -- src/gui/vbox.cpp | 2 -- src/gui/vbox.h | 2 -- src/gui/viewport.cpp | 2 -- src/gui/viewport.h | 2 -- src/gui/widgets/avatar.cpp | 2 -- src/gui/widgets/avatar.h | 2 -- src/gui/widgets/dropdown.cpp | 2 -- src/gui/widgets/dropdown.h | 2 -- src/gui/widgets/layout.cpp | 2 -- src/gui/widgets/layout.h | 2 -- src/gui/widgets/resizegrip.cpp | 2 -- src/gui/widgets/resizegrip.h | 2 -- src/gui/widgets/tab.cpp | 2 -- src/gui/widgets/tab.h | 2 -- src/gui/widgets/tabbedarea.cpp | 2 -- src/gui/widgets/tabbedarea.h | 2 -- src/gui/window.cpp | 2 -- src/gui/window.h | 2 -- src/gui/windowcontainer.cpp | 2 -- src/gui/windowcontainer.h | 2 -- src/guichanfwd.h | 2 -- src/guild.cpp | 2 -- src/guild.h | 2 -- src/imageparticle.cpp | 2 -- src/imageparticle.h | 2 -- src/inventory.cpp | 2 -- src/inventory.h | 2 -- src/item.cpp | 2 -- src/item.h | 2 -- src/itemshortcut.cpp | 2 -- src/itemshortcut.h | 2 -- src/joystick.cpp | 2 -- src/joystick.h | 2 -- src/keyboardconfig.cpp | 2 -- src/keyboardconfig.h | 2 -- src/localplayer.cpp | 2 -- src/localplayer.h | 2 -- src/lockedarray.h | 2 -- src/logindata.h | 2 -- src/main.cpp | 2 -- src/main.h | 2 -- src/map.cpp | 2 -- src/map.h | 2 -- src/monster.cpp | 2 -- src/monster.h | 2 -- src/net/accountserver/account.cpp | 2 -- src/net/accountserver/account.h | 2 -- src/net/accountserver/accountserver.cpp | 2 -- src/net/accountserver/accountserver.h | 2 -- src/net/accountserver/internal.cpp | 2 -- src/net/accountserver/internal.h | 2 -- src/net/beinghandler.cpp | 2 -- src/net/beinghandler.h | 2 -- src/net/buysellhandler.cpp | 2 -- src/net/buysellhandler.h | 2 -- src/net/charserverhandler.cpp | 2 -- src/net/charserverhandler.h | 2 -- src/net/chathandler.cpp | 2 -- src/net/chathandler.h | 2 -- src/net/chatserver/chatserver.cpp | 2 -- src/net/chatserver/chatserver.h | 2 -- src/net/chatserver/guild.cpp | 2 -- src/net/chatserver/guild.h | 2 -- src/net/chatserver/internal.cpp | 2 -- src/net/chatserver/internal.h | 2 -- src/net/chatserver/party.cpp | 2 -- src/net/chatserver/party.h | 2 -- src/net/connection.cpp | 2 -- src/net/connection.h | 2 -- src/net/effecthandler.cpp | 1 - src/net/effecthandler.h | 1 - src/net/gameserver/gameserver.cpp | 2 -- src/net/gameserver/gameserver.h | 2 -- src/net/gameserver/internal.cpp | 2 -- src/net/gameserver/internal.h | 2 -- src/net/gameserver/player.cpp | 2 -- src/net/gameserver/player.h | 2 -- src/net/guildhandler.cpp | 2 -- src/net/guildhandler.h | 2 -- src/net/internal.cpp | 2 -- src/net/internal.h | 2 -- src/net/inventoryhandler.cpp | 2 -- src/net/inventoryhandler.h | 2 -- src/net/itemhandler.cpp | 2 -- src/net/itemhandler.h | 2 -- src/net/loginhandler.cpp | 2 -- src/net/loginhandler.h | 2 -- src/net/logouthandler.cpp | 2 -- src/net/logouthandler.h | 2 -- src/net/messagehandler.cpp | 2 -- src/net/messagehandler.h | 2 -- src/net/messagein.cpp | 2 -- src/net/messagein.h | 2 -- src/net/messageout.cpp | 2 -- src/net/messageout.h | 2 -- src/net/network.cpp | 2 -- src/net/network.h | 2 -- src/net/npchandler.cpp | 2 -- src/net/npchandler.h | 2 -- src/net/partyhandler.cpp | 2 -- src/net/partyhandler.h | 2 -- src/net/playerhandler.cpp | 2 -- src/net/playerhandler.h | 2 -- src/net/protocol.h | 2 -- src/net/tradehandler.cpp | 2 -- src/net/tradehandler.h | 2 -- src/npc.cpp | 2 -- src/npc.h | 2 -- src/openglgraphics.cpp | 2 -- src/openglgraphics.h | 2 -- src/particle.cpp | 2 -- src/particle.h | 2 -- src/particleemitter.cpp | 2 -- src/particleemitter.h | 2 -- src/player.cpp | 2 -- src/player.h | 2 -- src/position.cpp | 2 -- src/position.h | 2 -- src/properties.h | 2 -- src/resources/action.cpp | 2 -- src/resources/action.h | 2 -- src/resources/ambientoverlay.cpp | 2 -- src/resources/ambientoverlay.h | 2 -- src/resources/animation.cpp | 2 -- src/resources/animation.h | 2 -- src/resources/buddylist.cpp | 2 -- src/resources/buddylist.h | 2 -- src/resources/dye.cpp | 2 -- src/resources/dye.h | 2 -- src/resources/image.cpp | 2 -- src/resources/image.h | 2 -- src/resources/imageloader.cpp | 2 -- src/resources/imageloader.h | 2 -- src/resources/imageset.cpp | 2 -- src/resources/imageset.h | 2 -- src/resources/imagewriter.cpp | 2 -- src/resources/imagewriter.h | 2 -- src/resources/itemdb.cpp | 2 -- src/resources/itemdb.h | 2 -- src/resources/iteminfo.cpp | 2 -- src/resources/iteminfo.h | 2 -- src/resources/mapreader.cpp | 2 -- src/resources/mapreader.h | 2 -- src/resources/monsterdb.cpp | 2 -- src/resources/monsterdb.h | 2 -- src/resources/monsterinfo.cpp | 2 -- src/resources/monsterinfo.h | 2 -- src/resources/music.cpp | 2 -- src/resources/music.h | 2 -- src/resources/npcdb.cpp | 2 -- src/resources/npcdb.h | 2 -- src/resources/resource.cpp | 2 -- src/resources/resource.h | 2 -- src/resources/resourcemanager.cpp | 2 -- src/resources/resourcemanager.h | 2 -- src/resources/soundeffect.cpp | 2 -- src/resources/soundeffect.h | 2 -- src/resources/spritedef.cpp | 2 -- src/resources/spritedef.h | 2 -- src/serverinfo.h | 2 -- src/shopitem.cpp | 2 -- src/shopitem.h | 2 -- src/simpleanimation.cpp | 2 -- src/simpleanimation.h | 2 -- src/sound.cpp | 2 -- src/sound.h | 2 -- src/sprite.h | 2 -- src/textparticle.cpp | 2 -- src/textparticle.h | 2 -- src/tileset.h | 2 -- src/utils/base64.cpp | 1 - src/utils/base64.h | 1 - src/utils/dtor.h | 2 -- src/utils/fastsqrt.h | 2 -- src/utils/gettext.h | 2 -- src/utils/minmax.h | 2 -- src/utils/sha256.cpp | 2 -- src/utils/sha256.h | 2 -- src/utils/strprintf.cpp | 2 -- src/utils/strprintf.h | 2 -- src/utils/tostring.h | 2 -- src/utils/trim.h | 2 -- src/utils/xml.cpp | 2 -- src/utils/xml.h | 2 -- src/vector.cpp | 2 -- src/vector.h | 2 -- tools/dyecmd/src/dye.cpp | 2 -- tools/dyecmd/src/dye.h | 2 -- tools/dyecmd/src/dyecmd.cpp | 2 -- tools/dyecmd/src/imagewriter.cpp | 2 -- tools/dyecmd/src/imagewriter.h | 2 -- tools/tmxcopy/base64.cpp | 1 - tools/tmxcopy/base64.h | 1 - tools/tmxcopy/tostring.h | 2 -- tools/tmxcopy/xmlutils.cpp | 1 - tools/tmxcopy/xmlutils.h | 1 - 375 files changed, 735 deletions(-) (limited to 'src/utils') diff --git a/src/animatedsprite.cpp b/src/animatedsprite.cpp index 13596a70..b2bb1f28 100644 --- a/src/animatedsprite.cpp +++ b/src/animatedsprite.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "animatedsprite.h" diff --git a/src/animatedsprite.h b/src/animatedsprite.h index a1fbe7a0..405bf42e 100644 --- a/src/animatedsprite.h +++ b/src/animatedsprite.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ANIMATEDSPRITE_H diff --git a/src/animationparticle.cpp b/src/animationparticle.cpp index c79a5bc4..eb260157 100644 --- a/src/animationparticle.cpp +++ b/src/animationparticle.cpp @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #include "animationparticle.h" diff --git a/src/animationparticle.h b/src/animationparticle.h index 054b1b73..eabc2742 100644 --- a/src/animationparticle.h +++ b/src/animationparticle.h @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #ifndef _ANIMATION_PARTICLE diff --git a/src/being.cpp b/src/being.cpp index bac66d48..a267d033 100644 --- a/src/being.cpp +++ b/src/being.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "being.h" diff --git a/src/being.h b/src/being.h index a0475910..bf11e3ed 100644 --- a/src/being.h +++ b/src/being.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_BEING_H diff --git a/src/beingmanager.cpp b/src/beingmanager.cpp index 40f438df..6d9267d2 100644 --- a/src/beingmanager.cpp +++ b/src/beingmanager.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/beingmanager.h b/src/beingmanager.h index f7a3b8f0..d3fb9888 100644 --- a/src/beingmanager.h +++ b/src/beingmanager.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_BEINGMANAGER_H diff --git a/src/channel.cpp b/src/channel.cpp index 969386f1..c62d6590 100644 --- a/src/channel.cpp +++ b/src/channel.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ diff --git a/src/channel.h b/src/channel.h index 3cb38a1c..01bd2728 100644 --- a/src/channel.h +++ b/src/channel.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/channelmanager.cpp b/src/channelmanager.cpp index 3c66f4bb..a332edbb 100644 --- a/src/channelmanager.cpp +++ b/src/channelmanager.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/channelmanager.h b/src/channelmanager.h index 5e6b5ba1..c19c548a 100644 --- a/src/channelmanager.h +++ b/src/channelmanager.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_CHANNELMANAGER_H diff --git a/src/commandhandler.cpp b/src/commandhandler.cpp index 5c7b5e52..4b1a0225 100644 --- a/src/commandhandler.cpp +++ b/src/commandhandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ diff --git a/src/commandhandler.h b/src/commandhandler.h index 10a4376f..eab0f077 100644 --- a/src/commandhandler.h +++ b/src/commandhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_COMMANDHANDLER_H diff --git a/src/configlistener.h b/src/configlistener.h index 7ce5d949..b740720f 100644 --- a/src/configlistener.h +++ b/src/configlistener.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_CONFIGLISTENER_H diff --git a/src/configuration.cpp b/src/configuration.cpp index 864ad7c3..e801083f 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ diff --git a/src/configuration.h b/src/configuration.h index 28246a02..a2d3b55d 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_CONFIGURATION_H diff --git a/src/effectmanager.cpp b/src/effectmanager.cpp index 87d98834..52f1eb31 100644 --- a/src/effectmanager.cpp +++ b/src/effectmanager.cpp @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #include "effectmanager.h" diff --git a/src/effectmanager.h b/src/effectmanager.h index b5451f27..1ae82caf 100644 --- a/src/effectmanager.h +++ b/src/effectmanager.h @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #ifndef _EFFECT_MANAGER_H diff --git a/src/engine.cpp b/src/engine.cpp index e4b25c02..ba5ce5e3 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "engine.h" diff --git a/src/engine.h b/src/engine.h index 0e77bf3d..dbee1258 100644 --- a/src/engine.h +++ b/src/engine.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _ENGINE_H diff --git a/src/equipment.cpp b/src/equipment.cpp index 265f230a..aa56b791 100644 --- a/src/equipment.cpp +++ b/src/equipment.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/equipment.h b/src/equipment.h index 7a0c8238..736074dd 100644 --- a/src/equipment.h +++ b/src/equipment.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_EQUIPMENT_H_ diff --git a/src/floor_item.cpp b/src/floor_item.cpp index 9727093f..7ad3c0c0 100644 --- a/src/floor_item.cpp +++ b/src/floor_item.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "floor_item.h" diff --git a/src/floor_item.h b/src/floor_item.h index a87e3f79..b747310b 100644 --- a/src/floor_item.h +++ b/src/floor_item.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_FLOORITEM_H_ diff --git a/src/flooritemmanager.cpp b/src/flooritemmanager.cpp index c28755fb..68c84b5b 100644 --- a/src/flooritemmanager.cpp +++ b/src/flooritemmanager.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "flooritemmanager.h" diff --git a/src/flooritemmanager.h b/src/flooritemmanager.h index c12883a4..3dbaf988 100644 --- a/src/flooritemmanager.h +++ b/src/flooritemmanager.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_FLOORITEMMANAGER_H diff --git a/src/game.cpp b/src/game.cpp index 421c8aac..df6d5578 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "game.h" diff --git a/src/game.h b/src/game.h index 56923bd0..4035584b 100644 --- a/src/game.h +++ b/src/game.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GAME_ diff --git a/src/graphics.cpp b/src/graphics.cpp index 586f9f49..6920bcb0 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/graphics.h b/src/graphics.h index 564826a2..efdd1ac1 100644 --- a/src/graphics.h +++ b/src/graphics.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _GRAPHICS_H diff --git a/src/gui/box.cpp b/src/gui/box.cpp index 6af3ae3e..59d8c135 100644 --- a/src/gui/box.cpp +++ b/src/gui/box.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "box.h" diff --git a/src/gui/box.h b/src/gui/box.h index ed1a7163..46654b48 100644 --- a/src/gui/box.h +++ b/src/gui/box.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ diff --git a/src/gui/browserbox.cpp b/src/gui/browserbox.cpp index 53a2ac0f..b0b6f48e 100644 --- a/src/gui/browserbox.cpp +++ b/src/gui/browserbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/browserbox.h b/src/gui/browserbox.h index 0a9032e4..465ff497 100644 --- a/src/gui/browserbox.h +++ b/src/gui/browserbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef __TMW_BROWSERBOX_H__ diff --git a/src/gui/buddywindow.cpp b/src/gui/buddywindow.cpp index 0ed383ce..14a941a5 100644 --- a/src/gui/buddywindow.cpp +++ b/src/gui/buddywindow.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "buddywindow.h" diff --git a/src/gui/buddywindow.h b/src/gui/buddywindow.h index a3ca4de2..6b07f470 100644 --- a/src/gui/buddywindow.h +++ b/src/gui/buddywindow.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_BUDDYWINDOW_H diff --git a/src/gui/button.cpp b/src/gui/button.cpp index c6bc4ccb..40ecd1b7 100644 --- a/src/gui/button.cpp +++ b/src/gui/button.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/button.h b/src/gui/button.h index d12173b2..f451416c 100644 --- a/src/gui/button.h +++ b/src/gui/button.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_BUTTON_H diff --git a/src/gui/buy.cpp b/src/gui/buy.cpp index 49d19675..a948b136 100644 --- a/src/gui/buy.cpp +++ b/src/gui/buy.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "buy.h" diff --git a/src/gui/buy.h b/src/gui/buy.h index ec7419be..24f18742 100644 --- a/src/gui/buy.h +++ b/src/gui/buy.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_BUY_H diff --git a/src/gui/buysell.cpp b/src/gui/buysell.cpp index ae5c7358..42380882 100644 --- a/src/gui/buysell.cpp +++ b/src/gui/buysell.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "buysell.h" diff --git a/src/gui/buysell.h b/src/gui/buysell.h index 97caf34b..2391ed1c 100644 --- a/src/gui/buysell.h +++ b/src/gui/buysell.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_BUYSELL_H diff --git a/src/gui/changeemaildialog.cpp b/src/gui/changeemaildialog.cpp index 94253d31..c9bc2570 100644 --- a/src/gui/changeemaildialog.cpp +++ b/src/gui/changeemaildialog.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "changeemaildialog.h" diff --git a/src/gui/changeemaildialog.h b/src/gui/changeemaildialog.h index 862c9d10..8ec3705d 100644 --- a/src/gui/changeemaildialog.h +++ b/src/gui/changeemaildialog.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_CHANGEEMAIL_H diff --git a/src/gui/changepassworddialog.cpp b/src/gui/changepassworddialog.cpp index e3bb0511..8d667790 100644 --- a/src/gui/changepassworddialog.cpp +++ b/src/gui/changepassworddialog.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "changepassworddialog.h" diff --git a/src/gui/changepassworddialog.h b/src/gui/changepassworddialog.h index 450cce61..0cf744da 100644 --- a/src/gui/changepassworddialog.h +++ b/src/gui/changepassworddialog.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_CHANGEPASSWORDDIALOG_H diff --git a/src/gui/char_select.cpp b/src/gui/char_select.cpp index c011aa84..3adfbc08 100644 --- a/src/gui/char_select.cpp +++ b/src/gui/char_select.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "char_select.h" diff --git a/src/gui/char_select.h b/src/gui/char_select.h index 0c1dbe45..ed03cedd 100644 --- a/src/gui/char_select.h +++ b/src/gui/char_select.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _CHAR_SELECT_H diff --git a/src/gui/chargedialog.cpp b/src/gui/chargedialog.cpp index 862378ae..1c9edf45 100644 --- a/src/gui/chargedialog.cpp +++ b/src/gui/chargedialog.cpp @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ /* The window supported by this class shows player stats and keeps a charging diff --git a/src/gui/chargedialog.h b/src/gui/chargedialog.h index c09c692c..9517ef6a 100644 --- a/src/gui/chargedialog.h +++ b/src/gui/chargedialog.h @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #ifndef _TMW_CHARGE_H diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index 82e7d372..c94429c8 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/chat.h b/src/gui/chat.h index f7af6480..a41b11fb 100644 --- a/src/gui/chat.h +++ b/src/gui/chat.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_CHAT_H diff --git a/src/gui/chatinput.cpp b/src/gui/chatinput.cpp index fc5d6aab..afe7f037 100644 --- a/src/gui/chatinput.cpp +++ b/src/gui/chatinput.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "chatinput.h" diff --git a/src/gui/chatinput.h b/src/gui/chatinput.h index da2342ae..e04dfa6e 100644 --- a/src/gui/chatinput.h +++ b/src/gui/chatinput.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_CHATINPUT_H diff --git a/src/gui/checkbox.cpp b/src/gui/checkbox.cpp index 5b300d33..20e24dee 100644 --- a/src/gui/checkbox.cpp +++ b/src/gui/checkbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "checkbox.h" diff --git a/src/gui/checkbox.h b/src/gui/checkbox.h index 262e63ae..839ca97e 100644 --- a/src/gui/checkbox.h +++ b/src/gui/checkbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_CHECKBOX_H diff --git a/src/gui/confirm_dialog.cpp b/src/gui/confirm_dialog.cpp index 65ca27f7..5f2b9cb2 100644 --- a/src/gui/confirm_dialog.cpp +++ b/src/gui/confirm_dialog.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "confirm_dialog.h" diff --git a/src/gui/confirm_dialog.h b/src/gui/confirm_dialog.h index 8728f83f..c9bfca02 100644 --- a/src/gui/confirm_dialog.h +++ b/src/gui/confirm_dialog.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_OPTION_DIALOG_H diff --git a/src/gui/connection.cpp b/src/gui/connection.cpp index a9fa2a56..f54c9dd5 100644 --- a/src/gui/connection.cpp +++ b/src/gui/connection.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "connection.h" diff --git a/src/gui/connection.h b/src/gui/connection.h index 51ad5467..36ccd8a9 100644 --- a/src/gui/connection.h +++ b/src/gui/connection.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_CONNECTION_H diff --git a/src/gui/debugwindow.cpp b/src/gui/debugwindow.cpp index 3d0690b9..d92c3575 100644 --- a/src/gui/debugwindow.cpp +++ b/src/gui/debugwindow.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "debugwindow.h" diff --git a/src/gui/debugwindow.h b/src/gui/debugwindow.h index 9b6f2017..ae1d8b14 100644 --- a/src/gui/debugwindow.h +++ b/src/gui/debugwindow.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_DEBUGWINDOW_H diff --git a/src/gui/equipmentwindow.cpp b/src/gui/equipmentwindow.cpp index 9a96b4d6..aee262d0 100644 --- a/src/gui/equipmentwindow.cpp +++ b/src/gui/equipmentwindow.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #define BOX_WIDTH 36 diff --git a/src/gui/equipmentwindow.h b/src/gui/equipmentwindow.h index 696f4fc6..b6d2e2f4 100644 --- a/src/gui/equipmentwindow.h +++ b/src/gui/equipmentwindow.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_EQUIPMENT_H diff --git a/src/gui/focushandler.cpp b/src/gui/focushandler.cpp index ffdb7896..1bda568e 100644 --- a/src/gui/focushandler.cpp +++ b/src/gui/focushandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "focushandler.h" diff --git a/src/gui/focushandler.h b/src/gui/focushandler.h index 252fdd9d..a5218485 100644 --- a/src/gui/focushandler.h +++ b/src/gui/focushandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_FOCUSHANDLER_H diff --git a/src/gui/gccontainer.cpp b/src/gui/gccontainer.cpp index 1edb4daf..ec3c8a5c 100644 --- a/src/gui/gccontainer.cpp +++ b/src/gui/gccontainer.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "gccontainer.h" diff --git a/src/gui/gccontainer.h b/src/gui/gccontainer.h index 8b8a7ffe..cc7c9336 100644 --- a/src/gui/gccontainer.h +++ b/src/gui/gccontainer.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_GCCONTAINER_H diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index bc2f017b..6803be65 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "gui.h" diff --git a/src/gui/gui.h b/src/gui/gui.h index 84f52a31..a07d236f 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI diff --git a/src/gui/guildlistbox.cpp b/src/gui/guildlistbox.cpp index 5fe62fe5..556df3fe 100644 --- a/src/gui/guildlistbox.cpp +++ b/src/gui/guildlistbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id $ */ #include "guildlistbox.h" diff --git a/src/gui/guildlistbox.h b/src/gui/guildlistbox.h index b3892955..cc8e3ce7 100644 --- a/src/gui/guildlistbox.h +++ b/src/gui/guildlistbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id $ */ #ifndef _TMW_GUI_GUILDLISTBOX_H diff --git a/src/gui/guildwindow.cpp b/src/gui/guildwindow.cpp index 3319489c..ae9684df 100644 --- a/src/gui/guildwindow.cpp +++ b/src/gui/guildwindow.cpp @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * * $$ */ diff --git a/src/gui/guildwindow.h b/src/gui/guildwindow.h index e1bd99d7..4f6b9cbb 100644 --- a/src/gui/guildwindow.h +++ b/src/gui/guildwindow.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_GUILDWINDOW_H diff --git a/src/gui/hbox.cpp b/src/gui/hbox.cpp index 69564fbb..020e85c6 100644 --- a/src/gui/hbox.cpp +++ b/src/gui/hbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "hbox.h" diff --git a/src/gui/hbox.h b/src/gui/hbox.h index 560b1a29..4b241383 100644 --- a/src/gui/hbox.h +++ b/src/gui/hbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef HBOX_H diff --git a/src/gui/help.cpp b/src/gui/help.cpp index 87de1e2f..ffe9c02d 100644 --- a/src/gui/help.cpp +++ b/src/gui/help.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "help.h" diff --git a/src/gui/help.h b/src/gui/help.h index 3c3715a0..053df723 100644 --- a/src/gui/help.h +++ b/src/gui/help.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_HELP_H diff --git a/src/gui/icon.cpp b/src/gui/icon.cpp index 58b3ae8a..1e352292 100644 --- a/src/gui/icon.cpp +++ b/src/gui/icon.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "icon.h" diff --git a/src/gui/icon.h b/src/gui/icon.h index f0d3a70a..9baf1a99 100644 --- a/src/gui/icon.h +++ b/src/gui/icon.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ diff --git a/src/gui/inttextbox.cpp b/src/gui/inttextbox.cpp index 17e87afd..644601cf 100644 --- a/src/gui/inttextbox.cpp +++ b/src/gui/inttextbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "inttextbox.h" diff --git a/src/gui/inttextbox.h b/src/gui/inttextbox.h index 219c6018..8dad0c39 100644 --- a/src/gui/inttextbox.h +++ b/src/gui/inttextbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef INTTEXTBOX_H diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp index 2127442a..82b36aef 100644 --- a/src/gui/inventorywindow.cpp +++ b/src/gui/inventorywindow.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "inventorywindow.h" diff --git a/src/gui/inventorywindow.h b/src/gui/inventorywindow.h index f9ff8ea2..a7130b65 100644 --- a/src/gui/inventorywindow.h +++ b/src/gui/inventorywindow.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_INVENTORYWINDOW_H diff --git a/src/gui/item_amount.cpp b/src/gui/item_amount.cpp index 6f1c8ae6..c6763014 100644 --- a/src/gui/item_amount.cpp +++ b/src/gui/item_amount.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "item_amount.h" diff --git a/src/gui/item_amount.h b/src/gui/item_amount.h index 03303603..dd1026b7 100644 --- a/src/gui/item_amount.h +++ b/src/gui/item_amount.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ITEM_AMOUNT_WINDOW_H diff --git a/src/gui/itemcontainer.cpp b/src/gui/itemcontainer.cpp index 4c528a16..5fb99ffc 100644 --- a/src/gui/itemcontainer.cpp +++ b/src/gui/itemcontainer.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "itemcontainer.h" diff --git a/src/gui/itemcontainer.h b/src/gui/itemcontainer.h index 9ae5c9c2..8d93671c 100644 --- a/src/gui/itemcontainer.h +++ b/src/gui/itemcontainer.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ITEMCONTAINER_H__ diff --git a/src/gui/itempopup.cpp b/src/gui/itempopup.cpp index cf719f9f..02d35570 100644 --- a/src/gui/itempopup.cpp +++ b/src/gui/itempopup.cpp @@ -18,8 +18,6 @@ * You should have received a copy of the GNU General Public License * along with The Legend of Mazzeroth; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "itempopup.h" diff --git a/src/gui/itempopup.h b/src/gui/itempopup.h index 499b2e0a..cb55296c 100644 --- a/src/gui/itempopup.h +++ b/src/gui/itempopup.h @@ -1,5 +1,4 @@ /* -* * The Legend of Mazzeroth * Copyright (C) 2008, The Legend of Mazzeroth Development Team * @@ -19,8 +18,6 @@ * You should have received a copy of the GNU General Public License * along with The Legend of Mazzeroth; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _LOM_ITEMPOPUP_H__ diff --git a/src/gui/itemshortcutcontainer.cpp b/src/gui/itemshortcutcontainer.cpp index 23b41650..76104e12 100644 --- a/src/gui/itemshortcutcontainer.cpp +++ b/src/gui/itemshortcutcontainer.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "itemshortcutcontainer.h" diff --git a/src/gui/itemshortcutcontainer.h b/src/gui/itemshortcutcontainer.h index 58f0aea7..76ca870c 100644 --- a/src/gui/itemshortcutcontainer.h +++ b/src/gui/itemshortcutcontainer.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ITEMSHORTCUTCONTAINER_H__ diff --git a/src/gui/itemshortcutwindow.cpp b/src/gui/itemshortcutwindow.cpp index fb75e20d..e4d352fe 100644 --- a/src/gui/itemshortcutwindow.cpp +++ b/src/gui/itemshortcutwindow.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "itemshortcutwindow.h" diff --git a/src/gui/itemshortcutwindow.h b/src/gui/itemshortcutwindow.h index 9742abdc..017df5ec 100644 --- a/src/gui/itemshortcutwindow.h +++ b/src/gui/itemshortcutwindow.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ITEMSHORTCUTWINDOW_H diff --git a/src/gui/linkhandler.h b/src/gui/linkhandler.h index 3a32f825..44f906db 100644 --- a/src/gui/linkhandler.h +++ b/src/gui/linkhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_LINK_HANDLER_H_ diff --git a/src/gui/listbox.cpp b/src/gui/listbox.cpp index ac18c2cd..204d7961 100644 --- a/src/gui/listbox.cpp +++ b/src/gui/listbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "listbox.h" diff --git a/src/gui/listbox.h b/src/gui/listbox.h index 03a8b541..d42c7d3e 100644 --- a/src/gui/listbox.h +++ b/src/gui/listbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_LISTBOX_H diff --git a/src/gui/login.cpp b/src/gui/login.cpp index 72d7ee51..24c55e37 100644 --- a/src/gui/login.cpp +++ b/src/gui/login.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "login.h" diff --git a/src/gui/login.h b/src/gui/login.h index d8ae7eaf..1c23a0f5 100644 --- a/src/gui/login.h +++ b/src/gui/login.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_LOGIN_H diff --git a/src/gui/magic.cpp b/src/gui/magic.cpp index 28e7de92..a31b661a 100644 --- a/src/gui/magic.cpp +++ b/src/gui/magic.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: skill.cpp 4569 2008-09-04 20:09:57Z b_lindeijer $ */ #include diff --git a/src/gui/magic.h b/src/gui/magic.h index a8082755..af46c823 100644 --- a/src/gui/magic.h +++ b/src/gui/magic.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: skill.h 4476 2008-08-18 01:23:58Z rhoderyc $ */ #ifndef _TMW_MAGIC_H @@ -32,7 +30,6 @@ #include "../guichanfwd.h" - /** * The skill dialog. * diff --git a/src/gui/menuwindow.cpp b/src/gui/menuwindow.cpp index c3e572a7..dbbb08d2 100644 --- a/src/gui/menuwindow.cpp +++ b/src/gui/menuwindow.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "menuwindow.h" diff --git a/src/gui/menuwindow.h b/src/gui/menuwindow.h index f43b9921..03ec3380 100644 --- a/src/gui/menuwindow.h +++ b/src/gui/menuwindow.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MENU_H diff --git a/src/gui/minimap.cpp b/src/gui/minimap.cpp index 5f768609..501530f1 100644 --- a/src/gui/minimap.cpp +++ b/src/gui/minimap.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "minimap.h" diff --git a/src/gui/minimap.h b/src/gui/minimap.h index 5e9458bf..f91dc22d 100644 --- a/src/gui/minimap.h +++ b/src/gui/minimap.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MINIMAP_H diff --git a/src/gui/ministatus.cpp b/src/gui/ministatus.cpp index 3742be64..424c3558 100644 --- a/src/gui/ministatus.cpp +++ b/src/gui/ministatus.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "ministatus.h" diff --git a/src/gui/ministatus.h b/src/gui/ministatus.h index 1192bc1e..f512ef25 100644 --- a/src/gui/ministatus.h +++ b/src/gui/ministatus.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MINISTATUS_H diff --git a/src/gui/newskill.cpp b/src/gui/newskill.cpp index 6783a546..20fc01bd 100644 --- a/src/gui/newskill.cpp +++ b/src/gui/newskill.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ /* This file implements the new skill dialog for use under the latest diff --git a/src/gui/newskill.h b/src/gui/newskill.h index 6e12169f..49476e5e 100644 --- a/src/gui/newskill.h +++ b/src/gui/newskill.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NSKILL_H diff --git a/src/gui/npc_text.cpp b/src/gui/npc_text.cpp index fd02a14a..c593feb1 100644 --- a/src/gui/npc_text.cpp +++ b/src/gui/npc_text.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "npc_text.h" diff --git a/src/gui/npc_text.h b/src/gui/npc_text.h index 0ef1b938..2c9771d3 100644 --- a/src/gui/npc_text.h +++ b/src/gui/npc_text.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NPC_TEXT_H diff --git a/src/gui/npclistdialog.cpp b/src/gui/npclistdialog.cpp index ff017a0e..918031b4 100644 --- a/src/gui/npclistdialog.cpp +++ b/src/gui/npclistdialog.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "npclistdialog.h" diff --git a/src/gui/npclistdialog.h b/src/gui/npclistdialog.h index 02b9cd49..e21f9e8c 100644 --- a/src/gui/npclistdialog.h +++ b/src/gui/npclistdialog.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_NPCLISTDIALOG_H diff --git a/src/gui/npcpostdialog.cpp b/src/gui/npcpostdialog.cpp index 2d3fce64..3a72b21b 100644 --- a/src/gui/npcpostdialog.cpp +++ b/src/gui/npcpostdialog.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "npcpostdialog.h" diff --git a/src/gui/npcpostdialog.h b/src/gui/npcpostdialog.h index e142dac5..1956c877 100644 --- a/src/gui/npcpostdialog.h +++ b/src/gui/npcpostdialog.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_NPCPOSTDIALOG_H diff --git a/src/gui/ok_dialog.cpp b/src/gui/ok_dialog.cpp index 37d66353..b03c3964 100644 --- a/src/gui/ok_dialog.cpp +++ b/src/gui/ok_dialog.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "ok_dialog.h" diff --git a/src/gui/ok_dialog.h b/src/gui/ok_dialog.h index a7b24a90..cba12d72 100644 --- a/src/gui/ok_dialog.h +++ b/src/gui/ok_dialog.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _OK_DIALOG_H diff --git a/src/gui/partywindow.cpp b/src/gui/partywindow.cpp index 1b963dae..262e3b2e 100644 --- a/src/gui/partywindow.cpp +++ b/src/gui/partywindow.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: box.cpp 1456 2005-07-15 23:17:00Z b_lindeijer $ */ #include "partywindow.h" diff --git a/src/gui/partywindow.h b/src/gui/partywindow.h index f09eeb6a..e79bf392 100644 --- a/src/gui/partywindow.h +++ b/src/gui/partywindow.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: box.cpp 1456 2005-07-15 23:17:00Z b_lindeijer $ */ #ifndef _TMW_PARTYWINDOW_H diff --git a/src/gui/passwordfield.cpp b/src/gui/passwordfield.cpp index 533f54fb..01c7e15d 100644 --- a/src/gui/passwordfield.cpp +++ b/src/gui/passwordfield.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "passwordfield.h" diff --git a/src/gui/passwordfield.h b/src/gui/passwordfield.h index cae1f92e..8a14b72a 100644 --- a/src/gui/passwordfield.h +++ b/src/gui/passwordfield.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_PASSWORDFIELD_H_ diff --git a/src/gui/playerbox.cpp b/src/gui/playerbox.cpp index e9237110..0a0c8a17 100644 --- a/src/gui/playerbox.cpp +++ b/src/gui/playerbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/playerbox.h b/src/gui/playerbox.h index c226e750..78eeee91 100644 --- a/src/gui/playerbox.h +++ b/src/gui/playerbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef __TMW_PLAYERBOX_H__ diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp index 2888382b..59ca0867 100644 --- a/src/gui/popupmenu.cpp +++ b/src/gui/popupmenu.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "popupmenu.h" diff --git a/src/gui/popupmenu.h b/src/gui/popupmenu.h index 9fe9f866..2d10e6eb 100644 --- a/src/gui/popupmenu.h +++ b/src/gui/popupmenu.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_POPUP_MENU_H diff --git a/src/gui/progressbar.cpp b/src/gui/progressbar.cpp index 90a85478..9a47eefc 100644 --- a/src/gui/progressbar.cpp +++ b/src/gui/progressbar.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "progressbar.h" diff --git a/src/gui/progressbar.h b/src/gui/progressbar.h index ddabbb77..0b1616f5 100644 --- a/src/gui/progressbar.h +++ b/src/gui/progressbar.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_PROGRESSBAR_H diff --git a/src/gui/quitdialog.cpp b/src/gui/quitdialog.cpp index 7ed4f913..563ed34a 100644 --- a/src/gui/quitdialog.cpp +++ b/src/gui/quitdialog.cpp @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #include "quitdialog.h" diff --git a/src/gui/quitdialog.h b/src/gui/quitdialog.h index 97a03f2e..018f1e52 100644 --- a/src/gui/quitdialog.h +++ b/src/gui/quitdialog.h @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #ifndef _TMW_QUITDIALOG_H diff --git a/src/gui/radiobutton.cpp b/src/gui/radiobutton.cpp index 57d6772d..619ec84f 100644 --- a/src/gui/radiobutton.cpp +++ b/src/gui/radiobutton.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "radiobutton.h" diff --git a/src/gui/radiobutton.h b/src/gui/radiobutton.h index 3b97ad86..09f703dc 100644 --- a/src/gui/radiobutton.h +++ b/src/gui/radiobutton.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_RADIOBUTTON_H diff --git a/src/gui/register.cpp b/src/gui/register.cpp index 7e236a7d..051c0fa4 100644 --- a/src/gui/register.cpp +++ b/src/gui/register.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "register.h" diff --git a/src/gui/register.h b/src/gui/register.h index 088e8f9b..79578461 100644 --- a/src/gui/register.h +++ b/src/gui/register.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_REGISTER_H diff --git a/src/gui/scrollarea.cpp b/src/gui/scrollarea.cpp index 255aa2d8..032e3f78 100644 --- a/src/gui/scrollarea.cpp +++ b/src/gui/scrollarea.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/scrollarea.h b/src/gui/scrollarea.h index be361f68..d21dae11 100644 --- a/src/gui/scrollarea.h +++ b/src/gui/scrollarea.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef __TMW_SCROLLAREA_H__ diff --git a/src/gui/sdlinput.cpp b/src/gui/sdlinput.cpp index cef53697..ee94b2c6 100644 --- a/src/gui/sdlinput.cpp +++ b/src/gui/sdlinput.cpp @@ -53,8 +53,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ */ #include "sdlinput.h" diff --git a/src/gui/sdlinput.h b/src/gui/sdlinput.h index e23178fa..72d949e1 100644 --- a/src/gui/sdlinput.h +++ b/src/gui/sdlinput.h @@ -53,8 +53,6 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ */ #ifndef _TMW_SDLINPUT_ diff --git a/src/gui/sell.cpp b/src/gui/sell.cpp index 37626155..30e78368 100644 --- a/src/gui/sell.cpp +++ b/src/gui/sell.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "sell.h" diff --git a/src/gui/sell.h b/src/gui/sell.h index 63a16770..742c28fb 100644 --- a/src/gui/sell.h +++ b/src/gui/sell.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SELL_H diff --git a/src/gui/serverdialog.cpp b/src/gui/serverdialog.cpp index a6d1d1f0..b11aea6c 100644 --- a/src/gui/serverdialog.cpp +++ b/src/gui/serverdialog.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/serverdialog.h b/src/gui/serverdialog.h index 53474611..268b1baf 100644 --- a/src/gui/serverdialog.h +++ b/src/gui/serverdialog.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SERVERDIALOG_H diff --git a/src/gui/setup.cpp b/src/gui/setup.cpp index b6b052bc..2a60308b 100644 --- a/src/gui/setup.cpp +++ b/src/gui/setup.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/setup.h b/src/gui/setup.h index 77173367..2142a67d 100644 --- a/src/gui/setup.h +++ b/src/gui/setup.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SETUP_H diff --git a/src/gui/setup_audio.cpp b/src/gui/setup_audio.cpp index 1ed4fc94..4f09cde0 100644 --- a/src/gui/setup_audio.cpp +++ b/src/gui/setup_audio.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "setup_audio.h" diff --git a/src/gui/setup_audio.h b/src/gui/setup_audio.h index 6e722f74..eaa55de6 100644 --- a/src/gui/setup_audio.h +++ b/src/gui/setup_audio.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_SETUP_AUDIO_H diff --git a/src/gui/setup_joystick.cpp b/src/gui/setup_joystick.cpp index 57adef28..9de5be9f 100644 --- a/src/gui/setup_joystick.cpp +++ b/src/gui/setup_joystick.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "setup_joystick.h" diff --git a/src/gui/setup_joystick.h b/src/gui/setup_joystick.h index 6d3ad129..0b7ebe98 100644 --- a/src/gui/setup_joystick.h +++ b/src/gui/setup_joystick.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_SETUP_JOYSTICK_H diff --git a/src/gui/setup_keyboard.cpp b/src/gui/setup_keyboard.cpp index 2b785dd5..270f4a0e 100644 --- a/src/gui/setup_keyboard.cpp +++ b/src/gui/setup_keyboard.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "setup_keyboard.h" diff --git a/src/gui/setup_keyboard.h b/src/gui/setup_keyboard.h index b72e8746..50fa76fb 100644 --- a/src/gui/setup_keyboard.h +++ b/src/gui/setup_keyboard.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_SETUP_KEYBOARD_H diff --git a/src/gui/setup_video.cpp b/src/gui/setup_video.cpp index 4d9b5d74..51cee8e3 100644 --- a/src/gui/setup_video.cpp +++ b/src/gui/setup_video.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "setup_video.h" diff --git a/src/gui/setup_video.h b/src/gui/setup_video.h index e4e9fcf1..17ca1241 100644 --- a/src/gui/setup_video.h +++ b/src/gui/setup_video.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_SETUP_VIDEO_H diff --git a/src/gui/setuptab.h b/src/gui/setuptab.h index a7d45b9a..6c276c35 100644 --- a/src/gui/setuptab.h +++ b/src/gui/setuptab.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_SETUPTAB_H diff --git a/src/gui/shop.cpp b/src/gui/shop.cpp index 2a7ea0ce..a521c75b 100644 --- a/src/gui/shop.cpp +++ b/src/gui/shop.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "shop.h" diff --git a/src/gui/shop.h b/src/gui/shop.h index f4329b4d..62b60cae 100644 --- a/src/gui/shop.h +++ b/src/gui/shop.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _SHOP_H diff --git a/src/gui/shoplistbox.cpp b/src/gui/shoplistbox.cpp index ba77be47..bce6a48c 100644 --- a/src/gui/shoplistbox.cpp +++ b/src/gui/shoplistbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "shoplistbox.h" diff --git a/src/gui/shoplistbox.h b/src/gui/shoplistbox.h index d5e2d836..75f514ab 100644 --- a/src/gui/shoplistbox.h +++ b/src/gui/shoplistbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SHOPLISTBOX_H diff --git a/src/gui/skill.cpp b/src/gui/skill.cpp index 49037cbd..49bacaf0 100644 --- a/src/gui/skill.cpp +++ b/src/gui/skill.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/skill.h b/src/gui/skill.h index 12f619bd..3d010daa 100644 --- a/src/gui/skill.h +++ b/src/gui/skill.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SKILL_H diff --git a/src/gui/slider.cpp b/src/gui/slider.cpp index c94c7bfb..afeecf17 100644 --- a/src/gui/slider.cpp +++ b/src/gui/slider.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "slider.h" diff --git a/src/gui/slider.h b/src/gui/slider.h index dc38b738..3b796425 100644 --- a/src/gui/slider.h +++ b/src/gui/slider.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SLIDER_H diff --git a/src/gui/speechbubble.cpp b/src/gui/speechbubble.cpp index 815238b9..d3ef7bbe 100644 --- a/src/gui/speechbubble.cpp +++ b/src/gui/speechbubble.cpp @@ -18,8 +18,6 @@ * You should have received a copy of the GNU General Public License * along with The Legend of Mazzeroth; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "speechbubble.h" diff --git a/src/gui/speechbubble.h b/src/gui/speechbubble.h index c4ca9109..ed69a8d2 100644 --- a/src/gui/speechbubble.h +++ b/src/gui/speechbubble.h @@ -18,8 +18,6 @@ * You should have received a copy of the GNU General Public License * along with The Legend of Mazzeroth; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _LOM_SPEECHBUBBLE_H__ diff --git a/src/gui/status.cpp b/src/gui/status.cpp index b9ebfecf..43f81135 100644 --- a/src/gui/status.cpp +++ b/src/gui/status.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "status.h" diff --git a/src/gui/status.h b/src/gui/status.h index 6e613495..262b89f6 100644 --- a/src/gui/status.h +++ b/src/gui/status.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_STATUS_H diff --git a/src/gui/textbox.cpp b/src/gui/textbox.cpp index 8d16dc46..619265ec 100644 --- a/src/gui/textbox.cpp +++ b/src/gui/textbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "textbox.h" diff --git a/src/gui/textbox.h b/src/gui/textbox.h index f06f98ec..2060e377 100644 --- a/src/gui/textbox.h +++ b/src/gui/textbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef __TMW_TEXTBOX_H__ diff --git a/src/gui/textdialog.cpp b/src/gui/textdialog.cpp index 3986ed4e..05e43906 100644 --- a/src/gui/textdialog.cpp +++ b/src/gui/textdialog.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "textdialog.h" diff --git a/src/gui/textdialog.h b/src/gui/textdialog.h index c03ce7e6..8b4e2cc3 100644 --- a/src/gui/textdialog.h +++ b/src/gui/textdialog.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUI_GUILD_DIALOG_H diff --git a/src/gui/textfield.cpp b/src/gui/textfield.cpp index 4fd85d36..49c0c91d 100644 --- a/src/gui/textfield.cpp +++ b/src/gui/textfield.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/textfield.h b/src/gui/textfield.h index 36f921ac..b808fad2 100644 --- a/src/gui/textfield.h +++ b/src/gui/textfield.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef __TMW_TEXTFIELD_H__ diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp index c098c04c..38064f48 100644 --- a/src/gui/trade.cpp +++ b/src/gui/trade.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/trade.h b/src/gui/trade.h index c8ece8d9..c51e0fdd 100644 --- a/src/gui/trade.h +++ b/src/gui/trade.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_TRADE_H diff --git a/src/gui/truetypefont.cpp b/src/gui/truetypefont.cpp index 7f9abd3a..1132c3b5 100644 --- a/src/gui/truetypefont.cpp +++ b/src/gui/truetypefont.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "truetypefont.h" diff --git a/src/gui/truetypefont.h b/src/gui/truetypefont.h index 6dbc6634..3b39329e 100644 --- a/src/gui/truetypefont.h +++ b/src/gui/truetypefont.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_TRUETYPEFONT_H diff --git a/src/gui/unregisterdialog.cpp b/src/gui/unregisterdialog.cpp index 4b8755d5..1e09ca23 100644 --- a/src/gui/unregisterdialog.cpp +++ b/src/gui/unregisterdialog.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "unregisterdialog.h" diff --git a/src/gui/unregisterdialog.h b/src/gui/unregisterdialog.h index 8c8eaf64..4056d251 100644 --- a/src/gui/unregisterdialog.h +++ b/src/gui/unregisterdialog.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_UNREGISTERDIALOG_H diff --git a/src/gui/updatewindow.cpp b/src/gui/updatewindow.cpp index 22bf8c13..ff1e600c 100644 --- a/src/gui/updatewindow.cpp +++ b/src/gui/updatewindow.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "updatewindow.h" diff --git a/src/gui/updatewindow.h b/src/gui/updatewindow.h index 61ea4a27..d7e3c4c7 100644 --- a/src/gui/updatewindow.h +++ b/src/gui/updatewindow.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _UPDATERWINDOW_H diff --git a/src/gui/vbox.cpp b/src/gui/vbox.cpp index b503508e..2ec1112d 100644 --- a/src/gui/vbox.cpp +++ b/src/gui/vbox.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "vbox.h" diff --git a/src/gui/vbox.h b/src/gui/vbox.h index 06a270ef..2072ab24 100644 --- a/src/gui/vbox.h +++ b/src/gui/vbox.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef VBOX_H diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index 14239094..1795836d 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "viewport.h" diff --git a/src/gui/viewport.h b/src/gui/viewport.h index 5dedcea8..dd17fa24 100644 --- a/src/gui/viewport.h +++ b/src/gui/viewport.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_VIEWPORT_H_ diff --git a/src/gui/widgets/avatar.cpp b/src/gui/widgets/avatar.cpp index 03fa1aeb..68ce5243 100644 --- a/src/gui/widgets/avatar.cpp +++ b/src/gui/widgets/avatar.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "avatar.h" diff --git a/src/gui/widgets/avatar.h b/src/gui/widgets/avatar.h index 3707e8f8..0f657895 100644 --- a/src/gui/widgets/avatar.h +++ b/src/gui/widgets/avatar.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_AVATAR_H diff --git a/src/gui/widgets/dropdown.cpp b/src/gui/widgets/dropdown.cpp index b33a55cf..d4c2bc4b 100644 --- a/src/gui/widgets/dropdown.cpp +++ b/src/gui/widgets/dropdown.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/widgets/dropdown.h b/src/gui/widgets/dropdown.h index d0dab7d2..58a18a15 100644 --- a/src/gui/widgets/dropdown.h +++ b/src/gui/widgets/dropdown.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef DROPDOWN_H diff --git a/src/gui/widgets/layout.cpp b/src/gui/widgets/layout.cpp index 02ed42a1..bcc54cf7 100644 --- a/src/gui/widgets/layout.cpp +++ b/src/gui/widgets/layout.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/widgets/layout.h b/src/gui/widgets/layout.h index 5914b5c1..d631c154 100644 --- a/src/gui/widgets/layout.h +++ b/src/gui/widgets/layout.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_WIDGET_LAYOUT_H__ diff --git a/src/gui/widgets/resizegrip.cpp b/src/gui/widgets/resizegrip.cpp index 6be50f2c..c3b537db 100644 --- a/src/gui/widgets/resizegrip.cpp +++ b/src/gui/widgets/resizegrip.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "resizegrip.h" diff --git a/src/gui/widgets/resizegrip.h b/src/gui/widgets/resizegrip.h index 04be3db3..f57eda94 100644 --- a/src/gui/widgets/resizegrip.h +++ b/src/gui/widgets/resizegrip.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_RESIZEGRIP_H diff --git a/src/gui/widgets/tab.cpp b/src/gui/widgets/tab.cpp index 990c6a95..c53ac85c 100644 --- a/src/gui/widgets/tab.cpp +++ b/src/gui/widgets/tab.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/widgets/tab.h b/src/gui/widgets/tab.h index b18c93e3..42964b0f 100644 --- a/src/gui/widgets/tab.h +++ b/src/gui/widgets/tab.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_TAB_H diff --git a/src/gui/widgets/tabbedarea.cpp b/src/gui/widgets/tabbedarea.cpp index 7a4d153a..205fdc99 100644 --- a/src/gui/widgets/tabbedarea.cpp +++ b/src/gui/widgets/tabbedarea.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "tabbedarea.h" diff --git a/src/gui/widgets/tabbedarea.h b/src/gui/widgets/tabbedarea.h index 554a68b6..2199264b 100644 --- a/src/gui/widgets/tabbedarea.h +++ b/src/gui/widgets/tabbedarea.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_TABBEDAREA_H diff --git a/src/gui/window.cpp b/src/gui/window.cpp index 2bce49b2..e498236a 100644 --- a/src/gui/window.cpp +++ b/src/gui/window.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/gui/window.h b/src/gui/window.h index 44982500..22355572 100644 --- a/src/gui/window.h +++ b/src/gui/window.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_WINDOW_H__ diff --git a/src/gui/windowcontainer.cpp b/src/gui/windowcontainer.cpp index 006dbf44..d8535f73 100644 --- a/src/gui/windowcontainer.cpp +++ b/src/gui/windowcontainer.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "windowcontainer.h" diff --git a/src/gui/windowcontainer.h b/src/gui/windowcontainer.h index df255f84..88a13d31 100644 --- a/src/gui/windowcontainer.h +++ b/src/gui/windowcontainer.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_WINDOWCONTAINER_H_ diff --git a/src/guichanfwd.h b/src/guichanfwd.h index 812f3f7a..4fb7ea3e 100644 --- a/src/guichanfwd.h +++ b/src/guichanfwd.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_GUICHANFWD_H diff --git a/src/guild.cpp b/src/guild.cpp index c02af865..68e65cb9 100644 --- a/src/guild.cpp +++ b/src/guild.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "guild.h" diff --git a/src/guild.h b/src/guild.h index e262d3df..7c85fe31 100644 --- a/src/guild.h +++ b/src/guild.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef TMW_GUILD_H diff --git a/src/imageparticle.cpp b/src/imageparticle.cpp index 965434b0..65780345 100644 --- a/src/imageparticle.cpp +++ b/src/imageparticle.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "imageparticle.h" diff --git a/src/imageparticle.h b/src/imageparticle.h index 0ad515cc..91c5426c 100644 --- a/src/imageparticle.h +++ b/src/imageparticle.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _IMAGEPARTICLE_H diff --git a/src/inventory.cpp b/src/inventory.cpp index 807e1223..85461f90 100644 --- a/src/inventory.cpp +++ b/src/inventory.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "inventory.h" diff --git a/src/inventory.h b/src/inventory.h index 48ace29c..90d9c7a2 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _INVENTORY_H diff --git a/src/item.cpp b/src/item.cpp index 210589e9..374d5051 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "item.h" diff --git a/src/item.h b/src/item.h index fc71e53d..37db52a4 100644 --- a/src/item.h +++ b/src/item.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _ITEM_H_ diff --git a/src/itemshortcut.cpp b/src/itemshortcut.cpp index 59c1ee3b..a89da974 100644 --- a/src/itemshortcut.cpp +++ b/src/itemshortcut.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "itemshortcut.h" diff --git a/src/itemshortcut.h b/src/itemshortcut.h index d75db2e8..a0c52468 100644 --- a/src/itemshortcut.h +++ b/src/itemshortcut.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ITEMSHORTCUT_H__ diff --git a/src/joystick.cpp b/src/joystick.cpp index a5dab4f4..b69537cf 100644 --- a/src/joystick.cpp +++ b/src/joystick.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "joystick.h" diff --git a/src/joystick.h b/src/joystick.h index 321e3e7d..4cc1babd 100644 --- a/src/joystick.h +++ b/src/joystick.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_JOYSTICK_H diff --git a/src/keyboardconfig.cpp b/src/keyboardconfig.cpp index a959e244..37d5f276 100644 --- a/src/keyboardconfig.cpp +++ b/src/keyboardconfig.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "keyboardconfig.h" diff --git a/src/keyboardconfig.h b/src/keyboardconfig.h index 53a5c96d..d9886150 100644 --- a/src/keyboardconfig.h +++ b/src/keyboardconfig.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_KEYBOARDCONFIG_H diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 30ad7b2e..14d253c0 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "localplayer.h" diff --git a/src/localplayer.h b/src/localplayer.h index 16b9715a..5dce5ebe 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_LOCALPLAYER_H diff --git a/src/lockedarray.h b/src/lockedarray.h index f31292d7..8e525191 100644 --- a/src/lockedarray.h +++ b/src/lockedarray.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_LOCKEDARRAY_H diff --git a/src/logindata.h b/src/logindata.h index 689a5aaa..3d959ad4 100644 --- a/src/logindata.h +++ b/src/logindata.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_LOGINDATA_H diff --git a/src/main.cpp b/src/main.cpp index ede00d57..33900d5d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "main.h" diff --git a/src/main.h b/src/main.h index d123834b..49173266 100644 --- a/src/main.h +++ b/src/main.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MAIN_H diff --git a/src/map.cpp b/src/map.cpp index e10e4fad..5c2290d6 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "map.h" diff --git a/src/map.h b/src/map.h index c4a4fc0b..07bf2866 100644 --- a/src/map.h +++ b/src/map.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MAP_H_ diff --git a/src/monster.cpp b/src/monster.cpp index 396d0c06..a62c1f4c 100644 --- a/src/monster.cpp +++ b/src/monster.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "monster.h" diff --git a/src/monster.h b/src/monster.h index bde99ed6..5b6fcf61 100644 --- a/src/monster.h +++ b/src/monster.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MONSTER_H diff --git a/src/net/accountserver/account.cpp b/src/net/accountserver/account.cpp index d1fe6863..f734c4eb 100644 --- a/src/net/accountserver/account.cpp +++ b/src/net/accountserver/account.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "account.h" diff --git a/src/net/accountserver/account.h b/src/net/accountserver/account.h index 0cf0758e..581bcb42 100644 --- a/src/net/accountserver/account.h +++ b/src/net/accountserver/account.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_ACCOUNTSERVER_CHARACTER_H diff --git a/src/net/accountserver/accountserver.cpp b/src/net/accountserver/accountserver.cpp index db94563b..b1ce590c 100644 --- a/src/net/accountserver/accountserver.cpp +++ b/src/net/accountserver/accountserver.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "accountserver.h" diff --git a/src/net/accountserver/accountserver.h b/src/net/accountserver/accountserver.h index 8bfe991c..8e0573fc 100644 --- a/src/net/accountserver/accountserver.h +++ b/src/net/accountserver/accountserver.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_ACCOUNTSERVER_ACCOUNTSERVER_H diff --git a/src/net/accountserver/internal.cpp b/src/net/accountserver/internal.cpp index 28a9695e..a3be76a1 100644 --- a/src/net/accountserver/internal.cpp +++ b/src/net/accountserver/internal.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "internal.h" diff --git a/src/net/accountserver/internal.h b/src/net/accountserver/internal.h index 8af5ec04..35f986cd 100644 --- a/src/net/accountserver/internal.h +++ b/src/net/accountserver/internal.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_ACCOUNTSERVER_INTERNAL_H diff --git a/src/net/beinghandler.cpp b/src/net/beinghandler.cpp index dd7d467b..72371da5 100644 --- a/src/net/beinghandler.cpp +++ b/src/net/beinghandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "beinghandler.h" diff --git a/src/net/beinghandler.h b/src/net/beinghandler.h index 8ac07017..b02728b4 100644 --- a/src/net/beinghandler.h +++ b/src/net/beinghandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_BEINGHANDLER_H diff --git a/src/net/buysellhandler.cpp b/src/net/buysellhandler.cpp index 57806edc..596ac434 100644 --- a/src/net/buysellhandler.cpp +++ b/src/net/buysellhandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "buysellhandler.h" diff --git a/src/net/buysellhandler.h b/src/net/buysellhandler.h index e242d373..52e9b2f7 100644 --- a/src/net/buysellhandler.h +++ b/src/net/buysellhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_BUYSELLHANDLER_H diff --git a/src/net/charserverhandler.cpp b/src/net/charserverhandler.cpp index 6cc9e384..bde856a5 100644 --- a/src/net/charserverhandler.cpp +++ b/src/net/charserverhandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "charserverhandler.h" diff --git a/src/net/charserverhandler.h b/src/net/charserverhandler.h index 4a4fe0c3..08ba5102 100644 --- a/src/net/charserverhandler.h +++ b/src/net/charserverhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_CHARSERVERHANDLER_H diff --git a/src/net/chathandler.cpp b/src/net/chathandler.cpp index 0cb59403..d81a8b7d 100644 --- a/src/net/chathandler.cpp +++ b/src/net/chathandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "chathandler.h" diff --git a/src/net/chathandler.h b/src/net/chathandler.h index 7ca4d50d..aeaf5368 100644 --- a/src/net/chathandler.h +++ b/src/net/chathandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_CHATHANDLER_H diff --git a/src/net/chatserver/chatserver.cpp b/src/net/chatserver/chatserver.cpp index f302a0ef..94e36b94 100644 --- a/src/net/chatserver/chatserver.cpp +++ b/src/net/chatserver/chatserver.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "chatserver.h" diff --git a/src/net/chatserver/chatserver.h b/src/net/chatserver/chatserver.h index 10de1213..1129239a 100644 --- a/src/net/chatserver/chatserver.h +++ b/src/net/chatserver/chatserver.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_CHATSERVER_CHATSERVER_H diff --git a/src/net/chatserver/guild.cpp b/src/net/chatserver/guild.cpp index fb400d5d..042ff013 100644 --- a/src/net/chatserver/guild.cpp +++ b/src/net/chatserver/guild.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ diff --git a/src/net/chatserver/guild.h b/src/net/chatserver/guild.h index 354ecd82..6c35be9f 100644 --- a/src/net/chatserver/guild.h +++ b/src/net/chatserver/guild.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ diff --git a/src/net/chatserver/internal.cpp b/src/net/chatserver/internal.cpp index c1f7a3f7..0822d93d 100644 --- a/src/net/chatserver/internal.cpp +++ b/src/net/chatserver/internal.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "internal.h" diff --git a/src/net/chatserver/internal.h b/src/net/chatserver/internal.h index 7579972b..b0f137c5 100644 --- a/src/net/chatserver/internal.h +++ b/src/net/chatserver/internal.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_CHATSERVER_INTERNAL_H diff --git a/src/net/chatserver/party.cpp b/src/net/chatserver/party.cpp index ff465924..56eb57d2 100644 --- a/src/net/chatserver/party.cpp +++ b/src/net/chatserver/party.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ diff --git a/src/net/chatserver/party.h b/src/net/chatserver/party.h index 1d47c2c5..c1febd66 100644 --- a/src/net/chatserver/party.h +++ b/src/net/chatserver/party.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ diff --git a/src/net/connection.cpp b/src/net/connection.cpp index caaa0ce1..7d3c2328 100644 --- a/src/net/connection.cpp +++ b/src/net/connection.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "connection.h" diff --git a/src/net/connection.h b/src/net/connection.h index 734c8d65..4ab3d24d 100644 --- a/src/net/connection.h +++ b/src/net/connection.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_CONNECTION_H diff --git a/src/net/effecthandler.cpp b/src/net/effecthandler.cpp index 04951d46..f7ff2bf2 100644 --- a/src/net/effecthandler.cpp +++ b/src/net/effecthandler.cpp @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #include "effecthandler.h" diff --git a/src/net/effecthandler.h b/src/net/effecthandler.h index d836b341..283c7c10 100644 --- a/src/net/effecthandler.h +++ b/src/net/effecthandler.h @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #ifndef _TMW_NET_EFFECTSHANDLER_H diff --git a/src/net/gameserver/gameserver.cpp b/src/net/gameserver/gameserver.cpp index e451d473..1bdaef26 100644 --- a/src/net/gameserver/gameserver.cpp +++ b/src/net/gameserver/gameserver.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "gameserver.h" diff --git a/src/net/gameserver/gameserver.h b/src/net/gameserver/gameserver.h index 5bf196b6..5ea2c718 100644 --- a/src/net/gameserver/gameserver.h +++ b/src/net/gameserver/gameserver.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_GAMESERVER_GAMESERVER_H diff --git a/src/net/gameserver/internal.cpp b/src/net/gameserver/internal.cpp index 328b4863..6b6ba081 100644 --- a/src/net/gameserver/internal.cpp +++ b/src/net/gameserver/internal.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "internal.h" diff --git a/src/net/gameserver/internal.h b/src/net/gameserver/internal.h index 567e15d2..df9787fe 100644 --- a/src/net/gameserver/internal.h +++ b/src/net/gameserver/internal.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_GAMESERVER_INTERNAL_H diff --git a/src/net/gameserver/player.cpp b/src/net/gameserver/player.cpp index cd85447c..95c13ec2 100644 --- a/src/net/gameserver/player.cpp +++ b/src/net/gameserver/player.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "player.h" diff --git a/src/net/gameserver/player.h b/src/net/gameserver/player.h index 75e28270..9e68ced9 100644 --- a/src/net/gameserver/player.h +++ b/src/net/gameserver/player.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_GAMESERVER_PLAYER_H diff --git a/src/net/guildhandler.cpp b/src/net/guildhandler.cpp index f6677cd8..cf886ab3 100644 --- a/src/net/guildhandler.cpp +++ b/src/net/guildhandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/net/guildhandler.h b/src/net/guildhandler.h index 01ad428b..4eb2da0b 100644 --- a/src/net/guildhandler.h +++ b/src/net/guildhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_GUILDHANDLER_H diff --git a/src/net/internal.cpp b/src/net/internal.cpp index 358aa143..4cb88a4e 100644 --- a/src/net/internal.cpp +++ b/src/net/internal.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "internal.h" diff --git a/src/net/internal.h b/src/net/internal.h index e1ef648a..1e411605 100644 --- a/src/net/internal.h +++ b/src/net/internal.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_INTERNAL_H diff --git a/src/net/inventoryhandler.cpp b/src/net/inventoryhandler.cpp index dde6a954..41032f13 100644 --- a/src/net/inventoryhandler.cpp +++ b/src/net/inventoryhandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "inventoryhandler.h" diff --git a/src/net/inventoryhandler.h b/src/net/inventoryhandler.h index 4190bf83..1326ea71 100644 --- a/src/net/inventoryhandler.h +++ b/src/net/inventoryhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_INVENTORYHANDLER_H diff --git a/src/net/itemhandler.cpp b/src/net/itemhandler.cpp index ea65bc3b..af06084f 100644 --- a/src/net/itemhandler.cpp +++ b/src/net/itemhandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "itemhandler.h" diff --git a/src/net/itemhandler.h b/src/net/itemhandler.h index 5ffcb134..e3005a6f 100644 --- a/src/net/itemhandler.h +++ b/src/net/itemhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_ITEMHANDLER_H diff --git a/src/net/loginhandler.cpp b/src/net/loginhandler.cpp index 6840d90c..f1898fb5 100644 --- a/src/net/loginhandler.cpp +++ b/src/net/loginhandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "loginhandler.h" diff --git a/src/net/loginhandler.h b/src/net/loginhandler.h index 5bac079c..f557c97b 100644 --- a/src/net/loginhandler.h +++ b/src/net/loginhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_LOGINHANDLER_H diff --git a/src/net/logouthandler.cpp b/src/net/logouthandler.cpp index fb27540f..6dea4c83 100644 --- a/src/net/logouthandler.cpp +++ b/src/net/logouthandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "logouthandler.h" diff --git a/src/net/logouthandler.h b/src/net/logouthandler.h index fa906234..369eaa80 100644 --- a/src/net/logouthandler.h +++ b/src/net/logouthandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_LOGOUTHANDLER_H diff --git a/src/net/messagehandler.cpp b/src/net/messagehandler.cpp index b6074690..973c5555 100644 --- a/src/net/messagehandler.cpp +++ b/src/net/messagehandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "messagehandler.h" diff --git a/src/net/messagehandler.h b/src/net/messagehandler.h index a5fc81b3..74226aa5 100644 --- a/src/net/messagehandler.h +++ b/src/net/messagehandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_MESSAGEHANDLER_H diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp index b5d5b97a..57c268e7 100644 --- a/src/net/messagein.cpp +++ b/src/net/messagein.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "messagein.h" diff --git a/src/net/messagein.h b/src/net/messagein.h index 3cc45a23..444699c8 100644 --- a/src/net/messagein.h +++ b/src/net/messagein.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMWSERV_MESSAGEIN_H_ diff --git a/src/net/messageout.cpp b/src/net/messageout.cpp index 10f1b1d4..b08332b6 100644 --- a/src/net/messageout.cpp +++ b/src/net/messageout.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/net/messageout.h b/src/net/messageout.h index 032db190..4eadda5f 100644 --- a/src/net/messageout.h +++ b/src/net/messageout.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMWSERV_MESSAGEOUT_H_ diff --git a/src/net/network.cpp b/src/net/network.cpp index 7cf4bf49..a4ea3def 100644 --- a/src/net/network.cpp +++ b/src/net/network.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "network.h" diff --git a/src/net/network.h b/src/net/network.h index 42590adf..13576e79 100644 --- a/src/net/network.h +++ b/src/net/network.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_NETWORK_H diff --git a/src/net/npchandler.cpp b/src/net/npchandler.cpp index 4b08ed8d..30507537 100644 --- a/src/net/npchandler.cpp +++ b/src/net/npchandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "npchandler.h" diff --git a/src/net/npchandler.h b/src/net/npchandler.h index 0cb40f64..5560787e 100644 --- a/src/net/npchandler.h +++ b/src/net/npchandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_NPCHANDLER_H diff --git a/src/net/partyhandler.cpp b/src/net/partyhandler.cpp index 7a9768fa..60c51821 100644 --- a/src/net/partyhandler.cpp +++ b/src/net/partyhandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/net/partyhandler.h b/src/net/partyhandler.h index dda78d94..b4257c34 100644 --- a/src/net/partyhandler.h +++ b/src/net/partyhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_PARTYHANDLER_H diff --git a/src/net/playerhandler.cpp b/src/net/playerhandler.cpp index 3c0a1835..ad271f15 100644 --- a/src/net/playerhandler.cpp +++ b/src/net/playerhandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "playerhandler.h" diff --git a/src/net/playerhandler.h b/src/net/playerhandler.h index 9b6c9e01..9c5f87cc 100644 --- a/src/net/playerhandler.h +++ b/src/net/playerhandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_PLAYERHANDLER_H diff --git a/src/net/protocol.h b/src/net/protocol.h index 2ed414a8..5dfa78da 100644 --- a/src/net/protocol.h +++ b/src/net/protocol.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_PROTOCOL_ diff --git a/src/net/tradehandler.cpp b/src/net/tradehandler.cpp index d75350bc..5d93016f 100644 --- a/src/net/tradehandler.cpp +++ b/src/net/tradehandler.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "tradehandler.h" diff --git a/src/net/tradehandler.h b/src/net/tradehandler.h index 33dddf05..1a0fa695 100644 --- a/src/net/tradehandler.h +++ b/src/net/tradehandler.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NET_TRADEHANDLER_H diff --git a/src/npc.cpp b/src/npc.cpp index a7302e0d..5665ad95 100644 --- a/src/npc.cpp +++ b/src/npc.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "npc.h" diff --git a/src/npc.h b/src/npc.h index 561ad9f0..60f9e6d8 100644 --- a/src/npc.h +++ b/src/npc.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NPC_H diff --git a/src/openglgraphics.cpp b/src/openglgraphics.cpp index 67248100..48b10a1f 100644 --- a/src/openglgraphics.cpp +++ b/src/openglgraphics.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "main.h" diff --git a/src/openglgraphics.h b/src/openglgraphics.h index e6d4850b..ea30e019 100644 --- a/src/openglgraphics.h +++ b/src/openglgraphics.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_OPENGLGRAPHICS_H diff --git a/src/particle.cpp b/src/particle.cpp index c59d2c03..8a15a132 100644 --- a/src/particle.cpp +++ b/src/particle.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/particle.h b/src/particle.h index 7b46a641..4a11c4cb 100644 --- a/src/particle.h +++ b/src/particle.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _PARTICLE_H diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp index cd80fb58..d368237c 100644 --- a/src/particleemitter.cpp +++ b/src/particleemitter.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "particleemitter.h" diff --git a/src/particleemitter.h b/src/particleemitter.h index c237c1ba..4dc2f6fb 100644 --- a/src/particleemitter.h +++ b/src/particleemitter.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _PARTICLEEMITTER_H diff --git a/src/player.cpp b/src/player.cpp index 97c60789..648b330a 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "player.h" diff --git a/src/player.h b/src/player.h index 7e86b1e1..068e3cf5 100644 --- a/src/player.h +++ b/src/player.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_PLAYER_H diff --git a/src/position.cpp b/src/position.cpp index 334079bb..cc39a1af 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "position.h" diff --git a/src/position.h b/src/position.h index d1aa2ee6..7beb3ef7 100644 --- a/src/position.h +++ b/src/position.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: being.h 4570 2008-09-04 20:59:34Z b_lindeijer $ */ #ifndef TMW_POSITION_H diff --git a/src/properties.h b/src/properties.h index 93148bdf..2eafeeca 100644 --- a/src/properties.h +++ b/src/properties.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_PROPERTIES_H_ diff --git a/src/resources/action.cpp b/src/resources/action.cpp index 6b3c2f52..ffbbffb2 100644 --- a/src/resources/action.cpp +++ b/src/resources/action.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "action.h" diff --git a/src/resources/action.h b/src/resources/action.h index 8d5e8d11..09eb066e 100644 --- a/src/resources/action.h +++ b/src/resources/action.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ACTION_H diff --git a/src/resources/ambientoverlay.cpp b/src/resources/ambientoverlay.cpp index 058b6083..9eee57f0 100644 --- a/src/resources/ambientoverlay.cpp +++ b/src/resources/ambientoverlay.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "ambientoverlay.h" diff --git a/src/resources/ambientoverlay.h b/src/resources/ambientoverlay.h index a939cbb4..56c70066 100644 --- a/src/resources/ambientoverlay.h +++ b/src/resources/ambientoverlay.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_RESOURCES_AMBIENTOVERLAY_H_ diff --git a/src/resources/animation.cpp b/src/resources/animation.cpp index de96525c..d2794e61 100644 --- a/src/resources/animation.cpp +++ b/src/resources/animation.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "animation.h" diff --git a/src/resources/animation.h b/src/resources/animation.h index aad93cda..8dfe8614 100644 --- a/src/resources/animation.h +++ b/src/resources/animation.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ANIMATION_H diff --git a/src/resources/buddylist.cpp b/src/resources/buddylist.cpp index 32d8d9f4..c85105c5 100644 --- a/src/resources/buddylist.cpp +++ b/src/resources/buddylist.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/buddylist.h b/src/resources/buddylist.h index 3791a03a..6a3de8c4 100644 --- a/src/resources/buddylist.h +++ b/src/resources/buddylist.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_BUDDYLIST_H diff --git a/src/resources/dye.cpp b/src/resources/dye.cpp index a43b1204..3be105d8 100644 --- a/src/resources/dye.cpp +++ b/src/resources/dye.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/dye.h b/src/resources/dye.h index a11e3365..528a1d91 100644 --- a/src/resources/dye.h +++ b/src/resources/dye.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_DYE_H diff --git a/src/resources/image.cpp b/src/resources/image.cpp index d0dae462..77d77f96 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/image.h b/src/resources/image.h index 52f286f8..3677696f 100644 --- a/src/resources/image.h +++ b/src/resources/image.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_IMAGE_H diff --git a/src/resources/imageloader.cpp b/src/resources/imageloader.cpp index 6ec5fe8f..29458ba3 100644 --- a/src/resources/imageloader.cpp +++ b/src/resources/imageloader.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/imageloader.h b/src/resources/imageloader.h index f41f6472..7979fd2f 100644 --- a/src/resources/imageloader.h +++ b/src/resources/imageloader.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_IMAGELOADER_H diff --git a/src/resources/imageset.cpp b/src/resources/imageset.cpp index ba612103..1c0f9373 100644 --- a/src/resources/imageset.cpp +++ b/src/resources/imageset.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "imageset.h" diff --git a/src/resources/imageset.h b/src/resources/imageset.h index fa1840ec..58b7a8ea 100644 --- a/src/resources/imageset.h +++ b/src/resources/imageset.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_IMAGESET_H diff --git a/src/resources/imagewriter.cpp b/src/resources/imagewriter.cpp index 7cfa16b4..d6d8a6c2 100644 --- a/src/resources/imagewriter.cpp +++ b/src/resources/imagewriter.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "imagewriter.h" diff --git a/src/resources/imagewriter.h b/src/resources/imagewriter.h index 205e4584..632e2ae4 100644 --- a/src/resources/imagewriter.h +++ b/src/resources/imagewriter.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/itemdb.cpp b/src/resources/itemdb.cpp index 306c0e5a..01688619 100644 --- a/src/resources/itemdb.cpp +++ b/src/resources/itemdb.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/itemdb.h b/src/resources/itemdb.h index df7e7be9..20756a52 100644 --- a/src/resources/itemdb.h +++ b/src/resources/itemdb.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ITEM_MANAGER_H diff --git a/src/resources/iteminfo.cpp b/src/resources/iteminfo.cpp index 4322db8d..cc7a6afc 100644 --- a/src/resources/iteminfo.cpp +++ b/src/resources/iteminfo.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "iteminfo.h" diff --git a/src/resources/iteminfo.h b/src/resources/iteminfo.h index 5b500dcf..7cc3ba15 100644 --- a/src/resources/iteminfo.h +++ b/src/resources/iteminfo.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_ITEMINFO_H_ diff --git a/src/resources/mapreader.cpp b/src/resources/mapreader.cpp index 33616c0a..cec74717 100644 --- a/src/resources/mapreader.cpp +++ b/src/resources/mapreader.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "mapreader.h" diff --git a/src/resources/mapreader.h b/src/resources/mapreader.h index 60056358..0142eb45 100644 --- a/src/resources/mapreader.h +++ b/src/resources/mapreader.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MAPREADER_H_ diff --git a/src/resources/monsterdb.cpp b/src/resources/monsterdb.cpp index f531a41d..1d198a96 100644 --- a/src/resources/monsterdb.cpp +++ b/src/resources/monsterdb.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/monsterdb.h b/src/resources/monsterdb.h index 46a33b06..f1d69e72 100644 --- a/src/resources/monsterdb.h +++ b/src/resources/monsterdb.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MONSTER_DB_H diff --git a/src/resources/monsterinfo.cpp b/src/resources/monsterinfo.cpp index 263810de..bac9c35f 100644 --- a/src/resources/monsterinfo.cpp +++ b/src/resources/monsterinfo.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "monsterinfo.h" diff --git a/src/resources/monsterinfo.h b/src/resources/monsterinfo.h index f34a3ea9..f13c2f7c 100644 --- a/src/resources/monsterinfo.h +++ b/src/resources/monsterinfo.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MONSTERINFO_H_ diff --git a/src/resources/music.cpp b/src/resources/music.cpp index 161d8b01..2386aa43 100644 --- a/src/resources/music.cpp +++ b/src/resources/music.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "music.h" diff --git a/src/resources/music.h b/src/resources/music.h index 72e76295..d50150b8 100644 --- a/src/resources/music.h +++ b/src/resources/music.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_MUSIC_H diff --git a/src/resources/npcdb.cpp b/src/resources/npcdb.cpp index bc1c920e..5cd6d20d 100644 --- a/src/resources/npcdb.cpp +++ b/src/resources/npcdb.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "npcdb.h" diff --git a/src/resources/npcdb.h b/src/resources/npcdb.h index 2abf959b..00b4f99b 100644 --- a/src/resources/npcdb.h +++ b/src/resources/npcdb.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_NPC_DB_H diff --git a/src/resources/resource.cpp b/src/resources/resource.cpp index 8f21f5d2..449caf55 100644 --- a/src/resources/resource.cpp +++ b/src/resources/resource.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/resource.h b/src/resources/resource.h index 5b9a5eb8..e85e3147 100644 --- a/src/resources/resource.h +++ b/src/resources/resource.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_RESOURCE_H diff --git a/src/resources/resourcemanager.cpp b/src/resources/resourcemanager.cpp index 9c109257..8ee64452 100644 --- a/src/resources/resourcemanager.cpp +++ b/src/resources/resourcemanager.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/resourcemanager.h b/src/resources/resourcemanager.h index da85e2f9..66813a9c 100644 --- a/src/resources/resourcemanager.h +++ b/src/resources/resourcemanager.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_RESOURCE_MANAGER_H diff --git a/src/resources/soundeffect.cpp b/src/resources/soundeffect.cpp index ec9bc65c..e21fd2b0 100644 --- a/src/resources/soundeffect.cpp +++ b/src/resources/soundeffect.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "soundeffect.h" diff --git a/src/resources/soundeffect.h b/src/resources/soundeffect.h index 866c53ec..c3ff6668 100644 --- a/src/resources/soundeffect.h +++ b/src/resources/soundeffect.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SOUND_EFFECT_H diff --git a/src/resources/spritedef.cpp b/src/resources/spritedef.cpp index dcfee165..5aea55fa 100644 --- a/src/resources/spritedef.cpp +++ b/src/resources/spritedef.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/resources/spritedef.h b/src/resources/spritedef.h index e9946a7a..56b9a713 100644 --- a/src/resources/spritedef.h +++ b/src/resources/spritedef.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SPRITEDEF_H diff --git a/src/serverinfo.h b/src/serverinfo.h index b317b87b..6522da61 100644 --- a/src/serverinfo.h +++ b/src/serverinfo.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SERVERINFO_ diff --git a/src/shopitem.cpp b/src/shopitem.cpp index ed5d30a9..9888f829 100644 --- a/src/shopitem.cpp +++ b/src/shopitem.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "shopitem.h" diff --git a/src/shopitem.h b/src/shopitem.h index 6e7606ac..05a0a67d 100644 --- a/src/shopitem.h +++ b/src/shopitem.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _SHOPITEM_H_ diff --git a/src/simpleanimation.cpp b/src/simpleanimation.cpp index f425d3c1..e8c26df1 100644 --- a/src/simpleanimation.cpp +++ b/src/simpleanimation.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "simpleanimation.h" diff --git a/src/simpleanimation.h b/src/simpleanimation.h index 561c540d..577268a8 100644 --- a/src/simpleanimation.h +++ b/src/simpleanimation.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SIMPLEANIMAION_H diff --git a/src/sound.cpp b/src/sound.cpp index 0a20d3f2..888dcc31 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "sound.h" diff --git a/src/sound.h b/src/sound.h index ebcd6442..0c2af74b 100644 --- a/src/sound.h +++ b/src/sound.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SOUND_H diff --git a/src/sprite.h b/src/sprite.h index 89780519..0e0a95db 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_SPRITE_H_ diff --git a/src/textparticle.cpp b/src/textparticle.cpp index 89466006..308c043d 100644 --- a/src/textparticle.cpp +++ b/src/textparticle.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "textparticle.h" diff --git a/src/textparticle.h b/src/textparticle.h index 34badb57..3a0ba674 100644 --- a/src/textparticle.h +++ b/src/textparticle.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TEXTPARTICLE_H diff --git a/src/tileset.h b/src/tileset.h index 625fac1b..fb855831 100644 --- a/src/tileset.h +++ b/src/tileset.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_TILESET_H_ diff --git a/src/utils/base64.cpp b/src/utils/base64.cpp index 9a8f6356..8cea60f9 100644 --- a/src/utils/base64.cpp +++ b/src/utils/base64.cpp @@ -26,7 +26,6 @@ | Author: Jim Winstead (jimw@php.net) | +----------------------------------------------------------------------+ */ -/* $Id$ */ #include #include diff --git a/src/utils/base64.h b/src/utils/base64.h index ff20ac53..c802207b 100644 --- a/src/utils/base64.h +++ b/src/utils/base64.h @@ -26,7 +26,6 @@ | Author: Jim Winstead (jimw@php.net) | +----------------------------------------------------------------------+ */ -/* $Id$ */ #ifndef _TMW_BASE64_H #define _TMW_BASE64_H diff --git a/src/utils/dtor.h b/src/utils/dtor.h index 516fd916..9aa92c84 100644 --- a/src/utils/dtor.h +++ b/src/utils/dtor.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_UTILS_DTOR_H diff --git a/src/utils/fastsqrt.h b/src/utils/fastsqrt.h index b7b036e9..78768149 100644 --- a/src/utils/fastsqrt.h +++ b/src/utils/fastsqrt.h @@ -5,8 +5,6 @@ * http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf * * Unfortunately the original creator of this function seems to be unknown. - * - * $Id$ */ float fastInvSqrt(float x) diff --git a/src/utils/gettext.h b/src/utils/gettext.h index 72533850..0cd9114b 100644 --- a/src/utils/gettext.h +++ b/src/utils/gettext.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_UTILS_GETTEXT_H diff --git a/src/utils/minmax.h b/src/utils/minmax.h index 353c60e7..7e3d84f2 100644 --- a/src/utils/minmax.h +++ b/src/utils/minmax.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/src/utils/sha256.cpp b/src/utils/sha256.cpp index 209d4f96..82d1fc5c 100644 --- a/src/utils/sha256.cpp +++ b/src/utils/sha256.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ /* +------------------------------------+ diff --git a/src/utils/sha256.h b/src/utils/sha256.h index c03efc0c..66152caf 100644 --- a/src/utils/sha256.h +++ b/src/utils/sha256.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_UTILS_SHA256_H_ diff --git a/src/utils/strprintf.cpp b/src/utils/strprintf.cpp index 26313fe9..c8a8a247 100644 --- a/src/utils/strprintf.cpp +++ b/src/utils/strprintf.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_UTILS_TOSTRING_H diff --git a/src/utils/strprintf.h b/src/utils/strprintf.h index a1fb0f13..382ab6e0 100644 --- a/src/utils/strprintf.h +++ b/src/utils/strprintf.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_UTILS_STRPRINTF_H diff --git a/src/utils/tostring.h b/src/utils/tostring.h index 95b8985f..d2dd941a 100644 --- a/src/utils/tostring.h +++ b/src/utils/tostring.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_UTILS_TOSTRING_H diff --git a/src/utils/trim.h b/src/utils/trim.h index fec99100..a7c40ca2 100644 --- a/src/utils/trim.h +++ b/src/utils/trim.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_UTILS_TRIM_H_ diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp index 98b474cb..47f1bd04 100644 --- a/src/utils/xml.cpp +++ b/src/utils/xml.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "xml.h" diff --git a/src/utils/xml.h b/src/utils/xml.h index 5473b2ca..5a5c756b 100644 --- a/src/utils/xml.h +++ b/src/utils/xml.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_XML_H diff --git a/src/vector.cpp b/src/vector.cpp index 88092c9b..7d5f055a 100644 --- a/src/vector.cpp +++ b/src/vector.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id: vector.h 4592 2008-09-07 20:38:52Z b_lindeijer $ */ #include "vector.h" diff --git a/src/vector.h b/src/vector.h index 7251eff0..f32b201a 100644 --- a/src/vector.h +++ b/src/vector.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_VECTOR_H_ diff --git a/tools/dyecmd/src/dye.cpp b/tools/dyecmd/src/dye.cpp index 73912a96..c93f46c8 100644 --- a/tools/dyecmd/src/dye.cpp +++ b/tools/dyecmd/src/dye.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/tools/dyecmd/src/dye.h b/tools/dyecmd/src/dye.h index a11e3365..528a1d91 100644 --- a/tools/dyecmd/src/dye.h +++ b/tools/dyecmd/src/dye.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_DYE_H diff --git a/tools/dyecmd/src/dyecmd.cpp b/tools/dyecmd/src/dyecmd.cpp index 7254e287..8938aea5 100644 --- a/tools/dyecmd/src/dyecmd.cpp +++ b/tools/dyecmd/src/dyecmd.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/tools/dyecmd/src/imagewriter.cpp b/tools/dyecmd/src/imagewriter.cpp index 36c139b9..9b4b10dc 100644 --- a/tools/dyecmd/src/imagewriter.cpp +++ b/tools/dyecmd/src/imagewriter.cpp @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include "imagewriter.h" diff --git a/tools/dyecmd/src/imagewriter.h b/tools/dyecmd/src/imagewriter.h index 205e4584..632e2ae4 100644 --- a/tools/dyecmd/src/imagewriter.h +++ b/tools/dyecmd/src/imagewriter.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #include diff --git a/tools/tmxcopy/base64.cpp b/tools/tmxcopy/base64.cpp index 9a8f6356..8cea60f9 100644 --- a/tools/tmxcopy/base64.cpp +++ b/tools/tmxcopy/base64.cpp @@ -26,7 +26,6 @@ | Author: Jim Winstead (jimw@php.net) | +----------------------------------------------------------------------+ */ -/* $Id$ */ #include #include diff --git a/tools/tmxcopy/base64.h b/tools/tmxcopy/base64.h index ff20ac53..c802207b 100644 --- a/tools/tmxcopy/base64.h +++ b/tools/tmxcopy/base64.h @@ -26,7 +26,6 @@ | Author: Jim Winstead (jimw@php.net) | +----------------------------------------------------------------------+ */ -/* $Id$ */ #ifndef _TMW_BASE64_H #define _TMW_BASE64_H diff --git a/tools/tmxcopy/tostring.h b/tools/tmxcopy/tostring.h index 95b8985f..d2dd941a 100644 --- a/tools/tmxcopy/tostring.h +++ b/tools/tmxcopy/tostring.h @@ -17,8 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * $Id$ */ #ifndef _TMW_UTILS_TOSTRING_H diff --git a/tools/tmxcopy/xmlutils.cpp b/tools/tmxcopy/xmlutils.cpp index 47bff51a..8b1b62cf 100644 --- a/tools/tmxcopy/xmlutils.cpp +++ b/tools/tmxcopy/xmlutils.cpp @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #include "xmlutils.h" diff --git a/tools/tmxcopy/xmlutils.h b/tools/tmxcopy/xmlutils.h index 32d1a960..60e8f3cd 100644 --- a/tools/tmxcopy/xmlutils.h +++ b/tools/tmxcopy/xmlutils.h @@ -17,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * */ #ifndef _XMLUTILS_H -- cgit v1.2.3-70-g09d2 From d26abb724e4d64ca7be507d99d80ab778813684f Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Fri, 5 Dec 2008 21:38:31 +0100 Subject: Fix race condition with a std::string access The downloading thread was writing to a std::string while the main thread was trying to draw it, for example. Now access to the label caption is guarded with a mutex. Should fix crashes while downloading updates. (cherry picked from eAthena branch, commits 6ac9c3bce62a8fc79e23477417188108f0ad9fa6 and 06d0205bab253ec5d01e8483ab639a092fe117c5) --- src/Makefile.am | 1 + src/gui/updatewindow.cpp | 31 ++++++++++------ src/gui/updatewindow.h | 13 +++++-- src/utils/mutex.h | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 127 insertions(+), 15 deletions(-) create mode 100644 src/utils/mutex.h (limited to 'src/utils') diff --git a/src/Makefile.am b/src/Makefile.am index e953507a..65e8cafd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -282,6 +282,7 @@ tmw_SOURCES = gui/widgets/avatar.cpp \ utils/strprintf.cpp \ utils/tostring.h \ utils/trim.h \ + utils/mutex.h \ utils/xml.cpp \ utils/xml.h \ animatedsprite.cpp \ diff --git a/src/gui/updatewindow.cpp b/src/gui/updatewindow.cpp index 0d6b00af..997a9b82 100644 --- a/src/gui/updatewindow.cpp +++ b/src/gui/updatewindow.cpp @@ -47,7 +47,7 @@ /** * Calculates the Alder-32 checksum for the given file. */ -unsigned long fadler32(FILE *file) +static unsigned long fadler32(FILE *file) { // Obtain file size fseek(file, 0, SEEK_END); @@ -146,15 +146,9 @@ UpdaterWindow::UpdaterWindow(const std::string &updateHost, UpdaterWindow::~UpdaterWindow() { if (mThread) - { - SDL_WaitThread(mThread, NULL); - mThread = NULL; - } + SDL_WaitThread(mThread, NULL); - if (mMemoryBuffer) - { - free(mMemoryBuffer); - } + free(mMemoryBuffer); // Remove possibly leftover temporary download ::remove((mUpdatesDir + "/download.temp").c_str()); @@ -169,8 +163,9 @@ void UpdaterWindow::setProgress(float p) void UpdaterWindow::setLabel(const std::string &str) { - mLabel->setCaption(str); - mLabel->adjustSize(); + // Do delayed label text update, since Guichan isn't thread-safe + MutexLocker lock(&mLabelMutex); + mNewLabelCaption = str; } void UpdaterWindow::enable() @@ -429,6 +424,17 @@ void UpdaterWindow::logic() // Update Scroll logic mScrollArea->logic(); + // Synchronize label caption when necessary + { + MutexLocker lock(&mLabelMutex); + + if (mLabel->getCaption() != mNewLabelCaption) + { + mLabel->setCaption(mNewLabelCaption); + mLabel->adjustSize(); + } + } + switch (mDownloadStatus) { case UPDATE_ERROR: @@ -450,7 +456,8 @@ void UpdaterWindow::logic() mBrowserBox->addRow("##1 It is strongly recommended that"); mBrowserBox->addRow("##1 you try again later"); mBrowserBox->addRow(mCurlError); - mScrollArea->setVerticalScrollAmount(mScrollArea->getVerticalMaxScroll()); + mScrollArea->setVerticalScrollAmount( + mScrollArea->getVerticalMaxScroll()); mDownloadStatus = UPDATE_COMPLETE; break; case UPDATE_NEWS: diff --git a/src/gui/updatewindow.h b/src/gui/updatewindow.h index d7e3c4c7..a7dfe2cb 100644 --- a/src/gui/updatewindow.h +++ b/src/gui/updatewindow.h @@ -30,12 +30,13 @@ #include "../guichanfwd.h" +#include "../utils/mutex.h" + class BrowserBox; class Button; class ProgressBar; class ScrollArea; -struct SDL_mutex; struct SDL_Thread; /** @@ -88,7 +89,7 @@ class UpdaterWindow : public Window, public gcn::ActionListener int updateState; - protected: +private: void download(); /** @@ -133,6 +134,12 @@ class UpdaterWindow : public Window, public gcn::ActionListener /** The file currently downloading. */ std::string mCurrentFile; + /** The new label caption to be set in the logic method. */ + std::string mNewLabelCaption; + + /** The mutex used to guard access to mNewLabelCaption. */ + Mutex mLabelMutex; + /** The Adler32 checksum of the file currently downloading. */ unsigned long mCurrentChecksum; @@ -164,7 +171,7 @@ class UpdaterWindow : public Window, public gcn::ActionListener Button *mCancelButton; /**< Button to stop the update process. */ Button *mPlayButton; /**< Button to start playing. */ ProgressBar *mProgressBar; /**< Update progress bar. */ - BrowserBox* mBrowserBox; /**< Box to display news. */ + BrowserBox *mBrowserBox; /**< Box to display news. */ ScrollArea *mScrollArea; /**< Used to scroll news box. */ }; diff --git a/src/utils/mutex.h b/src/utils/mutex.h new file mode 100644 index 00000000..62c6b4e1 --- /dev/null +++ b/src/utils/mutex.h @@ -0,0 +1,97 @@ +/* + * The Mana World + * Copyright 2008 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * The Mana World is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef TMW_MUTEX_H +#define TMW_MUTEX_H + +#include + +#include "../log.h" + +/** + * A mutex provides mutual exclusion of access to certain data that is + * accessed by multiple threads. + */ +class Mutex +{ +public: + Mutex(); + ~Mutex(); + + void lock(); + void unlock(); + +private: + Mutex(const Mutex&); // prevent copying + Mutex& operator=(const Mutex&); + + SDL_mutex *mMutex; +}; + +/** + * A convenience class for locking a mutex. + */ +class MutexLocker +{ +public: + MutexLocker(Mutex *mutex); + ~MutexLocker(); + +private: + Mutex *mMutex; +}; + + +inline Mutex::Mutex() +{ + mMutex = SDL_CreateMutex(); +} + +inline Mutex::~Mutex() +{ + SDL_DestroyMutex(mMutex); +} + +inline void Mutex::lock() +{ + if (SDL_mutexP(mMutex) == -1) + logger->log("Mutex locking failed: %s", SDL_GetError()); +} + +inline void Mutex::unlock() +{ + if (SDL_mutexV(mMutex) == -1) + logger->log("Mutex unlocking failed: %s", SDL_GetError()); +} + + +inline MutexLocker::MutexLocker(Mutex *mutex): + mMutex(mutex) +{ + mMutex->lock(); +} + +inline MutexLocker::~MutexLocker() +{ + mMutex->unlock(); +} + +#endif // TMW_MUTEX_H -- cgit v1.2.3-70-g09d2 From bc7ce889e154a121fdbd0a8126c35194ee3a7b52 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Sat, 13 Dec 2008 16:20:10 +0100 Subject: Fixed compile error with GCC 4.4 reported by Martin Michlmayr. (cherry picked from eAthena client) Conflicts: ChangeLog --- src/utils/strprintf.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'src/utils') diff --git a/src/utils/strprintf.cpp b/src/utils/strprintf.cpp index c8a8a247..c5d7a595 100644 --- a/src/utils/strprintf.cpp +++ b/src/utils/strprintf.cpp @@ -19,10 +19,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef _TMW_UTILS_TOSTRING_H -#define _TMW_UTILS_TOSTRING_H - #include +#include #include "strprintf.h" @@ -47,5 +45,3 @@ std::string strprintf(char const *format, ...) delete [] buf2; return res; } - -#endif -- cgit v1.2.3-70-g09d2 From 0fd9aef8bf376d44132edded2cdcb41ba7ee5b2f Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Mon, 5 Jan 2009 21:16:23 +0100 Subject: Mostly whitespace and formatting changes (merged from eAthena client) --- INSTALL | 7 +++--- docs/FAQ.txt | 12 +++++----- docs/INSTALL/win32.txt | 6 ++--- po/POTFILES.in | 1 + src/Makefile.am | 10 ++++----- src/gui/browserbox.cpp | 2 +- src/gui/browserbox.h | 2 +- src/gui/buy.cpp | 13 +++++------ src/gui/buy.h | 3 +-- src/gui/char_select.cpp | 1 - src/gui/inventorywindow.cpp | 3 +-- src/gui/item_amount.cpp | 3 +-- src/gui/item_amount.h | 2 +- src/gui/login.cpp | 3 ++- src/gui/menuwindow.cpp | 2 +- src/gui/npc_text.h | 2 +- src/gui/playerbox.cpp | 6 ++--- src/gui/popupmenu.cpp | 1 - src/gui/sell.cpp | 4 +--- src/gui/setup.cpp | 2 +- src/gui/setup_keyboard.cpp | 12 +++++----- src/gui/trade.cpp | 2 -- src/gui/window.cpp | 14 +++++------- src/gui/window.h | 23 ++++++++++---------- src/main.cpp | 2 +- src/net/messagein.h | 4 ++-- src/net/network.cpp | 46 ++++++++++++++++++--------------------- src/resources/npcdb.cpp | 1 - src/resources/resourcemanager.cpp | 6 ++++- src/utils/xml.cpp | 15 ++++++------- src/utils/xml.h | 10 ++++----- 31 files changed, 103 insertions(+), 117 deletions(-) (limited to 'src/utils') diff --git a/INSTALL b/INSTALL index 3b790ffd..fd921f59 100644 --- a/INSTALL +++ b/INSTALL @@ -12,9 +12,9 @@ IRC: irc.freenode.net / #themanaworld 1. Requirements =============== -You are expected to have either checked out TMW from Subversion or you have -downloaded a source release. To get The Mana World to compile, you need a -compiler (GCC) and some libraries. The required libraries are: +You are expected to have either checked out TMW from Git or you have downloaded +a source release. To get The Mana World to compile, you need a compiler (GCC) +and some libraries. The required libraries are: * SDL http://www.libsdl.org/ * SDL_mixer http://www.libsdl.org/projects/SDL_mixer/ @@ -52,6 +52,7 @@ It should have installed The Mana World on your system now, and you can run it with "tmw". By default all files are installed to /usr/local, you can pass a different prefix to configure as usual. + NOTE: It is possible to compile TMW without support for OpenGL rendering. To do this perform step 3 as follows: diff --git a/docs/FAQ.txt b/docs/FAQ.txt index 6055513c..2f1eee8b 100644 --- a/docs/FAQ.txt +++ b/docs/FAQ.txt @@ -12,7 +12,7 @@ A: The fastest way is to come on our IRC channel. There you can find a lot of http://forums.themanaworld.org. Ok, do you think forums are evil? Don't worry, send me an e-mail at elvenprogrammer@gmail.com and you're done. That's not enough? No, I won't give you my phone number! ;P - + GAME Q: I always get "Unregistered ID" error message, why? @@ -59,7 +59,7 @@ Q: What's SVN? A: It's a system where is stored the latest development version. It's not assured that it's stable, but surely it has the latest updates. (SVN version is updated quite frequently). If you want to check it out, read this guide - http://themanaworld.org/svn-tutorial.txt + http://themanaworld.org/svn-tutorial.txt DEVELOPMENT @@ -73,18 +73,18 @@ A: We have scheduled releases. Usually a new release is available every month. Q: How can I contribute? A: There are a lot of ways: - + - If you're a programmer, an artist or just willing to help in any way, you can become part of the development team. Send an e-mail to elvenprogrammer@gmail.com explaining what you want to do, or join our irc channel: #themanaworld @ irc.freenode.net. - + - You can donate money. Follow the link on the project page: http://sourceforge.net/projects/themanaworld. - + - You can be a beta tester. Just play with The Mana World and report every error to the tracker. Read for more infos on the project page: http://themanaworld.org. - + - Play with The Mana World: more players, more fun! Simple as that! ;-) diff --git a/docs/INSTALL/win32.txt b/docs/INSTALL/win32.txt index 7f6ee42a..1a1e527f 100644 --- a/docs/INSTALL/win32.txt +++ b/docs/INSTALL/win32.txt @@ -99,11 +99,11 @@ Install them all through the Dev-C++ package manager. **) For PhysFS copy the headers to your include directory, the libs to the lib directory and the dlls (in bin direcotry) to your tmw directory. - + ***) Download developer files and put headers and libs in to include and lib directories of Dev-Cpp. Download binaries and place the dll inside tmw - folder. - + folder. + ****) Get latest win32 - mingw package and install as usual. You should now be fully equipped for compiling the latest TMW development diff --git a/po/POTFILES.in b/po/POTFILES.in index 86b9de67..9d81dc29 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -21,6 +21,7 @@ src/gui/serverdialog.cpp src/gui/setup_audio.cpp src/gui/setup.cpp src/gui/setup_joystick.cpp +src/gui/setup_keyboard.cpp src/gui/setup_video.cpp src/gui/trade.cpp src/resources/itemdb.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 5cf1a6e8..d3926a70 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -250,14 +250,14 @@ tmw_SOURCES = gui/widgets/avatar.cpp \ resources/iteminfo.cpp \ resources/mapreader.cpp \ resources/mapreader.h \ - resources/monsterdb.h \ resources/monsterdb.cpp \ - resources/monsterinfo.h \ + resources/monsterdb.h \ resources/monsterinfo.cpp \ - resources/music.h \ + resources/monsterinfo.h \ resources/music.cpp \ - resources/npcdb.h \ + resources/music.h \ resources/npcdb.cpp \ + resources/npcdb.h \ resources/resource.cpp \ resources/resource.h \ resources/resourcemanager.cpp \ @@ -276,8 +276,8 @@ tmw_SOURCES = gui/widgets/avatar.cpp \ utils/minmax.h \ utils/sha256.h \ utils/sha256.cpp \ - utils/strprintf.h \ utils/strprintf.cpp \ + utils/strprintf.h \ utils/tostring.h \ utils/trim.h \ utils/mutex.h \ diff --git a/src/gui/browserbox.cpp b/src/gui/browserbox.cpp index b0b6f48e..03540d31 100644 --- a/src/gui/browserbox.cpp +++ b/src/gui/browserbox.cpp @@ -142,7 +142,7 @@ void BrowserBox::addRow(const std::string &row) { unsigned int y = 0; unsigned int nextChar; - char const *hyphen = "~"; + const char *hyphen = "~"; int hyphenWidth = font->getWidth(hyphen); int x = 0; diff --git a/src/gui/browserbox.h b/src/gui/browserbox.h index 465ff497..cb4c23ed 100644 --- a/src/gui/browserbox.h +++ b/src/gui/browserbox.h @@ -25,8 +25,8 @@ #include #include -#include #include +#include #include "../guichanfwd.h" #include "../main.h" diff --git a/src/gui/buy.cpp b/src/gui/buy.cpp index 008c7bb9..cc2262ec 100644 --- a/src/gui/buy.cpp +++ b/src/gui/buy.cpp @@ -165,15 +165,15 @@ void BuyDialog::action(const gcn::ActionEvent &event) Net::GameServer::Player::tradeWithNPC (mShopItems->at(selectedItem)->getId(), mAmountItems); - // Reset selection - mAmountItems = 1; - mSlider->setValue(1); - mSlider->gcn::Slider::setScale(1, mMaxItems); - // Update money and adjust the max number of items that can be bought mMaxItems -= mAmountItems; setMoney(mMoney - mAmountItems * mShopItems->at(selectedItem)->getPrice()); + + // Reset selection + mAmountItems = 1; + mSlider->setValue(1); + mSlider->gcn::Slider::setScale(1, mMaxItems); } } @@ -187,8 +187,7 @@ void BuyDialog::valueChanged(const gcn::SelectionEvent &event) mSlider->gcn::Slider::setScale(1, mMaxItems); } -void -BuyDialog::updateButtonsAndLabels() +void BuyDialog::updateButtonsAndLabels() { const int selectedItem = mShopItemList->getSelected(); int price = 0; diff --git a/src/gui/buy.h b/src/gui/buy.h index 24f18742..a80ffed7 100644 --- a/src/gui/buy.h +++ b/src/gui/buy.h @@ -92,8 +92,7 @@ class BuyDialog : public Window, public gcn::ActionListener, /** * Updates the state of buttons and labels. */ - void - updateButtonsAndLabels(); + void updateButtonsAndLabels(); private: gcn::Button *mBuyButton; diff --git a/src/gui/char_select.cpp b/src/gui/char_select.cpp index 67cb3c7b..f800c266 100644 --- a/src/gui/char_select.cpp +++ b/src/gui/char_select.cpp @@ -134,7 +134,6 @@ CharSelectDialog::CharSelectDialog(LockedArray *charInfo, setVisible(true); mSelectButton->requestFocus(); updatePlayerInfo(); - } void CharSelectDialog::action(const gcn::ActionEvent &event) diff --git a/src/gui/inventorywindow.cpp b/src/gui/inventorywindow.cpp index 1765eeea..b4a96394 100644 --- a/src/gui/inventorywindow.cpp +++ b/src/gui/inventorywindow.cpp @@ -102,9 +102,8 @@ void InventoryWindow::logic() void InventoryWindow::action(const gcn::ActionEvent &event) { Item *item = mItems->getItem(); - if (!item) { + if (!item) return; - } if (event.getId() == "use") { diff --git a/src/gui/item_amount.cpp b/src/gui/item_amount.cpp index c6763014..cae681d4 100644 --- a/src/gui/item_amount.cpp +++ b/src/gui/item_amount.cpp @@ -75,8 +75,7 @@ ItemAmountWindow::ItemAmountWindow(int usage, Window *parent, Item *item, resetAmount(); - switch (usage) - { + switch (usage) { case AMOUNT_TRADE_ADD: setCaption(_("Select amount of items to trade.")); okButton->setActionEventId("AddTrade"); diff --git a/src/gui/item_amount.h b/src/gui/item_amount.h index dd1026b7..c0d2b2c0 100644 --- a/src/gui/item_amount.h +++ b/src/gui/item_amount.h @@ -38,7 +38,7 @@ class Item; #define AMOUNT_ITEM_SPLIT 3 /** - * Window used for selecting the amount of items to drop. + * Window used for selecting the amount of items to drop, trade or split. * * \ingroup Interface */ diff --git a/src/gui/login.cpp b/src/gui/login.cpp index b4289984..615045b6 100644 --- a/src/gui/login.cpp +++ b/src/gui/login.cpp @@ -38,7 +38,8 @@ #include "../utils/gettext.h" -LoginDialog::LoginDialog(LoginData *loginData) : Window(_("Login")), mLoginData(loginData) +LoginDialog::LoginDialog(LoginData *loginData): + Window(_("Login")), mLoginData(loginData) { gcn::Label *userLabel = new gcn::Label(_("Name:")); gcn::Label *passLabel = new gcn::Label(_("Password:")); diff --git a/src/gui/menuwindow.cpp b/src/gui/menuwindow.cpp index f74dfa41..9415188e 100644 --- a/src/gui/menuwindow.cpp +++ b/src/gui/menuwindow.cpp @@ -58,7 +58,7 @@ MenuWindow::MenuWindow(): setTitleBarHeight(0); // Buttons - static char const *buttonNames[] = + static const char *buttonNames[] = { N_("Status"), N_("Equipment"), diff --git a/src/gui/npc_text.h b/src/gui/npc_text.h index 76161f88..b6eccf95 100644 --- a/src/gui/npc_text.h +++ b/src/gui/npc_text.h @@ -45,7 +45,7 @@ class NpcTextDialog : public Window, public gcn::ActionListener NpcTextDialog(); /** - * Called when resizing the window + * Called when resizing the window. * * @param event The calling event */ diff --git a/src/gui/playerbox.cpp b/src/gui/playerbox.cpp index 0a0c8a17..6888d69a 100644 --- a/src/gui/playerbox.cpp +++ b/src/gui/playerbox.cpp @@ -74,8 +74,7 @@ PlayerBox::~PlayerBox() } } -void -PlayerBox::draw(gcn::Graphics *graphics) +void PlayerBox::draw(gcn::Graphics *graphics) { if (mPlayer) { @@ -87,8 +86,7 @@ PlayerBox::draw(gcn::Graphics *graphics) } } -void -PlayerBox::drawFrame(gcn::Graphics *graphics) +void PlayerBox::drawFrame(gcn::Graphics *graphics) { int w, h, bs; bs = getFrameSize(); diff --git a/src/gui/popupmenu.cpp b/src/gui/popupmenu.cpp index 59ca0867..a430ff10 100644 --- a/src/gui/popupmenu.cpp +++ b/src/gui/popupmenu.cpp @@ -75,7 +75,6 @@ void PopupMenu::showPopup(int x, int y, Being *being) // add as buddy will be options in this menu. const std::string &name = mBeing->getName(); mBrowserBox->addRow(strprintf(_("@@trade|Trade With %s@@"), name.c_str())); - mBrowserBox->addRow(strprintf(_("@@attack|Attack %s@@"), name.c_str())); //mBrowserBox->addRow("@@follow|Follow " + name + "@@"); //mBrowserBox->addRow("@@buddy|Add " + name + " to Buddy List@@"); diff --git a/src/gui/sell.cpp b/src/gui/sell.cpp index 24391458..9aee4bee 100644 --- a/src/gui/sell.cpp +++ b/src/gui/sell.cpp @@ -202,8 +202,7 @@ void SellDialog::setMoney(int amount) mShopItemList->setPlayersMoney(amount); } -void -SellDialog::updateButtonsAndLabels() +void SellDialog::updateButtonsAndLabels() { int selectedItem = mShopItemList->getSelected(); int income = 0; @@ -211,7 +210,6 @@ SellDialog::updateButtonsAndLabels() if (selectedItem > -1) { const ItemInfo &info = mShopItems->at(selectedItem)->getInfo(); - mItemDescLabel->setCaption (strprintf(_("Description: %s"), info.getDescription().c_str())); mItemEffectLabel->setCaption diff --git a/src/gui/setup.cpp b/src/gui/setup.cpp index e062f674..59b54be0 100644 --- a/src/gui/setup.cpp +++ b/src/gui/setup.cpp @@ -53,7 +53,7 @@ Setup::Setup(): int height = 265; setContentSize(width, height); - static char const *buttonNames[] = { + static const char *buttonNames[] = { N_("Apply"), N_("Cancel"), N_("Reset Windows"), 0 }; int x = width; diff --git a/src/gui/setup_keyboard.cpp b/src/gui/setup_keyboard.cpp index 270f4a0e..e4d1af0c 100644 --- a/src/gui/setup_keyboard.cpp +++ b/src/gui/setup_keyboard.cpp @@ -32,6 +32,7 @@ #include "../configuration.h" #include "../keyboardconfig.h" +#include "../utils/gettext.h" #include "../utils/tostring.h" #include @@ -85,13 +86,13 @@ Setup_Keyboard::Setup_Keyboard(): scrollArea->setDimension(gcn::Rectangle(10, 10, 200, 140)); add(scrollArea); - mAssignKeyButton = new Button("Assign", "assign", this); + mAssignKeyButton = new Button(_("Assign"), "assign", this); mAssignKeyButton->setPosition(165, 155); mAssignKeyButton->addActionListener(this); mAssignKeyButton->setEnabled(false); add(mAssignKeyButton); - mMakeDefaultButton = new Button("Default", "makeDefault", this); + mMakeDefaultButton = new Button(_("Default"), "makeDefault", this); mMakeDefaultButton->setPosition(10, 155); mMakeDefaultButton->addActionListener(this); add(mMakeDefaultButton); @@ -112,8 +113,9 @@ void Setup_Keyboard::apply() if (keyboard.hasConflicts()) { - new OkDialog("Key Conflict(s) Detected.", - "Resolve them, or gameplay may result in strange behaviour."); + new OkDialog(_("Key Conflict(s) Detected."), + _("Resolve them, or gameplay may result in strange " + "behaviour.")); } keyboard.setEnabled(true); keyboard.store(); @@ -171,7 +173,7 @@ void Setup_Keyboard::newKeyCallback(int index) void Setup_Keyboard::refreshKeys() { - for(int i = 0; i < keyboard.KEY_TOTAL; i++) + for (int i = 0; i < keyboard.KEY_TOTAL; i++) { refreshAssignedKey(i); } diff --git a/src/gui/trade.cpp b/src/gui/trade.cpp index 7d5051c7..0592c485 100644 --- a/src/gui/trade.cpp +++ b/src/gui/trade.cpp @@ -188,9 +188,7 @@ void TradeWindow::action(const gcn::ActionEvent &event) if (event.getId() == "add") { if (!item) - { return; - } if (mMyInventory->contains(item)) { chatWindow->chatLog("Failed adding item. You can not " diff --git a/src/gui/window.cpp b/src/gui/window.cpp index 582e4a67..64607243 100644 --- a/src/gui/window.cpp +++ b/src/gui/window.cpp @@ -31,7 +31,6 @@ #include "window.h" #include "gui.h" -#include "gccontainer.h" #include "windowcontainer.h" #include "widgets/layout.h" @@ -87,8 +86,7 @@ Window::Window(const std::string& caption, bool modal, Window *parent): { logger->log("Window::Window(\"%s\")", caption.c_str()); - if (!windowContainer) - { + if (!windowContainer) { throw GCN_EXCEPTION("Window::Window(): no windowContainer set"); } @@ -128,17 +126,15 @@ Window::Window(const std::string& caption, bool modal, Window *parent): Window::~Window() { logger->log("UNLOAD: Window::~Window(\"%s\")", getCaption().c_str()); - const std::string &name = mWindowName; - if (!name.empty()) - { - // Saving X, Y and Width and Height for resizables in the config + + // Saving X, Y and Width and Height for resizables in the config + if (!name.empty()) { config.setValue(name + "WinX", getX()); config.setValue(name + "WinY", getY()); config.setValue(name + "Visible", isVisible()); - if (mGrip) - { + if (mGrip) { config.setValue(name + "WinWidth", getWidth()); config.setValue(name + "WinHeight", getHeight()); } diff --git a/src/gui/window.h b/src/gui/window.h index 6f49e062..50a206f0 100644 --- a/src/gui/window.h +++ b/src/gui/window.h @@ -222,17 +222,6 @@ class Window : public gcn::Window, gcn::WidgetListener */ void resetToDefaultSize(); - enum ResizeHandles - { - TOP = 0x01, - RIGHT = 0x02, - BOTTOM = 0x04, - LEFT = 0x08 - }; - - /** The window container windows add themselves to. */ - static WindowContainer *windowContainer; - /** * Gets the layout handler for this window. */ @@ -263,7 +252,19 @@ class Window : public gcn::Window, gcn::WidgetListener */ void loadSkin(const std::string &fileName); + protected: + /** The window container windows add themselves to. */ + static WindowContainer *windowContainer; + private: + enum ResizeHandles + { + TOP = 0x01, + RIGHT = 0x02, + BOTTOM = 0x04, + LEFT = 0x08 + }; + /** * Determines if the mouse is in a resize area and returns appropriate * resize handles. Also initializes drag offset in case the resize diff --git a/src/main.cpp b/src/main.cpp index 2d6b08a8..39a0fb37 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -315,7 +315,7 @@ void initEngine(const Options &options) if (!resman->setWriteDir(homeDir)) { std::cout << homeDir - << " couldn't be set as home directory! Exitting." + << " couldn't be set as home directory! Exiting." << std::endl; exit(1); } diff --git a/src/net/messagein.h b/src/net/messagein.h index 444699c8..f2390baa 100644 --- a/src/net/messagein.h +++ b/src/net/messagein.h @@ -61,13 +61,13 @@ class MessageIn * Returns the message length. */ unsigned int - getLength() { return mLength; } + getLength() const { return mLength; } /** * Returns the length of unread data. */ unsigned int - getUnreadLength() { return mLength - mPos; } + getUnreadLength() const { return mLength - mPos; } private: const char* mData; /**< The message data. */ diff --git a/src/net/network.cpp b/src/net/network.cpp index a4ea3def..57e368e2 100644 --- a/src/net/network.cpp +++ b/src/net/network.cpp @@ -83,8 +83,7 @@ Net::Connection *Net::getConnection() return new Net::Connection(client); } -void -Net::registerHandler(MessageHandler *handler) +void Net::registerHandler(MessageHandler *handler) { for (const Uint16 *i = handler->handledMessages; *i; i++) { @@ -92,8 +91,7 @@ Net::registerHandler(MessageHandler *handler) } } -void -Net::unregisterHandler(MessageHandler *handler) +void Net::unregisterHandler(MessageHandler *handler) { for (const Uint16 *i = handler->handledMessages; *i; i++) { @@ -101,8 +99,7 @@ Net::unregisterHandler(MessageHandler *handler) } } -void -Net::clearHandlers() +void Net::clearHandlers() { mMessageHandlers.clear(); } @@ -114,26 +111,25 @@ Net::clearHandlers() */ namespace { - void - dispatchMessage(ENetPacket *packet) - { - MessageIn msg((const char *)packet->data, packet->dataLength); - - MessageHandlerIterator iter = mMessageHandlers.find(msg.getId()); - - if (iter != mMessageHandlers.end()) { - //logger->log("Received packet %x (%i B)", - // msg.getId(), msg.getLength()); - iter->second->handleMessage(msg); - } - else { - logger->log("Unhandled packet %x (%i B)", - msg.getId(), msg.getLength()); - } - - // Clean up the packet now that we're done using it. - enet_packet_destroy(packet); + void dispatchMessage(ENetPacket *packet) + { + MessageIn msg((const char *)packet->data, packet->dataLength); + + MessageHandlerIterator iter = mMessageHandlers.find(msg.getId()); + + if (iter != mMessageHandlers.end()) { + //logger->log("Received packet %x (%i B)", + // msg.getId(), msg.getLength()); + iter->second->handleMessage(msg); } + else { + logger->log("Unhandled packet %x (%i B)", + msg.getId(), msg.getLength()); + } + + // Clean up the packet now that we're done using it. + enet_packet_destroy(packet); + } } void Net::flush() diff --git a/src/resources/npcdb.cpp b/src/resources/npcdb.cpp index 5cd6d20d..2f8d78d4 100644 --- a/src/resources/npcdb.cpp +++ b/src/resources/npcdb.cpp @@ -132,4 +132,3 @@ NPCDB::get(int id) return *(i->second); } } - diff --git a/src/resources/resourcemanager.cpp b/src/resources/resourcemanager.cpp index bebd17f8..3d42d92e 100644 --- a/src/resources/resourcemanager.cpp +++ b/src/resources/resourcemanager.cpp @@ -95,11 +95,15 @@ ResourceManager::~ResourceManager() void ResourceManager::cleanUp(Resource *res) { - logger->log("ResourceManager::~ResourceManager() cleaning up %d " + if (res->mRefCount > 0) + { + logger->log("ResourceManager::~ResourceManager() cleaning up %d " "reference%s to %s", res->mRefCount, (res->mRefCount == 1) ? "" : "s", res->mIdPath.c_str()); + } + delete res; } diff --git a/src/utils/xml.cpp b/src/utils/xml.cpp index 47f1bd04..05df9f1d 100644 --- a/src/utils/xml.cpp +++ b/src/utils/xml.cpp @@ -26,7 +26,7 @@ namespace XML { Document::Document(const std::string &filename): - mDoc(NULL) + mDoc(0) { int size; ResourceManager *resman = ResourceManager::getInstance(); @@ -59,8 +59,7 @@ namespace XML return mDoc ? xmlDocGetRootElement(mDoc) : 0; } - int - getProperty(xmlNodePtr node, const char* name, int def) + int getProperty(xmlNodePtr node, const char* name, int def) { int &ret = def; @@ -73,8 +72,7 @@ namespace XML return ret; } - double - getFloatProperty(xmlNodePtr node, const char* name, double def) + double getFloatProperty(xmlNodePtr node, const char* name, double def) { double &ret = def; @@ -87,8 +85,8 @@ namespace XML return ret; } - std::string - getProperty(xmlNodePtr node, const char *name, const std::string &def) + std::string getProperty(xmlNodePtr node, const char *name, + const std::string &def) { xmlChar *prop = xmlGetProp(node, BAD_CAST name); if (prop) { @@ -108,4 +106,5 @@ namespace XML return NULL; } -} + +} // namespace XML diff --git a/src/utils/xml.h b/src/utils/xml.h index 5a5c756b..d0aba62e 100644 --- a/src/utils/xml.h +++ b/src/utils/xml.h @@ -71,20 +71,18 @@ namespace XML /** * Gets an integer property from an xmlNodePtr. */ - int - getProperty(xmlNodePtr node, const char *name, int def); + int getProperty(xmlNodePtr node, const char *name, int def); /** * Gets an floating point property from an xmlNodePtr. */ - double - getFloatProperty(xmlNodePtr node, const char *name, double def); + double getFloatProperty(xmlNodePtr node, const char *name, double def); /** * Gets a string property from an xmlNodePtr. */ - std::string - getProperty(xmlNodePtr node, const char *name, const std::string &def); + std::string getProperty(xmlNodePtr node, const char *name, + const std::string &def); /** * Finds the first child node with the given name -- cgit v1.2.3-70-g09d2