summary refs log tree commit diff
path: root/src/disk.c
blob: 5231953dc01c4038ca8e578fc192b8d633641e29 (plain)
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;
}