diff options
Diffstat (limited to 'src/disk.c')
-rw-r--r-- | src/disk.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/disk.c b/src/disk.c new file mode 100644 index 0000000..a6e3d80 --- /dev/null +++ b/src/disk.c @@ -0,0 +1,118 @@ +#include "main.h" +#include "entity.h" +#include "loader.h" +#include "tilemap.h" +#include "input.h" +#include "util.h" +#include "save.h" +#include <string.h> +#include <stdio.h> + +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, int 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; +} |