#include #include #include "common.h" #include "snapshot.h" int dp_snapshot_init(struct snapshot *s, int32_t players_len, int32_t balls_len) { if (!s) return -1; if (!(s->players = calloc(players_len, sizeof(*s->players)))) return -1; if (!(s->balls = calloc(balls_len, sizeof(*s->balls)))) { free(s->players); return -1; } s->players_len = players_len; s->balls_len = balls_len; return 0; } void dp_snapshot_deinit(struct snapshot *s) { if (!s) return; if (s->players) { free(s->players); s->players = NULL; } if (s->balls) { free(s->balls); s->balls = NULL; } } int dp_snapshot_put_player(struct snapshot *s, int32_t id, const struct player *p) { if (!s || !p) return -1; if (id >= s->players_len) return -1; s->players[id] = *p; s->players[id].state = STATE_ACTIVE; return 0; } struct player * dp_snapshot_get_player(struct snapshot *s, int32_t id) { struct player *p; if (!s) return NULL; if (id >= s->players_len) return NULL; p = &s->players[id]; if (p->state == STATE_INACTIVE) return NULL; return p; } int dp_snapshot_remove_player(struct snapshot *s, int32_t id) { struct player *p; if (!s) return -1; if (id >= s->players_len) return -1; p = dp_snapshot_get_player(s, id); memset(p, 0, sizeof(*p)); p->state = STATE_REMOVED; return 0; } int dp_snapshot_set_player_input(struct snapshot *s, int32_t id, uint8_t input) { struct player *p; if (!(p = dp_snapshot_get_player(s, id))) return -1; p->input = input; return 0; } int dp_snapshot_put_ball(struct snapshot *s, int32_t id, const struct ball *b) { if (!s || !b) return -1; if (id >= s->balls_len) return -1; s->balls[id] = *b; s->balls[id].state = STATE_ACTIVE; return 0; } struct ball * dp_snapshot_get_ball(struct snapshot *s, int32_t id) { struct ball *b; if (!s) return NULL; if (id >= s->balls_len) return NULL; b = &s->balls[id]; if (b->state == STATE_INACTIVE) return NULL; return b; } int dp_snapshot_remove_ball(struct snapshot *s, int32_t id) { struct ball *b; if (!s) return -1; if (id >= s->balls_len) return -1; b = dp_snapshot_get_ball(s, id); memset(b, 0, sizeof(*b)); b->state = STATE_REMOVED; return 0; }