thingp thing_place_bomb (levelp level, thingp owner, double x, double y) { if (!owner->bombs) { return (0); } owner->bombs--; player_wid_update(level); widp w = thing_place(level, owner, id_to_tp(THING_BOMB)); if (!w) { ERR("could not place bomb"); return (0); } thingp t = wid_get_thing(w); /* * Set no owner. Bombs should kill their owner too! * thing_set_owner(t, owner); */ thing_wake(level, t); return (t); }
void level_place_light (levelp level, double x, double y) { int ix = (int)x; int iy = (int)y; if (level->map_grid.lit[ix][iy]) { return; } level->map_grid.lit[ix][iy] = 1; (void) wid_game_map_server_replace_tile(wid_game_map_server_grid_container, x, y, 0, /* thing */ id_to_tp(THING_LIGHT), 0 /* tpp_data */, 0 /* item */, 0 /* stats */); }
static uint8_t wid_game_map_key_event (widp w, const SDL_KEYSYM *key) { int action = PLAYER_ACTION_USE; int change_selection_only = false; if (wid_menu_visible) { return (false); } tpp tp; if (!player) { wid_player_info_hide(true /* fast */); wid_player_inventory_hide(true /* fast */); return (true); } int redraw_action_bar = 0; int action_bar_index = thing_stats_get_action_bar_index(player); if (key->mod & KMOD_SHIFT) { int weapon_switch_delta = 0; switch (key->sym) { case SDLK_LEFT: weapon_switch_delta = -1; break; case SDLK_RIGHT: weapon_switch_delta = 1; break; default: break; } /* * Weapon switch? */ if (!weapon_switch_delta) { return (true); } /* * Only switch between weapons */ int tries = THING_ACTION_BAR_MAX; while (tries-- > 0) { action_bar_index += weapon_switch_delta; if (action_bar_index < 0) { action_bar_index = THING_ACTION_BAR_MAX - 1; } if (action_bar_index >= THING_ACTION_BAR_MAX) { action_bar_index = 0; } uint32_t id = player->stats.action_bar[action_bar_index].id; if (!id) { continue; } tp = id_to_tp(id); if (!tp) { continue; } /* * Found a weapon, switch to it. */ change_selection_only = true; break; } if (tries <= 0) { return (true); } redraw_action_bar = 1; } else { switch (key->sym) { case SDLK_1: action_bar_index = 0; redraw_action_bar = 1; break; case SDLK_2: action_bar_index = 1; redraw_action_bar = 1; break; case SDLK_3: action_bar_index = 2; redraw_action_bar = 1; break; case SDLK_4: action_bar_index = 3; redraw_action_bar = 1; break; case SDLK_5: action_bar_index = 4; redraw_action_bar = 1; break; case SDLK_6: action_bar_index = 5; redraw_action_bar = 1; break; case SDLK_7: action_bar_index = 6; redraw_action_bar = 1; break; case SDLK_8: action_bar_index = 7; redraw_action_bar = 1; break; case SDLK_9: action_bar_index = 8; redraw_action_bar = 1; break; case SDLK_0: action_bar_index = 9; redraw_action_bar = 1; break; case 'z': debug = !debug; CON("debug %d", debug); return (true); case 'd': action = PLAYER_ACTION_DROP; break; case 'p': action = PLAYER_ACTION_PAY; break; case '\t': { /* * Show the inventory. */ thing_statsp s; s = &player->stats; if (!wid_player_info_is_visible()) { /* * Show stats window. */ wid_player_stats_visible(s); wid_player_info_visible(s, false /* fast */); wid_player_inventory_visible(s, false /* fast */); socket_tx_player_action(client_joined_server, player, PLAYER_ACTION_PAUSE_GAME, 0 /* action_bar_index */, false /* change_selection_only */); } else { /* * Hide stats window. */ wid_player_stats_hide(s); wid_player_info_hide(false /* fast */); wid_player_inventory_hide(false /* fast */); socket_tx_player_action(client_joined_server, player, PLAYER_ACTION_RESUME_GAME, 0 /* action_bar_index */, false /* change_selection_only */); } return (true); } case 's': wid_choose_stats_visible(); socket_tx_player_action(client_joined_server, player, PLAYER_ACTION_PAUSE_GAME, 0 /* action_bar_index */, false /* change_selection_only */); return (true); case 'q': if (client_level->is_test_level) { wid_game_map_go_back_to_editor(); return (true); } wid_game_quit_visible(); return (true); case SDLK_RETURN: case ' ': return (false); default: return (false); } } uint32_t id = player->stats.action_bar[action_bar_index].id; if (!id) { MESG(WARNING, "Nothing in that slot"); return (true); } tp = id_to_tp(id); if (!tp) { MESG(WARNING, "No carried item is using that key"); return (true); } if (!client_joined_server) { MESG(WARNING, "Not connected to server"); return (true); } if (redraw_action_bar) { /* * Assume the server will accept the change and update locally else it * looks laggy. */ player_action_bar_changed_at = time_get_time_ms(); thing_stats_set_action_bar_index(player, action_bar_index); wid_player_action_hide(true /* fast */, false /* player quit */); wid_player_action_visible(&player->stats, true /* fast */); wid_player_stats_redraw(true /* fast */); } socket_tx_player_action(client_joined_server, player, action, action_bar_index, change_selection_only); return (true); }