summaryrefslogtreecommitdiff
path: root/src/game.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game.cpp')
-rw-r--r--src/game.cpp174
1 files changed, 81 insertions, 93 deletions
diff --git a/src/game.cpp b/src/game.cpp
index ffc6ebd9..87c59354 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -182,7 +182,7 @@ void do_init()
add_node(player_node);
- remove("./docs/packet.list");
+ remove("packet.list");
}
void do_exit()
@@ -402,13 +402,14 @@ void do_input()
keys = SDL_GetKeyState(NULL);
int xDirection = 0;
int yDirection = 0;
- int Direction = 0;
+ int Direction = DIR_NONE;
if (walk_status == 0 && player_node->action != DEAD && current_npc == 0)
{
int x = player_node->x;
int y = player_node->y;
+ // Translate pressed keys to movement
if (keys[SDLK_UP] || keys[SDLK_KP8])
{
yDirection = -1;
@@ -446,92 +447,68 @@ void do_input()
yDirection = -1;
}
- if ( xDirection == 1 && yDirection == 0 ) // Right
+ // Translate movement to direction
+ if (xDirection == 1 && yDirection == 0) // Right
{
Direction = EAST;
}
- if ( xDirection == -1 && yDirection == 0 ) // Left
+ if (xDirection == -1 && yDirection == 0) // Left
{
Direction = WEST;
}
- if ( xDirection == 0 && yDirection == -1 ) // Up
+ if (xDirection == 0 && yDirection == -1) // Up
{
Direction = NORTH;
}
- if ( xDirection == 0 && yDirection == 1 ) // Down
+ if (xDirection == 0 && yDirection == 1) // Down
{
Direction = SOUTH;
}
- if ( xDirection == 1 && yDirection == 1 ) // Bottom-Right
+ if (xDirection == 1 && yDirection == 1) // Bottom-Right
{
Direction = SE;
}
- if ( xDirection == -1 && yDirection == -1 ) // Top-left
+ if (xDirection == -1 && yDirection == -1) // Top-left
{
Direction = NW;
}
- if ( xDirection == 1 && yDirection == -1 ) // Top-Right
+ if (xDirection == 1 && yDirection == -1) // Top-Right
{
Direction = NE;
}
- if ( xDirection == -1 && yDirection == 1 ) // Bottom-Left
+ if (xDirection == -1 && yDirection == 1) // Bottom-Left
{
Direction = SW;
}
- if ( xDirection != 0 || yDirection != 0 )
+ // Update the player direction to where he wants to walk
+ // Warning: Not communicated to the server yet
+ if (Direction != DIR_NONE) {
+ player_node->direction = Direction;
+ }
+
+ // Prevent skipping corners over colliding tiles
+ if (xDirection != 0 && tiledMap->tileCollides(x + xDirection, y)) {
+ xDirection = 0;
+ }
+ if (yDirection != 0 && tiledMap->tileCollides(x, y + yDirection)) {
+ yDirection = 0;
+ }
+
+ // Choose a straight direction when diagonal target is blocked
+ if (yDirection != 0 && xDirection != 0 &&
+ !tiledMap->getWalk(x + xDirection, y + yDirection)) {
+ xDirection = 0;
+ }
+
+ // Walk to where the player can actually go
+ if ((xDirection != 0 || yDirection != 0) &&
+ tiledMap->getWalk(x + xDirection, y + yDirection))
{
- if (tiledMap->getWalk(x + xDirection, y + yDirection) != 0)
- {
- walk(x + xDirection, y + yDirection, Direction);
- walk_status = 1;
- player_node->action = WALK;
- player_node->walk_time = tick_time;
- player_node->x = x + xDirection;
- player_node->y = y + yDirection;
- player_node->direction = Direction;
- }
- else if (tiledMap->getWalk(x + xDirection, y) != 0)
- { // Going back to straight direction Left or right
- if ( xDirection == 1 ) //right
- {
- Direction = EAST;
- }
- else // left
- {
- Direction = WEST;
- }
- yDirection = 0;
- walk(x + xDirection, y + yDirection, Direction);
- walk_status = 1;
- player_node->action = WALK;
- player_node->walk_time = tick_time;
- player_node->x = x + xDirection;
- player_node->y = y + yDirection;
- player_node->direction = Direction;
- }
- else if (tiledMap->getWalk(x, y + yDirection) != 0)
- { // Going back to straight direction up or down
- if ( yDirection == 1 ) //Down
- {
- Direction = SOUTH;
- }
- else // Up
- {
- Direction = NORTH;
- }
- xDirection = 0;
- walk(x + xDirection, y + yDirection, Direction);
- walk_status = 1;
- player_node->action = WALK;
- player_node->walk_time = tick_time;
- player_node->x = x + xDirection;
- player_node->y = y + yDirection;
- player_node->direction = Direction;
- }
- else player_node->direction = Direction;
+ walk(x + xDirection, y + yDirection, Direction);
+ player_node->setDestination(x + xDirection, y + yDirection);
}
-
+
if (player_node->action == STAND)
{
if (keys[SDLK_LCTRL])
@@ -541,24 +518,27 @@ void do_input()
player_node->y,
player_node->direction);
player_node->walk_time = tick_time;
-
- if (player_node->weapon == 2)
+
+ if (player_node->weapon == 2) {
sound.playSfx("sfx/bow_shoot_1.ogg");
- else
+ }
+ else {
sound.playSfx("sfx/fist-swish.ogg");
+ }
}
}
-
- } // End if alive
+ }
}
-int get_packet_length(short id) {
+int get_packet_length(short id)
+{
int len = get_length(id);
if (len == -1) len = RFIFOW(2);
return len;
}
-void do_parse() {
+void do_parse()
+{
unsigned short id;
char *temp;
Being *being = NULL;
@@ -585,7 +565,7 @@ void do_parse() {
fclose(file);
*/
#ifdef __DEBUG
- FILE *file = fopen("./docs/packet.list", "a");
+ FILE *file = fopen("packet.list", "a");
fprintf(file, "%x\n", RFIFOW(0));
fclose(file);
#endif
@@ -597,32 +577,39 @@ void do_parse() {
player_node->y = get_y(RFIFOP(6));
break;
- // Received speech
- case 0x008d:
- temp = (char *)malloc(RFIFOW(2)-7);
- memset(temp, '\0', RFIFOW(2)-7);
- memcpy(temp, RFIFOP(8), RFIFOW(2)-8);
+ // Received speech from being
+ case SMSG_BEING_CHAT:
being = findNode(RFIFOL(4));
if (being != NULL) {
- // White
- being->setSpeech(temp, SPEECH_TIME);
+ int length = RFIFOW(2) - 8;
+ temp = (char*)malloc(length + 1);
+ temp[length] = '\0';
+ memcpy(temp, RFIFOP(8), length);
+ std::string msg = std::string(temp);
+ msg.erase(0, msg.find(" : ", 0) + 3);
+
+ being->setSpeech(msg, SPEECH_TIME);
chatWindow->chat_log(temp, BY_OTHER);
+
+ free(temp);
}
- free(temp);
break;
- case 0x008e:
- case 0x009a:
- if (RFIFOW(2) > 4) {
- // Receiving 1 byte less than expected, server might be
- // sending garbage instead of '\0' /-kth5
- temp = (char *)malloc(RFIFOW(2) - 3);
- memset(temp, '\0', RFIFOW(2) - 3);
- memcpy(temp, RFIFOP(4), RFIFOW(2) - 4);
- // White
- player_node->setSpeech(temp, SPEECH_TIME);
+ case SMSG_MY_BEING_CHAT:
+ case SMSG_GM_CHAT:
+ if (RFIFOW(2) > 4) {
+ int length = RFIFOW(2) - 4;
+ temp = (char*)malloc(length + 1);
+ temp[length] = '\0';
+ memcpy(temp, RFIFOP(4), length);
+ std::string msg = std::string(temp);
+ unsigned int pos = msg.find(" : ", 0);
if (id == 0x008e) {
+ if (pos != std::string::npos) {
+ msg.erase(0, pos + 3);
+ }
+ player_node->setSpeech(msg, SPEECH_TIME);
chatWindow->chat_log(temp, BY_PLAYER);
}
else {
@@ -632,6 +619,7 @@ void do_parse() {
free(temp);
}
break;
+
// Success to walk request
case 0x0087:
if (walk_status == 1) {
@@ -734,9 +722,9 @@ void do_parse() {
being->job = RFIFOW(14);
being->weapon = RFIFOW(18);
- being->setPath(tiledMap->findPath(
- being->x, being->y,
- being->destX, being->destY));
+ being->setDestination(
+ get_dest_x(RFIFOP(50)),
+ get_dest_y(RFIFOP(50)));
break;
case SMSG_MOVE_PLAYER_BEING:
@@ -759,9 +747,9 @@ void do_parse() {
being->setHairStyle(RFIFOW(16));
being->setHairColor(RFIFOW(32));
- being->setPath(tiledMap->findPath(
- being->x, being->y,
- being->destX, being->destY));
+ being->setDestination(
+ get_dest_x(RFIFOP(50)),
+ get_dest_y(RFIFOP(50)));
break;
// NPC dialog