Program Listing for File player_life.c

Return to documentation for file (server/game_events/player_life.c)

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

#include "client/client.h"
#include "handler.h"
#include "names.h"
#include "server.h"

static constexpr const size_t FOOD_SURVIVAL = 126;

static
bool death_rescedule(server_t *srv, const event_t *event)
{
    uint64_t interval = (FOOD_SURVIVAL * MICROSEC_IN_SEC) / srv->frequency;
    client_state_t *cs = event_get_client(srv, event);
    event_t new = {
        .timestamp = get_timestamp() + interval,
        .client_idx = event->client_idx,
        .client_id = event->client_id,
        .command = { PLAYER_DEATH }
    };

    if (cs == nullptr)
        return false;
    cs->inv.food--;
    gui_player_get_inventory_handler(srv, event);
    if (!event_heap_push(&srv->events, &new)) {
        perror("Failed to reschedule death event");
        return false;
    }
    return true;
}

bool player_death_handler(server_t *srv, const event_t *event)
{
    client_state_t *cs = event_get_client(srv, event);

    if (cs == nullptr)
        return false;
    if (cs->inv.food > 0)
        return death_rescedule(srv, event);
    append_to_output(srv, cs, "dead\n");
    write_client(srv, event->client_idx);
    remove_client(srv, event->client_idx);
    return true;
}