1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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, 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;
}
|