summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--src/being.cpp145
-rw-r--r--src/being.h76
-rw-r--r--src/game.cpp468
-rw-r--r--src/inventory.cpp5
5 files changed, 352 insertions, 349 deletions
diff --git a/ChangeLog b/ChangeLog
index fa24facb..d7ec7c6b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2005-10-06 Björn Steinbrink <B.Steinbrink@gmx.de>
+
+ * src/being.cpp, src/being.h, src/game.cpp: Use integer types from SDL
+ and along the way fixed some long vs. int issues.
+ * src/inventory.cpp: Return NULL when no valid item index is given to
+ getItem() to bail out early.
+
2005-10-04 Yohann Ferreira <bertram@cegetel.net>
* src/game.cpp, src/gui/menuwindow.cpp, src/gui/inventorywindow.cpp,
diff --git a/src/being.cpp b/src/being.cpp
index 59284787..4301b0a9 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -49,12 +49,12 @@ Being *player_node = NULL;
std::list<Being*> beings;
-PATH_NODE::PATH_NODE(unsigned short x, unsigned short y):
+PATH_NODE::PATH_NODE(Uint16 x, Uint16 y):
x(x), y(y)
{
}
-Being* createBeing(unsigned int id, unsigned short job, Map *map)
+Being* createBeing(Uint32 id, Uint16 job, Map *map)
{
Being *being = new Being;
@@ -100,7 +100,7 @@ void remove_node(Being *being)
beings.remove(being);
}
-Being *findNode(unsigned int id)
+Being *findNode(Uint32 id)
{
std::list<Being*>::iterator i;
for (i = beings.begin(); i != beings.end(); i++) {
@@ -112,7 +112,7 @@ Being *findNode(unsigned int id)
return NULL;
}
-Being *findNode(unsigned short x, unsigned short y)
+Being *findNode(Uint16 x, Uint16 y)
{
std::list<Being*>::iterator i;
for (i = beings.begin(); i != beings.end(); i++) {
@@ -125,7 +125,7 @@ Being *findNode(unsigned short x, unsigned short y)
return NULL;
}
-Being* findNode(unsigned short x, unsigned short y, Being::Type type)
+Being* findNode(Uint16 x, Uint16 y, Being::Type type)
{
std::list<Being *>::iterator i;
for (i = beings.begin(); i != beings.end(); i++) {
@@ -176,7 +176,7 @@ Being::~Being()
clearPath();
}
-void Being::setDestination(int destX, int destY)
+void Being::setDestination(Uint16 destX, Uint16 destY)
{
if (!map)
return;
@@ -200,7 +200,7 @@ void Being::setPath(std::list<PATH_NODE> path)
}
}
-void Being::setHairColor(int color)
+void Being::setHairColor(Uint16 color)
{
hairColor = color;
if (hairColor < 1 || hairColor > NR_HAIR_COLORS + 1)
@@ -209,7 +209,7 @@ void Being::setHairColor(int color)
}
}
-void Being::setHairStyle(int style)
+void Being::setHairStyle(Uint16 style)
{
hairStyle = style;
if (hairStyle < 1 || hairStyle > NR_HAIR_STYLES)
@@ -218,24 +218,24 @@ void Being::setHairStyle(int style)
}
}
-unsigned short Being::getHairColor()
+Uint16 Being::getHairColor()
{
return hairColor;
}
-unsigned short Being::getHairStyle()
+Uint16 Being::getHairStyle()
{
return hairStyle;
}
-void Being::setSpeech(const std::string &text, int time)
+void Being::setSpeech(const std::string &text, Uint32 time)
{
speech = text;
speech_time = tick_time;
showSpeech = true;
}
-void Being::setDamage(short amount, int time)
+void Being::setDamage(Sint16 amount, Uint32 time)
{
if (!amount) {
damage = "miss";
@@ -255,77 +255,76 @@ void Being::setMap(Map *map)
void Being::nextStep()
{
- if (!path.empty())
- {
- PATH_NODE node = path.front();
- path.pop_front();
-
- int oldX = x;
- int oldY = y;
- int newX = node.x;
- int newY = node.y;
-
- if (newX > oldX) {
- if (newY > oldY) direction = SE;
- else if (newY < oldY) direction = NE;
- else direction = EAST;
- }
- else if (newX < oldX) {
- if (newY > oldY) direction = SW;
- else if (newY < oldY) direction = NW;
- else direction = WEST;
- }
- else {
- if (newY > oldY) direction = SOUTH;
- else if (newY < oldY) direction = NORTH;
- }
+ frame = 0;
- x = newX;
- y = newY;
- action = WALK;
- walk_time += speed / 10;
- } else {
+ if (path.empty())
+ {
action = STAND;
+ return;
}
- frame = 0;
-}
-void Being::logic()
-{
- if (getType() == PLAYER)
- {
- switch (action) {
- case WALK:
- frame = (get_elapsed_time(walk_time) * 4) / speed;
- if (frame >= 4) {
- nextStep();
- }
- break;
- case ATTACK:
- frame = (get_elapsed_time(walk_time) * 4) / aspd;
- if (frame >= 4) {
- nextStep();
- if (autoTarget && this == player_node) {
- attack(autoTarget);
- }
- }
- break;
- }
+ PATH_NODE node = path.front();
+ path.pop_front();
- if (emotion != 0) {
- emotion_time--;
- if (emotion_time == 0) {
- emotion = 0;
- }
- }
+ if (node.x > x) {
+ if (node.y > y) direction = SE;
+ else if (node.y < y) direction = NE;
+ else direction = EAST;
+ }
+ else if (node.x < x) {
+ if (node.y > y) direction = SW;
+ else if (node.y < y) direction = NW;
+ else direction = WEST;
+ }
+ else {
+ if (node.y > y) direction = SOUTH;
+ else if (node.y < y) direction = NORTH;
}
+ x = node.x;
+ y = node.y;
+ action = WALK;
+ walk_time += speed / 10;
+}
+
+void Being::logic()
+{
if (get_elapsed_time(speech_time) > 5000) {
showSpeech = false;
}
if (get_elapsed_time(damage_time) > 3000) {
showDamage = false;
}
+
+ if (getType() != PLAYER)
+ {
+ return;
+ }
+
+ switch (action) {
+ case WALK:
+ frame = (get_elapsed_time(walk_time) * 4) / speed;
+ if (frame >= 4) {
+ nextStep();
+ }
+ break;
+ case ATTACK:
+ frame = (get_elapsed_time(walk_time) * 4) / aspd;
+ if (frame >= 4) {
+ nextStep();
+ if (autoTarget && this == player_node) {
+ attack(autoTarget);
+ }
+ }
+ break;
+ }
+
+ if (emotion != 0) {
+ emotion_time--;
+ if (emotion_time == 0) {
+ emotion = 0;
+ }
+ }
}
void Being::drawSpeech(Graphics *graphics)
@@ -389,12 +388,12 @@ Being::Type Being::getType()
}
}
-void Being::setWeapon(unsigned short weapon)
+void Being::setWeapon(Uint16 weapon)
{
m_weapon = weapon;
}
-void Being::setWeaponById(unsigned short weapon)
+void Being::setWeaponById(Uint16 weapon)
{
switch (weapon)
{
@@ -424,7 +423,7 @@ void Being::setWeaponById(unsigned short weapon)
}
}
-void Being::setId(unsigned int id)
+void Being::setId(Uint32 id)
{
m_id = id;
}
diff --git a/src/being.h b/src/being.h
index 9c853c32..07b12232 100644
--- a/src/being.h
+++ b/src/being.h
@@ -26,6 +26,7 @@
#include <list>
#include <string>
+#include <SDL_types.h>
#define NR_HAIR_STYLES 5
#define NR_HAIR_COLORS 10
@@ -75,19 +76,19 @@ class Being
SE = 7,
};
- unsigned short job; /**< Job (player job, npc, monster, ) */
- unsigned short x, y; /**< Tile coordinates */
- unsigned char direction; /**< Facing direction */
- unsigned char action;
- unsigned char frame;
- int speech_color;
- unsigned short walk_time;
- unsigned short speed;
- unsigned char emotion; /**< Currently showing emotion */
- unsigned char emotion_time; /**< Time until emotion disappears */
- unsigned int text_x, text_y; // temp solution to fix speech position
+ Uint16 job; /**< Job (player job, npc, monster, ) */
+ Uint16 x, y; /**< Tile coordinates */
+ Uint8 direction; /**< Facing direction */
+ Uint8 action;
+ Uint8 frame;
+ Sint32 speech_color;
+ Uint16 walk_time;
+ Uint16 speed;
+ Uint8 emotion; /**< Currently showing emotion */
+ Uint8 emotion_time; /**< Time until emotion disappears */
+ Uint32 text_x, text_y; // temp solution to fix speech position
- unsigned short aspd; /**< Attack speed */
+ Uint16 aspd; /**< Attack speed */
/**
* Constructor.
@@ -107,7 +108,7 @@ class Being
/**
* Sets a new destination for this being to walk to.
*/
- void setDestination(int destX, int destY);
+ void setDestination(Uint16 destX, Uint16 destY);
/**
* Puts a "speech balloon" above this being for the specified amount
@@ -116,7 +117,7 @@ class Being
* @param text The text that should appear.
* @param time The amount of time the text should stay in milliseconds.
*/
- void setSpeech(const std::string &text, int time);
+ void setSpeech(const std::string &text, Uint32 time);
/**
* Puts a damage bubble above this being for the specified amount
@@ -125,7 +126,7 @@ class Being
* @param text The text that should appear.
* @param time The amount of time the text should stay in milliseconds.
*/
- void setDamage(short amount, int time);
+ void setDamage(Sint16 amount, Uint32 time);
/**
* Returns the name of the being.
@@ -144,22 +145,22 @@ class Being
/**
* Sets the hair color for this being.
*/
- void setHairColor(int color);
+ void setHairColor(Uint16 color);
/**
* Sets the hair style for this being.
*/
- void setHairStyle(int style);
+ void setHairStyle(Uint16 style);
/**
* Gets the hair color for this being.
*/
- unsigned short getHairColor();
+ Uint16 getHairColor();
/**
* Gets the hair style for this being.
*/
- unsigned short getHairStyle();
+ Uint16 getHairStyle();
/**
* Makes this being take the next step of his path.
@@ -186,12 +187,12 @@ class Being
/**
* get the weapon picture id.
*/
- unsigned short getWeapon() {return m_weapon;}
+ Uint16 getWeapon() { return m_weapon; }
/**
* get the sprite id.
*/
- unsigned int getId() {return m_id;}
+ Uint32 getId() { return m_id; }
// MODIFICATION METHODS
@@ -200,19 +201,19 @@ class Being
*
* @param weapon : the picture id
*/
- void setWeapon(unsigned short weapon);
+ void setWeapon(Uint16 weapon);
/**
* set the weapon picture id with the weapon id.
*
* @param weapon : the weapon id
*/
- void setWeaponById(unsigned short weapon);
+ void setWeaponById(Uint16 weapon);
/**
* set the sprite id.
*/
- void setId(unsigned int id);
+ void setId(Uint32 id);
/**
* Set the map the being is on
@@ -220,16 +221,16 @@ class Being
void setMap(Map *map);
private:
- unsigned short m_weapon;
- unsigned int m_id; /**< Unique id */
+ Uint16 m_weapon;
+ Uint32 m_id; /**< Unique id */
Map *map;
std::list<PATH_NODE> path;
std::string speech;
std::string damage;
- unsigned short hairStyle, hairColor;
- unsigned int speech_time;
- unsigned int damage_time;
+ Uint16 hairStyle, hairColor;
+ Uint32 speech_time;
+ Uint32 damage_time;
bool showSpeech, showDamage;
std::string mName; /**< Name of character */
@@ -240,29 +241,20 @@ class Being
};
/** Return a specific id Being */
-Being *findNode(unsigned int id);
+Being *findNode(Uint32 id);
/** Return a being at specific coordinates */
-Being *findNode(unsigned short x, unsigned short y);
+Being *findNode(Uint16 x, Uint16 y);
/** Return a being at specific coordinates with specific type*/
-Being *findNode(unsigned short x, unsigned short y, Being::Type type);
+Being *findNode(Uint16 x, Uint16 y, Being::Type type);
/** Create a being and add it to the list of beings */
-Being *createBeing(unsigned int id, unsigned short job, Map *map);
+Being *createBeing(Uint32 id, Uint16 job, Map *map);
/** Remove a Being */
void remove_node(Being *being);
-/** Find a NPC id based on its coordinates */
-unsigned int findNpc(unsigned short x, unsigned short y);
-
-/** Find a PLAYER id based on its coordinates */
-unsigned int findPlayer(unsigned short x, unsigned short y);
-
-/** Find a MONSTER id based on its coordinates */
-unsigned int findMonster(unsigned short x, unsigned short y);
-
/** Sort beings in vertical order */
void sort();
diff --git a/src/game.cpp b/src/game.cpp
index c1b9ceef..5c220155 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -27,6 +27,7 @@
#include <physfs.h>
#include <sstream>
#include <string>
+#include <SDL_types.h>
#include <guichan/sdl/sdlinput.hpp>
@@ -86,7 +87,7 @@ volatile bool action_time = false;
int server_tick;
int fps = 0, frame = 0, current_npc = 0;
bool displayPathToMouse = false;
-unsigned short startX = 0, startY = 0;
+Uint16 startX = 0, startY = 0;
Being *autoTarget = NULL;
Map *tiledMap = NULL;
Engine *engine = NULL;
@@ -406,7 +407,7 @@ void do_exit()
delete tiledMap;
destroyGuiWindows();
close_session();
-
+
delete inventory;
delete player_node;
@@ -537,39 +538,43 @@ void do_input()
// Picking up items on the floor
case SDLK_g:
case SDLK_z:
- if (!chatWindow->isFocused())
+ if (chatWindow->isFocused())
{
- unsigned short x = player_node->x;
- unsigned short y = player_node->y;
- int id = find_floor_item_by_cor(x, y);
-
- // If none below the player, try the tile in front of
- // the player
- if (!id) {
- switch (player_node->direction)
- {
- case Being::NORTH: y--; break;
- case Being::SOUTH: y++; break;
- case Being::WEST: x--; break;
- case Being::EAST: x++; break;
- case Being::NW: x--; y--; break;
- case Being::NE: x++; y--; break;
- case Being::SW: x--; y++; break;
- case Being::SE: x++; y++; break;
- default: break;
- }
- id = find_floor_item_by_cor(x, y);
- }
+ break;
+ }
+
+ Uint32 id = find_floor_item_by_cor(
+ player_node->x, player_node->y);
- if (id)
+ // If none below the player, try the tile in front of
+ // the player
+ if (!id) {
+ Uint16 x = player_node->x;
+ Uint16 y = player_node->y;
+
+ switch (player_node->direction)
{
- // TODO: remove duplicated code, probably add a pick up command
- MessageOut outMsg;
- outMsg.writeShort(0x009f);
- outMsg.writeLong(id);
+ case Being::NORTH: y--; break;
+ case Being::SOUTH: y++; break;
+ case Being::WEST: x--; break;
+ case Being::EAST: x++; break;
+ case Being::NW: x--; y--; break;
+ case Being::NE: x++; y--; break;
+ case Being::SW: x--; y++; break;
+ case Being::SE: x++; y++; break;
+ default: break;
}
- used = true;
+ id = find_floor_item_by_cor(x, y);
}
+
+ if (id)
+ {
+ // TODO: remove duplicated code, probably add a pick up command
+ MessageOut outMsg;
+ outMsg.writeShort(0x009f);
+ outMsg.writeLong(id);
+ }
+ used = true;
break;
// Quitting confirmation dialog
@@ -590,32 +595,52 @@ void do_input()
// Emotions and some internal gui windows
if (event.key.keysym.mod & KMOD_ALT)
{
+ gcn::Window *requestedWindow = 0;
+
switch (event.key.keysym.sym)
{
// Inventory window
case SDLK_i:
- inventoryWindow->setVisible(
- !inventoryWindow->isVisible());
- if (inventoryWindow->isVisible()) inventoryWindow->requestMoveToTop();
- used = true;
+ requestedWindow = inventoryWindow;
break;
// Statistics window
case SDLK_s:
- statusWindow->setVisible(!statusWindow->isVisible());
- if (statusWindow->isVisible()) statusWindow->requestMoveToTop();
- used = true;
+ requestedWindow = statusWindow;
+ break;
+
+ // Skill window
+ case SDLK_k:
+ requestedWindow = skillDialog;
+ break;
+
+ // Equipment window
+ case SDLK_e:
+ requestedWindow = equipmentWindow;
+ break;
+
+ /*
+ // Buddy window
+ case SDLK_b:
+ requestedWindow = buddyWindow;
break;
+ */
/*
// New skills window
case SDLK_n:
- newSkillWindow->setVisible(!newSkillWindow->isVisible());
- if (newSkillWindow->isVisible()) newSkillWindow->requestMoveToTop();
- used = true;
+ requestedWindow = newSkillWindow;
break;
*/
- // screenshot (picture, hence the p)
+
+ // Setup window
+ case SDLK_c:
+ setupWindow->setVisible(true);
+ setupWindow->requestMoveToTop();
+ used = true;
+ break;
+
+ // screenshot (picture, hence the p)
case SDLK_p:
{
SDL_Surface *screenshot = graphics->getScreenshot();
@@ -627,45 +652,24 @@ void do_input()
}
break;
- // Skill window
- case SDLK_k:
- skillDialog->setVisible(!skillDialog->isVisible());
- if (skillDialog->isVisible()) skillDialog->requestMoveToTop();
- used = true;
- break;
-
- // Setup window
- case SDLK_c:
- setupWindow->setVisible(true);
- setupWindow->requestMoveToTop();
- used = true;
- break;
-
- // Equipment window
- case SDLK_e:
- equipmentWindow->setVisible(
- !equipmentWindow->isVisible());
- if (equipmentWindow->isVisible()) equipmentWindow->requestMoveToTop();
- used = true;
- break;
-
- /*
- // Buddy window
- case SDLK_b:
- buddyWindow->setVisible(!buddyWindow->isVisible());
- if (buddyWindow->isVisible()) buddyWindow->requestMoveToTop();
- used = true;
- break;
- */
-
default:
break;
}
+ if (requestedWindow)
+ {
+ requestedWindow->setVisible(requestedWindow->isVisible());
+ if (requestedWindow->isVisible())
+ {
+ requestedWindow->requestMoveToTop();
+ }
+ used = true;
+ }
+
// Emotions
if (action_time && !player_node->emotion)
{
- unsigned char emotion = 0;
+ Uint8 emotion = 0;
switch (event.key.keysym.sym)
{
case SDLK_1: emotion = 1; break;
@@ -712,7 +716,7 @@ void do_input()
// Check for default actions for NPC/Monster/Players
Being *target = findNode(mx, my);
- unsigned int floorItemId = find_floor_item_by_cor(mx, my);
+ Uint32 floorItemId = find_floor_item_by_cor(mx, my);
if (target)
{
@@ -840,10 +844,10 @@ void do_input()
if ((player_node->action != Being::DEAD) && (current_npc == 0) &&
!chatWindow->isFocused())
{
- int x = player_node->x;
- int y = player_node->y;
- int xDirection = 0;
- int yDirection = 0;
+ Uint16 x = player_node->x;
+ Uint16 y = player_node->y;
+ Sint16 xDirection = 0;
+ Sint16 yDirection = 0;
Being::Direction Direction = Being::DIR_NONE;
// Translate pressed keys to movement and direction
@@ -957,9 +961,9 @@ void do_input()
if (joy[JOY_BTN1])
{
- unsigned short x = player_node->x;
- unsigned short y = player_node->y;
- int id = find_floor_item_by_cor(x, y);
+ Uint16 x = player_node->x;
+ Uint16 y = player_node->y;
+ Uint32 id = find_floor_item_by_cor(x, y);
if (id != 0)
{
@@ -981,10 +985,12 @@ void do_input()
void do_parse()
{
- int n_items;
Map *tiledMap = engine->getCurrentMap();
Equipment *equipment = Equipment::getInstance();
+ int n_items;
+ Being *being;
+
// We need at least 2 bytes to identify a packet
while (in_size >= 2)
{
@@ -995,57 +1001,58 @@ void do_parse()
{
case SMSG_LOGIN_SUCCESS:
// Connected to game server succesfully, set spawn point
- {
- msg.readLong(); // server tick
- msg.readCoordinates(player_node->x,
- player_node->y,
- player_node->direction);
- msg.skip(2); // unknown
- }
+ msg.readLong(); // server tick
+ msg.readCoordinates(player_node->x, player_node->y,
+ player_node->direction);
+ msg.skip(2); // unknown
break;
// Received speech from being
case SMSG_BEING_CHAT:
{
- int chatMsgLength = msg.readShort() - 8;
- Being *being = findNode(msg.readLong());
+ Sint16 chatMsgLength = msg.readShort() - 8;
+ being = findNode(msg.readLong());
- if (being != NULL && chatMsgLength > 0)
+ if (!being || chatMsgLength <= 0)
{
- std::string chatMsg = msg.readString(chatMsgLength);
+ break;
+ }
- chatWindow->chat_log(chatMsg, BY_OTHER);
+ std::string chatMsg = msg.readString(chatMsgLength);
- chatMsg.erase(0, chatMsg.find(" : ", 0) + 3);
- being->setSpeech(chatMsg, SPEECH_TIME);
- }
+ chatWindow->chat_log(chatMsg, BY_OTHER);
+
+ chatMsg.erase(0, chatMsg.find(" : ", 0) + 3);
+ being->setSpeech(chatMsg, SPEECH_TIME);
}
break;
case SMSG_PLAYER_CHAT:
case SMSG_GM_CHAT:
{
- int chatMsgLength = msg.readShort() - 4;
+ Sint16 chatMsgLength = msg.readShort() - 4;
- if (chatMsgLength > 0)
+ if (chatMsgLength <= 0)
{
- std::string chatMsg = msg.readString(chatMsgLength);
+ break;
+ }
- if (msg.getId() == SMSG_PLAYER_CHAT)
- {
- chatWindow->chat_log(chatMsg, BY_PLAYER);
+ std::string chatMsg = msg.readString(chatMsgLength);
- std::string::size_type pos = chatMsg.find(" : ", 0);
- if (pos != std::string::npos)
- {
- chatMsg.erase(0, pos + 3);
- }
- player_node->setSpeech(chatMsg, SPEECH_TIME);
- }
- else
+ if (msg.getId() == SMSG_PLAYER_CHAT)
+ {
+ chatWindow->chat_log(chatMsg, BY_PLAYER);
+
+ std::string::size_type pos = chatMsg.find(" : ", 0);
+ if (pos != std::string::npos)
{
- chatWindow->chat_log(chatMsg, BY_GM);
+ chatMsg.erase(0, pos + 3);
}
+ player_node->setSpeech(chatMsg, SPEECH_TIME);
+ }
+ else
+ {
+ chatWindow->chat_log(chatMsg, BY_GM);
}
}
break;
@@ -1061,14 +1068,14 @@ void do_parse()
case SMSG_BEING_MOVE:
// Information about a being in range
{
- int id = msg.readLong();
- unsigned short speed = msg.readShort();
+ Uint32 id = msg.readLong();
+ Uint16 speed = msg.readShort();
msg.readShort(); // unknown
msg.readShort(); // unknown
msg.readShort(); // option
- unsigned short job = msg.readShort(); // class
+ Uint16 job = msg.readShort(); // class
- Being *being = findNode(id);
+ being = findNode(id);
if (being == NULL)
{
@@ -1119,7 +1126,7 @@ void do_parse()
if (msg.getId() == SMSG_BEING_MOVE)
{
- unsigned short srcX, srcY, dstX, dstY;
+ Uint16 srcX, srcY, dstX, dstY;
msg.readCoordinatePair(srcX, srcY, dstX, dstY);
being->action = Being::STAND;
being->x = srcX;
@@ -1140,37 +1147,35 @@ void do_parse()
case SMSG_BEING_REMOVE:
// A being should be removed or has died
- {
- Being *being = findNode(msg.readLong());
+ being = findNode(msg.readLong());
- if (being != NULL)
+ if (being != NULL)
+ {
+ if (msg.readByte() == 1)
{
- if (msg.readByte() == 1)
- {
- // Death
- switch (being->getType())
- {
- case Being::MONSTER:
- being->action = Being::MONSTER_DEAD;
- being->frame = 0;
- being->walk_time = tick_time;
- break;
-
- default:
- being->action = Being::DEAD;
- break;
- }
- }
- else
+ // Death
+ switch (being->getType())
{
- remove_node(being);
- }
+ case Being::MONSTER:
+ being->action = Being::MONSTER_DEAD;
+ being->frame = 0;
+ being->walk_time = tick_time;
+ break;
- if (being == autoTarget)
- {
- autoTarget = NULL;
+ default:
+ being->action = Being::DEAD;
+ break;
}
}
+ else
+ {
+ remove_node(being);
+ }
+
+ if (being == autoTarget)
+ {
+ autoTarget = NULL;
+ }
}
break;
@@ -1179,14 +1184,14 @@ void do_parse()
case SMSG_PLAYER_MOVE:
// An update about a player, potentially including movement.
{
- int id = msg.readLong();
- unsigned short speed = msg.readShort();
+ Uint32 id = msg.readLong();
+ Uint16 speed = msg.readShort();
msg.readShort(); // option 1
msg.readShort(); // option 2
msg.readShort(); // option
- unsigned short job = msg.readShort();
+ Uint16 job = msg.readShort();
- Being *being = findNode(id);
+ being = findNode(id);
if (being == NULL)
{
@@ -1218,7 +1223,7 @@ void do_parse()
if (msg.getId() == SMSG_PLAYER_MOVE)
{
- unsigned short srcX, srcY, dstX, dstY;
+ Uint16 srcX, srcY, dstX, dstY;
msg.readCoordinatePair(srcX, srcY, dstX, dstY);
being->x = srcX;
being->y = srcY;
@@ -1274,7 +1279,7 @@ void do_parse()
// situation, and that the requesting player would get a
// special message about the player being occupied.
- if (tradeWindow->isVisible() == true || requestTradeDialogOpen)
+ if (tradeWindow->isVisible() || requestTradeDialogOpen)
{
MessageOut outMsg;
outMsg.writeShort(CMSG_TRADE_RESPONSE);
@@ -1324,8 +1329,8 @@ void do_parse()
case SMSG_TRADE_ITEM_ADD:
{
- long amount = msg.readLong();
- short type = msg.readShort();
+ Sint32 amount = msg.readLong();
+ Sint16 type = msg.readShort();
msg.readByte(); // identified flag
msg.readByte(); // attribute
msg.readByte(); // refine
@@ -1344,7 +1349,7 @@ void do_parse()
// Trade: New Item add response (was 0x00ea, now 01b1)
{
Item *item = inventory->getItem(msg.readShort());
- short quantity = msg.readShort();
+ Sint16 quantity = msg.readShort();
switch (msg.readByte())
{
@@ -1395,15 +1400,15 @@ void do_parse()
// to not load them twice on map change.
inventory->resetItems();
msg.readShort(); // length
- int number = (msg.getLength() - 4) / 18;
+ Sint32 number = (msg.getLength() - 4) / 18;
for (int loop = 0; loop < number; loop++)
{
- short index = msg.readShort();
- short itemId = msg.readShort();
+ Sint16 index = msg.readShort();
+ Sint16 itemId = msg.readShort();
msg.readByte(); // type
msg.readByte(); // identify flag
- short amount = msg.readShort();
+ Sint16 amount = msg.readShort();
msg.skip(2); // unknown
msg.skip(8); // card (4 shorts)
@@ -1421,16 +1426,16 @@ void do_parse()
case SMSG_PLAYER_EQUIPMENT:
{
msg.readShort(); // length
- int number = (msg.getLength() - 4) / 20;
+ Sint32 number = (msg.getLength() - 4) / 20;
for (int loop = 0; loop < number; loop++)
{
- short index = msg.readShort();
- short itemId = msg.readShort();
+ Sint16 index = msg.readShort();
+ Sint16 itemId = msg.readShort();
msg.readByte(); // type
msg.readByte(); // identify flag
msg.readShort(); // equip type
- short equipPoint = msg.readShort();
+ Sint16 equipPoint = msg.readShort();
msg.readByte(); // attribute
msg.readByte(); // refine
msg.skip(8); // card
@@ -1456,8 +1461,8 @@ void do_parse()
case SMSG_ITEM_USE_RESPONSE:
{
- short index = msg.readShort();
- short amount = msg.readShort();
+ Sint16 index = msg.readShort();
+ Sint16 amount = msg.readShort();
if (msg.readByte() == 0) {
chatWindow->chat_log("Failed to use item", BY_SERVER);
@@ -1473,8 +1478,8 @@ void do_parse()
map_path = "maps/" + msg.readString(16);
map_path= map_path.substr(0, map_path.rfind(".")) + ".tmx.gz";
- int x = msg.readShort();
- int y = msg.readShort();
+ Uint16 x = msg.readShort();
+ Uint16 y = msg.readShort();
logger->log("Warping to %s (%d, %d)", map_path.c_str(), x, y);
@@ -1531,8 +1536,8 @@ void do_parse()
case SMSG_PLAYER_STAT_UPDATE_1:
{
- short type = msg.readShort();
- long value = msg.readLong();
+ Sint16 type = msg.readShort();
+ Sint32 value = msg.readLong();
switch (type)
{
@@ -1605,9 +1610,9 @@ void do_parse()
msg.readLong(); // server tick
msg.readLong(); // src speed
msg.readLong(); // dst speed
- short param1 = msg.readShort();
+ Sint16 param1 = msg.readShort();
msg.readShort(); // param 2
- char type = msg.readByte();
+ Sint8 type = msg.readByte();
msg.readShort(); // param 3
switch (type)
@@ -1663,7 +1668,7 @@ void do_parse()
break;
case SMSG_BEING_LEVELUP:
- if ((unsigned long)msg.readLong() == player_node->getId()) {
+ if ((Uint32)msg.readLong() == player_node->getId()) {
logger->log("Level up");
sound.playSfx("sfx/levelup.ogg");
} else {
@@ -1673,21 +1678,21 @@ void do_parse()
break;
case SMSG_BEING_EMOTION:
+ if (!(being = findNode(msg.readLong())))
{
- Being *being = findNode(msg.readLong());
- if (being == NULL) break;
-
- being->emotion = msg.readByte();
- being->emotion_time = EMOTION_TIME;
+ break;
}
+
+ being->emotion = msg.readByte();
+ being->emotion_time = EMOTION_TIME;
break;
case SMSG_PLAYER_STAT_UPDATE_3:
{
- long type = msg.readLong();
- long base = msg.readLong();
- long bonus = msg.readLong();
- long total = base + bonus;
+ Sint32 type = msg.readLong();
+ Sint32 base = msg.readLong();
+ Sint32 bonus = msg.readLong();
+ Sint32 total = base + bonus;
switch (type) {
case 0x000d: player_info->STR = total; break;
@@ -1718,10 +1723,10 @@ void do_parse()
for (int k = 0; k < n_items; k++)
{
- long value = msg.readLong();
+ Sint32 value = msg.readLong();
msg.readLong(); // DCvalue
msg.readByte(); // type
- short itemId = msg.readShort();
+ Sint16 itemId = msg.readShort();
buyDialog->addItem(itemId, value);
}
break;
@@ -1735,8 +1740,8 @@ void do_parse()
for (int k = 0; k < n_items; k++)
{
- short index = msg.readShort();
- long value = msg.readLong();
+ Sint16 index = msg.readShort();
+ Sint32 value = msg.readLong();
msg.readLong(); // OCvalue
Item *item = inventory->getItem(index);
@@ -1769,16 +1774,16 @@ void do_parse()
case SMSG_PLAYER_INVENTORY_ADD:
{
- short index = msg.readShort();
- short amount = msg.readShort();
- short itemId = msg.readShort();
+ Sint16 index = msg.readShort();
+ Sint16 amount = msg.readShort();
+ Sint16 itemId = msg.readShort();
msg.readByte(); // identify flag
msg.readByte(); // attribute
msg.readByte(); // refine
msg.skip(8); // card
- short equipType = msg.readShort();
+ Sint16 equipType = msg.readShort();
msg.readByte(); // type
- char fail = msg.readByte();
+ Sint8 fail = msg.readByte();
if (fail > 0) {
chatWindow->chat_log("Unable to pick up item",
@@ -1792,18 +1797,18 @@ void do_parse()
case SMSG_PLAYER_INVENTORY_REMOVE:
{
- short index = msg.readShort();
- short amount = msg.readShort();
+ Sint16 index = msg.readShort();
+ Sint16 amount = msg.readShort();
inventory->getItem(index)->increaseQuantity(-amount);
}
break;
case SMSG_PLAYER_INVENTORY_USE:
{
- short index = msg.readShort();
+ Sint16 index = msg.readShort();
msg.readShort(); // item id
msg.readLong(); // id
- short amountLeft = msg.readShort();
+ Sint16 amountLeft = msg.readShort();
msg.readByte(); // type
inventory->getItem(index)->setQuantity(amountLeft);
@@ -1817,14 +1822,14 @@ void do_parse()
for (int k = 0; k < n_items; k++)
{
- short skillId = msg.readShort();
+ Sint16 skillId = msg.readShort();
msg.readShort(); // target type
msg.readShort(); // unknown
- short level = msg.readShort();
- short sp = msg.readShort();
+ Sint16 level = msg.readShort();
+ Sint16 sp = msg.readShort();
msg.readShort(); // range
std::string skillName = msg.readString(24);
- char up = msg.readByte();
+ Sint8 up = msg.readByte();
if (level != 0 || up != 0)
{
@@ -1847,11 +1852,11 @@ void do_parse()
case SMSG_ITEM_VISIBLE:
case SMSG_ITEM_DROPPED:
{
- long id = msg.readLong();
- short itemId = msg.readShort();
+ Uint32 id = msg.readLong();
+ Sint16 itemId = msg.readShort();
msg.readByte(); // identify flag
- short x = msg.readShort();
- short y = msg.readShort();
+ Uint16 x = msg.readShort();
+ Uint16 y = msg.readShort();
msg.skip(4); // amount,subX,subY / subX,subY,amount
add_floor_item(new FloorItem(id, itemId, x, y));
@@ -1870,34 +1875,32 @@ void do_parse()
break;
case SMSG_BEING_CHANGE_LOOKS:
+ if (!(being = findNode(msg.readLong())))
{
- Being *being = findNode(msg.readLong());
+ break;
+ }
- if (being)
- {
- switch (msg.readByte()) {
- case 1:
- being->setHairStyle(msg.readByte());
- break;
- case 2:
- being->setWeapon(msg.readByte());
- break;
- case 6:
- being->setHairColor(msg.readByte());
- break;
- default:
- msg.readByte(); // unsupported
- break;
- }
- }
+ switch (msg.readByte()) {
+ case 1:
+ being->setHairStyle(msg.readByte());
+ break;
+ case 2:
+ being->setWeapon(msg.readByte());
+ break;
+ case 6:
+ being->setHairColor(msg.readByte());
+ break;
+ default:
+ msg.readByte(); // unsupported
+ break;
}
break;
case SMSG_PLAYER_EQUIP:
{
- short index = msg.readShort();
- short equipPoint = msg.readShort();
- char type = msg.readByte();
+ Sint16 index = msg.readShort();
+ Sint16 equipPoint = msg.readShort();
+ Sint8 type = msg.readByte();
logger->log("Equipping: %i %i %i",
index, equipPoint, type);
@@ -1931,9 +1934,9 @@ void do_parse()
case 0x01d7:
// Equipment related
{
- Being *being = findNode(msg.readLong());
+ being = findNode(msg.readLong());
msg.readByte(); // equip point
- short itemId1 = msg.readShort();
+ Sint16 itemId1 = msg.readShort();
msg.readShort(); // item id 2
if (being != NULL)
@@ -1945,9 +1948,9 @@ void do_parse()
case SMSG_PLAYER_UNEQUIP:
{
- short index = msg.readShort();
- short equipPoint = msg.readShort();
- char type = msg.readByte();
+ Sint16 index = msg.readShort();
+ Sint16 equipPoint = msg.readShort();
+ Sint8 type = msg.readByte();
if (type == 0) {
chatWindow->chat_log("Unable to unequip.", BY_SERVER);
@@ -1999,7 +2002,7 @@ void do_parse()
case SMSG_PLAYER_ARROW_EQUIP:
{
- short id = msg.readShort();
+ Sint16 id = msg.readShort();
if (id > 1) {
Item *item = inventory->getItem(id);
@@ -2014,7 +2017,7 @@ void do_parse()
case SMSG_PLAYER_ARROW_MESSAGE:
{
- short type = msg.readShort();
+ Sint16 type = msg.readShort();
switch (type) {
case 0:
@@ -2030,9 +2033,9 @@ void do_parse()
case SMSG_PLAYER_STAT_UPDATE_4:
{
- short type = msg.readShort();
- char fail = msg.readByte();
- char value = msg.readByte();
+ Sint16 type = msg.readShort();
+ Sint8 fail = msg.readByte();
+ Sint8 value = msg.readByte();
if (fail == 1)
{
@@ -2090,12 +2093,9 @@ void do_parse()
break;
case SMSG_BEING_NAME_RESPONSE:
+ if ((being = findNode(msg.readLong())))
{
- Being *being = findNode(msg.readLong());
-
- if (being) {
- being->setName(msg.readString(24));
- }
+ being->setName(msg.readString(24));
}
break;
diff --git a/src/inventory.cpp b/src/inventory.cpp
index 39860261..63fbab7a 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -44,6 +44,11 @@ Inventory::~Inventory()
Item* Inventory::getItem(int index)
{
+ if (index < 0 || index > INVENTORY_SIZE)
+ {
+ return 0;
+ }
+
return &items[index];
}