#include "main.h" #include "entity.h" #include "loader.h" #include "tilemap.h" #include "input.h" #include "util.h" #include "save.h" #include #include enum { SAVE_A_IDLE, SAVE_A_SPIN, SAVE_A_SPIN2, SAVE_A_SPIN3, SAVE_A_SHAKE, SAVE_A_SHAKE2, SAVE_A_SHAKE3, }; struct anim save_anims[] = { {SAVE_A_IDLE, {0, 0, 16, 16}, 300}, {SAVE_A_SPIN2, {16, 0, 16, 16}, 5}, {SAVE_A_SPIN3, {32, 0, 16, 16}, 5}, {SAVE_A_IDLE, {16, 0, 16, 16}, 5}, {SAVE_A_SHAKE2, {1, 0, 16, 16}, 5}, {SAVE_A_SHAKE3, {-1, 0, 16, 16}, 5}, {SAVE_A_IDLE, {1, 0, 16, 16}, 5}, }; static void save_free(struct entity *self) { self->state = 0; free(self->ext), self->ext = NULL; } static int save_update(struct entity *self) { if (self->timer > 0) { self->timer--; } if ( self->hitbox.left < entities.player[0].hitbox.right && self->hitbox.right > entities.player[0].hitbox.left && self->hitbox.top < entities.player[0].hitbox.bottom && self->hitbox.bottom > entities.player[0].hitbox.top && input_s(input_pressed) && self->timer == 0 ) { self->timer = 20; self->anim = save_anims[SAVE_A_SHAKE]; FILE *file = fopen(save_file_name, "wb"); if (file == NULL) { perror(save_file_name); goto no_save; } if (game_save(file)) { goto no_save; } self->anim = save_anims[SAVE_A_SPIN]; } no_save: self->anim.length--; if (self->anim.length == 0) { self->anim = save_anims[self->anim.frame]; } return 0; } static int save_hurt(struct entity *self, struct damage damage) { return 0; } static int save_draw(struct entity *self, int camX, int camY) { SDL_Rect rect = self->anim.rect; SDL_RenderCopy(renderer, self->texture, &rect, &(SDL_Rect) {from_fixed(self->x) - camX - 8, from_fixed(self->y) - camY - 16, 16, 16}); if (self->ext != NULL) { rect.y += 16; struct color const *const color = self->ext; SDL_SetTextureColorMod(self->texture, color->r, color->g, color->b); SDL_RenderCopy(renderer, self->texture, &rect, &(SDL_Rect) {from_fixed(self->x) - camX - 8, from_fixed(self->y) - camY - 16, 16, 16}); SDL_SetTextureColorMod(self->texture, 255, 255, 255); } return 0; } struct entity *save_new(struct entities *entities) { struct entity *self = entities->enemy + entities->enemies; *self = (struct entity) { .update = save_update, .hurt = save_hurt, .draw = save_draw, .free = save_free, .x = 0, .y = 0, .state = 1, .timer = 0, .ext = NULL, }; self->anim = save_anims[SAVE_A_SPIN]; self->texture = res_get_texture("save").data; entities->enemies++; return self; } int save_property(struct entity *const restrict self, char const *const restrict property, char const *const restrict value) { if (strcmp(property, "x") == 0) { self->x = to_fixed(atoi(value)); } else if (strcmp(property, "y") == 0) { self->y = to_fixed(atoi(value)); } else if (strcmp(property, "color") == 0) { free(self->ext); self->ext = malloc(sizeof (struct color)); if (util_stringToColor(self->ext, value)) { return 1; } } else { return 1; } self->hitbox = (struct hitbox) {.left = from_fixed(self->x) - 8, .top = from_fixed(self->y) - 16, .right = from_fixed(self->x) + 8, .bottom = from_fixed(self->y)}; return 0; }