summary refs log tree commit diff
path: root/src/player.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/player.c')
-rw-r--r--src/player.c42
1 files changed, 29 insertions, 13 deletions
diff --git a/src/player.c b/src/player.c
index 0bf09de..a28a6c9 100644
--- a/src/player.c
+++ b/src/player.c
@@ -4,6 +4,8 @@
 #include "input.h"
 #include "tilemap.h"
 #include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
 #include <math.h>
 #include "particles.h"
 
@@ -38,6 +40,11 @@ enum {
 	PLAYER_A_JUMP,
 	PLAYER_A_FALL,
 	PLAYER_A_FALL2,
+	PLAYER_A_HOP,
+	PLAYER_A_HOP2,
+	PLAYER_A_HOP3,
+	PLAYER_A_CROUCH,
+	PLAYER_A_CROUCH2,
 };
 
 struct anim player_anims[] = {
@@ -50,6 +57,11 @@ struct anim player_anims[] = {
 	{PLAYER_A_JUMP, {16, 0, 16, 16}, 300},
 	{PLAYER_A_FALL2, {32, 0, 16, 16}, 15},
 	{PLAYER_A_FALL2, {48, 0, 16, 16}, 15},
+	{PLAYER_A_HOP2, {16, 0, 16, 16}, 4},
+	{PLAYER_A_HOP3, {32, 0, 16, 16}, 4},
+	{PLAYER_A_CROUCH, {48, 0, 16, 16}, 4},
+	{PLAYER_A_CROUCH2, {64, 0, 16, 16}, 300},
+	{PLAYER_A_CROUCH, {80, 0, 16, 16}, 2},
 };
 
 enum slash_type {
@@ -66,10 +78,10 @@ static int slash_update(struct projectile *self) {
 	} else {
 		self->hp++;
 	}
-	int x = from_fixed(self->x) + self->facing * sin(self->hp / 2) * SLASH_REACH_X;
-	int y = from_fixed(self->y) - cos(self->hp / 2) * SLASH_REACH_Y;
-	int xx = from_fixed(self->x) + self->facing * sin(self->hp / 2 + 1) * SLASH_REACH_X;
-	int yy = from_fixed(self->y) - cos(self->hp / 2 + 1) * SLASH_REACH_Y;
+	int x = from_fixed(self->x) + self->facing * sin(self->hp / 2.0) * SLASH_REACH_X;
+	int y = from_fixed(self->y) - cos(self->hp / 2.0) * SLASH_REACH_Y;
+	int xx = from_fixed(self->x) + self->facing * sin(self->hp / 2.0 + 1) * SLASH_REACH_X;
+	int yy = from_fixed(self->y) - cos(self->hp / 2.0 + 1) * SLASH_REACH_Y;
 	self->hitbox = (struct hitbox) {.left = x - 2, .right = x + 2, .top = y - 2, .bottom = y + 2};
 	for (int i = 0, e = entities.enemies; i < 64 && e; i++) {
 		if (entities.enemy[i].state) {
@@ -81,7 +93,7 @@ static int slash_update(struct projectile *self) {
 			continue;
 		}
 		if (hitbox_overlap(self->hitbox, entities.enemy[i].hitbox)) {
-			entities.enemy[i].hurt(entities.enemy + i, (struct damage) {self->ext == SLASH_STRONG? 2: 1, self->ext == SLASH_NORMAL? 10: 60});
+			entities.enemy[i].hurt(entities.enemy + i, (struct damage) {(enum slash_type) self->ext == SLASH_STRONG? 2: 1, self->ext == SLASH_NORMAL? 10: 60});
 		}
 	}
 	struct particle *part = entities.particle + entities.particles;
@@ -106,18 +118,18 @@ static int slash_draw(struct projectile *self, int camX, int camY) {
 	int const x = from_fixed(self->x) - camX, y = from_fixed(self->y) - camY;
 	if (self->hp >= 0) {
 		SDL_Vertex vertices[4] = {
-			{.position = {x + from_fixed(self->velocity.x) + self->facing * sin(self->hp / 2 - 1) * SLASH_REACH_X, y - cos(self->hp / 2 - 1) * SLASH_REACH_Y}, .color = {255, 191, 63, 255}},
-			{.position = {x + self->facing * sin(self->hp / 2 + 0) * SLASH_REACH_X, y - cos(self->hp / 2 + 0) * SLASH_REACH_Y}, .color = {255, 127, 0, 255}},
-			{.position = {x - from_fixed(self->velocity.x) + self->facing * sin(self->hp / 2 + 1) * SLASH_REACH_X, y - cos(self->hp / 2 + 1) * SLASH_REACH_Y}, .color = {255, 127, 0, 255}},
-			{.position = {x - from_fixed(self->velocity.x * 2) + self->facing * sin(self->hp / 2 + 2) * SLASH_REACH_X, y - cos(self->hp / 2 + 2) * SLASH_REACH_Y}, .color = {255, 127, 0, 0}},
+			{.position = {x + from_fixed(self->velocity.x) + self->facing * sin(self->hp / 2.0 - 1) * SLASH_REACH_X, y - cos(self->hp / 2.0 - 1) * SLASH_REACH_Y}, .color = {255, 191, 63, 255}},
+			{.position = {x + self->facing * sin(self->hp / 2.0 + 0) * SLASH_REACH_X, y - cos(self->hp / 2.0 + 0) * SLASH_REACH_Y}, .color = {255, 127, 0, 255}},
+			{.position = {x - from_fixed(self->velocity.x) + self->facing * sin(self->hp / 2.0 + 1) * SLASH_REACH_X, y - cos(self->hp / 2.0 + 1) * SLASH_REACH_Y}, .color = {255, 127, 0, 255}},
+			{.position = {x - from_fixed(self->velocity.x * 2) + self->facing * sin(self->hp / 2.0 + 2) * SLASH_REACH_X, y - cos(self->hp / 2.0 + 2) * SLASH_REACH_Y}, .color = {255, 127, 0, 0}},
 		};
 		SDL_RenderGeometry(renderer, NULL, vertices, 4, (int []) {0, 1, 2, 0, 2, 3}, 6);
 	} else {
 		SDL_Vertex vertices[4] = {
-			{.position = {x - from_fixed(self->velocity.x) + self->facing * sin(self->hp / 2 + 1) * SLASH_REACH_X, y - cos(self->hp / 2 + 1) * SLASH_REACH_Y}, .color = {255, 191, 63, 255}},
-			{.position = {x + + self->facing * sin(self->hp / 2 + 0) * SLASH_REACH_X, y - cos(self->hp / 2 + 0) * SLASH_REACH_Y}, .color = {255, 127, 0, 255}},
-			{.position = {x + from_fixed(self->velocity.x) + self->facing * sin(self->hp / 2 - 1) * SLASH_REACH_X, y - cos(self->hp / 2 - 1) * SLASH_REACH_Y}, .color = {255, 127, 0, 255}},
-			{.position = {x + from_fixed(self->velocity.x * 2) + self->facing * sin(self->hp / 2 - 2) * SLASH_REACH_X, y - cos(self->hp / 2 - 2) * SLASH_REACH_Y}, .color = {255, 127, 0, 0}},
+			{.position = {x - from_fixed(self->velocity.x) + self->facing * sin(self->hp / 2.0 + 1) * SLASH_REACH_X, y - cos(self->hp / 2.0 + 1) * SLASH_REACH_Y}, .color = {255, 191, 63, 255}},
+			{.position = {x + + self->facing * sin(self->hp / 2.0 + 0) * SLASH_REACH_X, y - cos(self->hp / 2.0 + 0) * SLASH_REACH_Y}, .color = {255, 127, 0, 255}},
+			{.position = {x + from_fixed(self->velocity.x) + self->facing * sin(self->hp / 2.0 - 1) * SLASH_REACH_X, y - cos(self->hp / 2.0 - 1) * SLASH_REACH_Y}, .color = {255, 127, 0, 255}},
+			{.position = {x + from_fixed(self->velocity.x * 2) + self->facing * sin(self->hp / 2.0 - 2) * SLASH_REACH_X, y - cos(self->hp / 2.0 - 2) * SLASH_REACH_Y}, .color = {255, 127, 0, 0}},
 		};
 		SDL_RenderGeometry(renderer, NULL, vertices, 4, (int []) {0, 1, 2, 0, 2, 3}, 6);
 	}
@@ -291,6 +303,7 @@ static int player_update(struct entity *self) {
 			}
 			attack(self, 0, SLASH_NORMAL);
 			if (input_s(input_pressed)) {
+				anim(self, PLAYER_A_CROUCH);
 				self->state = PLAYER_ATTACK2;
 				self->timer = 30;
 			}
@@ -316,10 +329,12 @@ static int player_update(struct entity *self) {
 			}
 			attack(self, 1, SLASH_STRONG);
 			if (input_s(input_pressed)) {
+				anim(self, PLAYER_A_HOP);
 				self->state = PLAYER_ATTACK3;
 				self->timer = 60;
 			}
 			if (self->timer-- == 0) {
+				anim(self, PLAYER_A_IDLE);
 				self->state = PLAYER_IDLE;
 			}
 			break;
@@ -340,6 +355,7 @@ static int player_update(struct entity *self) {
 				self->state = PLAYER_JUMP;
 			}
 			if (self->timer-- == 0) {
+				anim(self, PLAYER_A_IDLE);
 				self->state = PLAYER_IDLE;
 			}
 			break;