Beispiel #1
0
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);
}
Beispiel #2
0
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);
}