summary refs log tree commit diff
path: root/src/disk.c
diff options
context:
space:
mode:
authorzlago2024-10-26 20:18:41 +0200
committerzlago2024-10-26 20:21:59 +0200
commitd44d411e0eb3800ed883374b29c2863e1a863735 (patch)
tree05721dbc8bc1df747179fcb62120a009f23d86a3 /src/disk.c
parentb12606899c98d7fc7a120c2b79797b5c45283ad2 (diff)
move save file code to a separate file
Diffstat (limited to 'src/disk.c')
-rw-r--r--src/disk.c118
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;
+}