diff --git a/.gitignore b/.gitignore index f4ee2a1..84b56aa 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ build/*.o build/*.d apidoc/python/build *.vim +*.tox +*.nvim* diff --git a/apidoc/python/source/conf.py b/apidoc/python/source/conf.py index 7439b8d..2dd0207 100644 --- a/apidoc/python/source/conf.py +++ b/apidoc/python/source/conf.py @@ -151,7 +151,4 @@ texinfo_documents = [ (master_doc, 'toxic_api', 'toxic_api Documentation', author, 'toxic_api', 'One line description of project.', 'Miscellaneous'), -] - - - +] \ No newline at end of file diff --git a/src/chat.c b/src/chat.c index a14bb27..e57df90 100644 --- a/src/chat.c +++ b/src/chat.c @@ -771,7 +771,7 @@ void chat_onGameInvite(ToxWindow *self, Tox *m, uint32_t friend_number, const ui return; } - if (length < GAME_PACKET_HEADER_SIZE) { + if (length < GAME_PACKET_HEADER_SIZE || length > GAME_MAX_DATA_SIZE) { return; } diff --git a/src/game_base.c b/src/game_base.c index c84e87d..0c764ec 100644 --- a/src/game_base.c +++ b/src/game_base.c @@ -162,13 +162,17 @@ void game_kill(ToxWindow *self) { GameData *game = self->game; - if (game->cb_game_kill) { - game->cb_game_kill(game, game->cb_game_kill_data); + if (game) { + if (game->cb_game_kill) { + game->cb_game_kill(game, game->cb_game_kill_data); + } + + delwin(game->window); + free(game->messages); + free(game); } - delwin(game->window); - free(game->messages); - free(game); + kill_notifs(self->active_box); del_window(self); } @@ -746,7 +750,7 @@ bool game_onKey(ToxWindow *self, Tox *m, wint_t key, bool is_printable) return true; } - if (!game->is_multiplayer && key == KEY_F(2)) { + if (key == KEY_F(2) && !game->is_multiplayer) { game_toggle_pause(self->game); return true; } @@ -814,6 +818,8 @@ void game_onPacket(ToxWindow *self, Tox *m, uint32_t friendnumber, const uint8_t } if (data[0] != GAME_NETWORKING_VERSION) { + fprintf(stderr, "Game packet rejected: wrong networking version (got %d, expected %d)\n", data[0], + GAME_NETWORKING_VERSION); return; } @@ -1081,7 +1087,7 @@ void game_set_cb_on_packet(GameData *game, cb_game_on_packet *func, void *cb_dat /* * Wraps `packet` in a header comprised of the custom packet type, game type and game id. */ -static int game_wrap_packet(const GameData *game, uint8_t *packet, size_t size, GamePacketType packet_type) +static int game_packet_wrap(const GameData *game, uint8_t *packet, size_t size, GamePacketType packet_type) { if (size < GAME_PACKET_HEADER_SIZE + 1) { return -1; @@ -1100,7 +1106,7 @@ static int game_wrap_packet(const GameData *game, uint8_t *packet, size_t size, return 0; } -int game_send_packet(const GameData *game, const uint8_t *data, size_t length, GamePacketType packet_type) +int game_packet_send(const GameData *game, const uint8_t *data, size_t length, GamePacketType packet_type) { if (length > GAME_MAX_DATA_SIZE) { return -1; @@ -1108,7 +1114,7 @@ int game_send_packet(const GameData *game, const uint8_t *data, size_t length, G uint8_t packet[GAME_MAX_PACKET_SIZE]; - if (game_wrap_packet(game, packet, sizeof(packet), packet_type) == -1) { + if (game_packet_wrap(game, packet, sizeof(packet), packet_type) == -1) { return -1; } @@ -1124,5 +1130,5 @@ int game_send_packet(const GameData *game, const uint8_t *data, size_t length, G return -1; } - return -0; + return 0; } diff --git a/src/game_base.h b/src/game_base.h index 43909d1..672a01c 100644 --- a/src/game_base.h +++ b/src/game_base.h @@ -394,7 +394,7 @@ void game_kill(ToxWindow *self); * * `packet_type` should be GP_Invite for an invite packet or GP_Data for all other game data. */ -int game_send_packet(const GameData *game, const uint8_t *data, size_t length, GamePacketType packet_type); +int game_packet_send(const GameData *game, const uint8_t *data, size_t length, GamePacketType packet_type); #endif // GAME_BASE diff --git a/src/game_centipede.c b/src/game_centipede.c index ccc53ea..1215092 100644 --- a/src/game_centipede.c +++ b/src/game_centipede.c @@ -42,7 +42,7 @@ #define CENT_MAX_NUM_SEGMENTS 12 /* Get a free life every time we get this many points. Needs to be > the most points we can get in a single shot. */ -#define CENT_SCORE_ONE_UP 5000 +#define CENT_SCORE_ONE_UP 7000 /* Max number of lives we can have */ #define CENT_MAX_LIVES 6 @@ -53,6 +53,9 @@ /* Max speed of an enemy agent */ #define CENT_MAX_ENEMY_AGENT_SPEED 8 +/* Determines the overall speed of the game per game_set_update_interval() */ +#define CENT_GAME_UPDATE_INTERVAL 14 + /* How often a head that reaches the bottom can repdoduce */ #define CENT_REPRODUCE_TIMEOUT 10 @@ -64,7 +67,7 @@ #define CENT_BULLET_COLOUR YELLOW #define CENT_BULLET_ATTR A_BOLD #define CENT_BULLET_CHAR '|' -#define CENT_BULLET_SPEED 150 +#define CENT_BULLET_SPEED 300 #define CENT_BLASTER_ATTR A_BOLD #define CENT_BLASTER_CHAR 'U' @@ -1730,7 +1733,7 @@ int centipede_initialize(GameData *game) game_show_lives(game, true); game_show_high_score(game, true); game_increment_level(game); - game_set_update_interval(game, 10); + game_set_update_interval(game, CENT_GAME_UPDATE_INTERVAL); if (cent_init_state(game, state) == -1) { free(state); diff --git a/src/game_chess.c b/src/game_chess.c index 9bcf93e..9a11382 100644 --- a/src/game_chess.c +++ b/src/game_chess.c @@ -826,9 +826,7 @@ static bool chess_mock_move_valid(ChessState *state, const Player *player, Tile chess_copy_piece(&to->piece, &from->piece); from->piece.type = NoPiece; - if (chess_player_in_check(state, player)) { - in_check = true;; - } + in_check = chess_player_in_check(state, player); from->piece.type = from_piece.type; chess_copy_piece(&to->piece, &to_piece); @@ -1079,9 +1077,7 @@ static void chess_update_state(ChessState *state, Player *self, Player *other, c self->in_check = false; - if (chess_player_in_check(state, other)) { - other->in_check = true; - } + other->in_check = chess_player_in_check(state, other); state->message_length = 0; state->black_to_move ^= 1; @@ -1813,7 +1809,7 @@ void chess_cb_kill(GameData *game, void *cb_data) static int chess_handle_opponent_move_packet(const GameData *game, ChessState *state, const uint8_t *data, size_t length) { - if (length != CHESS_PACKET_MOVE_SIZE || data == NULL) { + if (length < CHESS_PACKET_MOVE_SIZE || data == NULL) { return -1; } @@ -1845,7 +1841,7 @@ static int chess_handle_opponent_move_packet(const GameData *game, ChessState *s } if (chess_try_move_opponent(state, from_tile, to_tile) != 0) { - fprintf(stderr, "opponent tried to make an illegal move: %c%d-%c%d\n", from_l, from_n, to_l, to_n); + fprintf(stderr, "Chess opponent tried to make an illegal move: %c%d-%c%d\n", from_l, from_n, to_l, to_n); return -1; } @@ -1887,7 +1883,7 @@ static void chess_cb_on_packet(GameData *game, const uint8_t *data, size_t lengt return; } - if (!cb_data) { + if (cb_data == NULL) { return; } @@ -1928,7 +1924,7 @@ static void chess_cb_on_packet(GameData *game, const uint8_t *data, size_t lengt default: { fprintf(stderr, "Got unknown chess packet type: %d\n", type); - break; + return; } } @@ -2044,7 +2040,7 @@ static int chess_packet_send_resign(const GameData *game) uint8_t data[1]; data[0] = CHESS_PACKET_RESIGN; - if (game_send_packet(game, data, 1, GP_Data) == -1) { + if (game_packet_send(game, data, 1, GP_Data) == -1) { return -1; } @@ -2060,7 +2056,7 @@ static int chess_packet_send_move(const GameData *game, const Tile *from, const data[3] = to->chess_coords.L; data[4] = to->chess_coords.N; - if (game_send_packet(game, data, 5, GP_Data) == -1) { + if (game_packet_send(game, data, 5, GP_Data) == -1) { return -1; } @@ -2073,7 +2069,7 @@ static int chess_packet_send_invite(const GameData *game, bool self_is_white) data[0] = CHESS_PACKET_INIT_SEND_INVITE; data[1] = self_is_white ? Black : White; - if (game_send_packet(game, data, 2, GP_Invite) == -1) { + if (game_packet_send(game, data, 2, GP_Invite) == -1) { return -1; } @@ -2085,7 +2081,7 @@ static int chess_packet_send_accept(const GameData *game) uint8_t data[1]; data[0] = CHESS_PACKET_INIT_ACCEPT_INVITE; - if (game_send_packet(game, data, 1, GP_Data) == -1) { + if (game_packet_send(game, data, 1, GP_Data) == -1) { return -1; } @@ -2160,4 +2156,3 @@ int chess_initialize(GameData *game, const uint8_t *init_data, size_t length) return 0; } - diff --git a/src/game_util.c b/src/game_util.c index 094a412..ba6fe63 100644 --- a/src/game_util.c +++ b/src/game_util.c @@ -104,22 +104,28 @@ void game_util_move_coords(Direction direction, Coords *coords) { switch (direction) { case NORTH: { - --(coords->y); + if (coords->y > 0) { + --(coords->y); + } + break; } case SOUTH: { - ++(coords->y); + ++(coords->y); // Will rollover if you do something stupid break; } case EAST: { - ++(coords->x); + ++(coords->x); // Will rollover if you do something stupid break; } case WEST: { - --(coords->x); + if (coords->x > 0) { + --(coords->x); + } + break; } diff --git a/src/windows.c b/src/windows.c index f68bfbd..8be910d 100644 --- a/src/windows.c +++ b/src/windows.c @@ -457,7 +457,12 @@ void del_window(ToxWindow *w) refresh(); if (num_active_windows > 0) { + if (active_window_index == 2) { // if closing current window would bring us to friend list + set_next_window(-1); // skip back to the home window instead. FIXME: magic numbers + } + set_next_window(-1); + --num_active_windows; } } @@ -519,6 +524,12 @@ void on_window_resize(void) getmaxyx(w->window, y2, x2); + if (y2 <= 0 || x2 <= 0) { + fprintf(stderr, "Failed to resize game window: max_x: %d, max_y: %d\n", x2, y2); + delwin(w->window); + continue; + } + w->window_bar = subwin(w->window, WINDOW_BAR_HEIGHT, COLS, LINES - 2, 0); w->game->window = subwin(w->window, y2 - CHATBOX_HEIGHT - WINDOW_BAR_HEIGHT, x2, 0, 0); continue; @@ -549,7 +560,7 @@ void on_window_resize(void) if (y2 <= 0 || x2 <= 0) { fprintf(stderr, "Failed to resize window: max_x: %d, max_y: %d\n", x2, y2); delwin(w->window); - return; + continue; } if (w->show_peerlist) { @@ -790,7 +801,6 @@ void draw_active_window(Tox *m) if (ch == user_settings->key_next_tab || ch == user_settings->key_prev_tab) { set_next_window(ch); - ch = KEY_F(2); } a->onKey(a, m, ch, false); @@ -892,18 +902,30 @@ void kill_all_windows(Tox *m) continue; } - if (w->type == WINDOW_TYPE_CHAT) { - kill_chat_window(w, m); - } else if (w->type == WINDOW_TYPE_CONFERENCE) { - free_conference(w, w->num); - } + switch (w->type) { + case WINDOW_TYPE_CHAT: { + kill_chat_window(w, m); + break; + } + + case WINDOW_TYPE_CONFERENCE: { + free_conference(w, w->num); + break; + } #ifdef GAMES - else if (w->type == WINDOW_TYPE_GAME) { - game_kill(w); - } + + case WINDOW_TYPE_GAME: { + game_kill(w); + break; + } #endif // GAMES + + default: { + break; + } + } } /* TODO: use enum instead of magic indices */ diff --git a/src/windows.h b/src/windows.h index bc310e2..a33ae2f 100644 --- a/src/windows.h +++ b/src/windows.h @@ -310,5 +310,5 @@ void draw_window_bar(ToxWindow *self); call at least once per second */ void refresh_inactive_windows(void); -#endif // WINWDOWS_H +#endif // WINDOWS_H