diff options
| author | UnavailableDev <ggwildplay@gmail.com> | 2023-04-05 20:50:07 +0200 | 
|---|---|---|
| committer | UnavailableDev <ggwildplay@gmail.com> | 2023-04-05 20:50:07 +0200 | 
| commit | 0dd7be7230b3ccba9a930c01549d79d108d091c4 (patch) | |
| tree | 62f42cbf597232ed1076bb539426df8ddcf2886e /src/engine | |
| parent | 06b9a5e3c252713c211d77b5643143276db209ba (diff) | |
| parent | dc5e246ff1e8d89e59acf70c149f180fb41dd584 (diff) | |
Merge branch 'dev' of https://github.com/heavydemon21/avans-arcade into dev
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/bullet.c | 40 | ||||
| -rw-r--r-- | src/engine/enemy.c | 10 | ||||
| -rw-r--r-- | src/engine/enemy.h | 5 | ||||
| -rw-r--r-- | src/engine/enemy_ai.c | 99 | ||||
| -rw-r--r-- | src/engine/enemy_ai.h | 10 | ||||
| -rw-r--r-- | src/engine/entity.c | 31 | ||||
| -rw-r--r-- | src/engine/entity.h | 5 | ||||
| -rw-r--r-- | src/engine/level_const.c | 2 | ||||
| -rw-r--r-- | src/engine/player_controller.c | 2 | ||||
| -rw-r--r-- | src/engine/types.h | 4 | 
10 files changed, 188 insertions, 20 deletions
| diff --git a/src/engine/bullet.c b/src/engine/bullet.c index 55b20cc..eb9a8bb 100644 --- a/src/engine/bullet.c +++ b/src/engine/bullet.c @@ -42,12 +42,47 @@ bool rising_edge(bool signal, bool* prev) {      return edge;  }  bool prev_signal = false; +void hh_handle_bullet_direction(hh_entity* bullet){ +	bullet->vel = (vec2){0,0}; +	if (g_hh_controller_p1.dpad_left) { +		if (g_hh_controller_p1.dpad_up) { +			bullet->vel.x = -1; +			bullet->vel.y = -1; +		} else if (g_hh_controller_p1.dpad_down) { +			bullet->vel.x = -1; +			bullet->vel.y = 1; +		} else { +			bullet->vel.x = -1; +		} +	}else if (g_hh_controller_p1.dpad_right) { +		if (g_hh_controller_p1.dpad_up) { +			bullet->vel.x = 1; +			bullet->vel.y = -1; +		} else if (g_hh_controller_p1.dpad_down) { +			bullet->vel.x = 1; +			bullet->vel.y = 1; +		} else { +			bullet->vel.x = 1; +		} +	} else if (g_hh_controller_p1.dpad_up){ +		bullet->vel.y = -1; +	} else if (g_hh_controller_p1.dpad_down){ +		bullet->vel.y = 1; +	} +	else{ +		bullet->vel.x = 1; +	} +	bullet->render.fam.horizontal_flip = (bullet->vel.x < 0); +	bullet->render.fam.vertical_flip = (bullet->vel.y != 0); +	 +}  void hh_shoot_bullet(vec2 player, hh_entity* bullet){  	vec2 temp;  	if(rising_edge(g_hh_controller_p1.button_secondary,&prev_signal) && bullet->is_grounded){  			bullet->is_grounded=false;  			bullet->pos = player;  			current_bullet = (current_bullet + 1) % bullets_size; +			hh_handle_bullet_direction(bullet);  	}  } @@ -55,11 +90,10 @@ void hh_shoot_bullet(vec2 player, hh_entity* bullet){  void hh_update_bullet(hh_entity* bullet){  	if(hh_background_collision_bulllet(*bullet)){  		hh_bullet_death(bullet); - -		// printf("x %d y %d\n",(bullet->pos.x-cam_pos.x),(bullet->pos.y-cam_pos.y));  	}  	else{ -		bullet->pos.x += bullet->speed;	 +		bullet->pos.x = bullet->pos.x + bullet->vel.x * bullet->speed;	 +		bullet->pos.y = bullet->pos.y  + bullet->vel.y * bullet->speed;	  	}  } diff --git a/src/engine/enemy.c b/src/engine/enemy.c index 186cfa0..4ed48a2 100644 --- a/src/engine/enemy.c +++ b/src/engine/enemy.c @@ -1,14 +1,9 @@  #include "engine/enemy.h" -void hh_update_enemy(hh_entity* enemy, vec_cor cam_pos){ -	//Bjorn functions - -} - -void hh_multiple_enemies( vec_cor cam_pos, hh_entity* enemies, int total_enemies){ +void hh_multiple_enemies(hh_entity* enemies, hh_entity player, vec_cor cam_pos, int total_enemies){  	for(int i=0; i < total_enemies;i++){ -			hh_update_enemy(&enemies[i] , cam_pos); +			hh_update_enemy(&enemies[i] , player, cam_pos);  		}  } @@ -22,6 +17,7 @@ void hh_enemy_death_check(hh_entity* enemy){  		enemy->hp--;  	}  } +  void hh_solve_hitted_enemies(hh_entity* enemies, int total_enemies){  	for(int i = 0; i < total_enemies; i++){  		if(enemies[i].is_hit){ diff --git a/src/engine/enemy.h b/src/engine/enemy.h index 80498f5..c8a3f20 100644 --- a/src/engine/enemy.h +++ b/src/engine/enemy.h @@ -1,14 +1,13 @@  #pragma once  #include "player_controller.h"  #include "engine/sprite_controller.h" +#include "engine/enemy_ai.h"  #include "types.h"  #include "input.h" -/** @brief updates a single enemy locations TODO: Bjorn sets functions in here*/ -void hh_update_enemy(hh_entity* , vec_cor );  /** @brief calculates all the given enemies positions*/ -void hh_multiple_enemies( vec_cor cam_pos, hh_entity* enemies, int total_enemies); +void hh_multiple_enemies(hh_entity* enemies, hh_entity player, vec_cor cam_pos, int total_enemies);  /** @brief checks if the enemy has zero hp else it takes hp from the enemy */  void hh_enemy_death_check(hh_entity* enemy); diff --git a/src/engine/enemy_ai.c b/src/engine/enemy_ai.c new file mode 100644 index 0000000..81d04d9 --- /dev/null +++ b/src/engine/enemy_ai.c @@ -0,0 +1,99 @@ +#include "engine/enemy_ai.h" + +int8_t hh_get_direction(int32_t player_x, int32_t enemy_x){ +	int movement_direction = player_x - enemy_x; // = player.pos.x - player.prev_pos.x; +	if (movement_direction > 0) { +		return 1; // move in positive direction +	} else if (movement_direction < 0) { +		return -1; // move in negative direction +	} else { +		return 0; // don't move +	} +} +void hh_update_enemy_movement(hh_entity* enemy){ +	hh_entity enemy_new = {0}; +	enemy_new = *enemy; +	enemy_new.vel = (vec2){ +		.x = enemy->vel.x, +		.y = enemy->vel.y, +	}; +	 +	enemy_new.pos = (vec2){ +		.x = enemy->pos.x + enemy_new.vel.x, +		.y = enemy->pos.y + enemy_new.vel.y, +	}; + + +	*enemy =  hh_background_collision ( *enemy, enemy_new); +} +void hh_slime_ai(hh_entity* enemy, hh_entity player){ +	int8_t direction = hh_get_direction(player.pos.x, enemy->pos.x); +	if((player.pos.x - enemy->pos.x) >= -hunt_player && (player.pos.x - enemy->pos.x) <= hunt_player){ +   	hh_movement_entity(enemy, direction); +	} +	hh_gravity_entity(enemy); +	hh_update_enemy_movement(enemy); + +} + +void hh_jump_slime_ai(hh_entity* enemy, hh_entity player){ +	int8_t direction = hh_get_direction(player.pos.x, enemy->pos.x); +	hh_gravity_entity(enemy); +	if((player.pos.x - enemy->pos.x) >= -hunt_player && (player.pos.x - enemy->pos.x) <= hunt_player){ +   	hh_movement_entity(enemy, direction); +		// TODO: fix this if statement and make it cleaner. this makes the enemy jump when the player mets the condition +		if((player.pos.y - enemy->pos.y) < -16 && (player.pos.y - enemy->pos.y) >= -100 && (player.pos.x - enemy->pos.x) >= -10 && (player.pos.x - enemy->pos.x) <= 10){ +			hh_jump_entity(enemy); +		} +	} + +	hh_update_enemy_movement(enemy); + +} +#define terror_owl_attack_timer 100 +#define terror_owl_follow_player_delay 5  +#define terror_owl_attack_player_delay 12 +#define terror_owl_dive_speed 3 +#define delay_frames 2 +#define terror_owl_minimal_distance_from_player 100 +void hh_terror_owl_ai(hh_entity* enemy, hh_entity player){ +	static int count=0; +	static int last_y_location=0; +     +	if (count < terror_owl_attack_timer) { +		// Move towards player position smoothly +		int delta_x = (-50 + player.pos.x - enemy->pos.x) / terror_owl_follow_player_delay; +		enemy->pos.x += delta_x; +		enemy->pos.y = player.pos.y - terror_owl_minimal_distance_from_player; + +		count++; +		last_y_location=player.pos.y; +	} else { +		if(enemy->pos.y <= last_y_location){ +			int delta_x = (player.pos.x - enemy->pos.x) / terror_owl_attack_player_delay; +			enemy->pos.x += delta_x; +			enemy->pos.y += terror_owl_dive_speed; +		} +		else{ +			count = 0; +		} +	} + +} +void hh_update_enemy(hh_entity* enemy ,  hh_entity player, vec_cor cam_pos){ +	// static hh_e_entity_type type; +	switch (enemy->object_type) +	{ +	case slime: +		hh_slime_ai(enemy,player); +		break; +	case jumping_slime: +		hh_jump_slime_ai(enemy,player); +		break; +	case terror_owl: +		hh_terror_owl_ai(enemy,player); +		break; +	default: +		break; +	} +} diff --git a/src/engine/enemy_ai.h b/src/engine/enemy_ai.h new file mode 100644 index 0000000..d68f50f --- /dev/null +++ b/src/engine/enemy_ai.h @@ -0,0 +1,10 @@ +#pragma once +#include "player_controller.h" +#include "engine/sprite_controller.h" +#include "types.h" +#include "input.h" +#include <math.h> + + +#define hunt_player 100 +void hh_update_enemy(hh_entity* enemy ,  hh_entity player, vec_cor cam_pos); diff --git a/src/engine/entity.c b/src/engine/entity.c index 1cb88be..eba6481 100644 --- a/src/engine/entity.c +++ b/src/engine/entity.c @@ -43,6 +43,7 @@ void hh_solve_collision(vec2 pos_environment, hh_entity* entity){  	// 	entity->vel.x = 0;  	// }   } +  hh_entity hh_background_collision (hh_entity temp_old_entity,hh_entity temp_new_entity){  		temp_new_entity.is_grounded = false; @@ -119,6 +120,7 @@ bool hh_background_collision_bulllet (hh_entity temp_old_entity){  	// temp_old_entity.vel = temp_new_entity.vel;  	return false;  } +  hh_entity hh_enemy_collision(hh_entity temp_player, hh_entity temp_enemy){  	bool collide = hh_distance_circles( temp_player.pos,  temp_enemy.pos, temp_player.radius, temp_enemy.radius); @@ -138,7 +140,7 @@ hh_entity hh_enemy_collision(hh_entity temp_player, hh_entity temp_enemy){  			temp_player.vel.x = 8;  		}  		// ghost mode / invulnerable or other things on hit -		//	temp_player.hp--; +		temp_player.hp--;  	} else {  		temp_player.is_hit = false; @@ -170,14 +172,35 @@ void hh_jump_entity(hh_entity* object_1){  	}  }  void hh_gravity_entity(hh_entity* object_1){ -	if (object_1->is_grounded == false && object_1->vel.y < 6) { +	if (object_1->is_grounded == false) {  		object_1->vel.y += 1; //gravity  	}  } -void hh_hit_entity(hh_entity* object_1, int8_t* hit_timer, int8_t* direction){ + +void hh_movement_entity(hh_entity* object_1, int8_t* direction){ +	if(direction != 0){ +		if(object_1->vel.x > -1 * object_1->speed && object_1->vel.x < object_1->speed) { +			object_1->vel.x = object_1->vel.x + direction; +		} else { +			if (object_1->vel.x > 0) { +				object_1->vel.x--; +			} else if(object_1->vel.x < 0) { +				object_1->vel.x++;  +			} +		} +	} else { +		if (object_1->vel.x > 0) { +			object_1->vel.x--; +		} else if(object_1->vel.x < 0) { +		object_1->vel.x++;  +		} +	} +	 +} +void hh_player_move_hit(hh_entity* object_1, int8_t* hit_timer, int8_t* direction){  	if(object_1->is_hit == true){  		hit_timer = 9; -		object_1->is_hit = false;	 +		//object_1->is_hit = false;  	}   	if(hit_timer > -10){  			hit_timer--; diff --git a/src/engine/entity.h b/src/engine/entity.h index fde9341..fb1c905 100644 --- a/src/engine/entity.h +++ b/src/engine/entity.h @@ -51,9 +51,12 @@ void hh_jump_entity(hh_entity* );  /** @brief looks if the player is grounded and if not it sets the position down */  void hh_gravity_entity(hh_entity* );  /** @brief if object is hit bounches in specific direction and moves the object */ -void hh_hit_entity(hh_entity* object_1, int8_t* hit_timer, int8_t* direction); +void hh_player_move_hit(hh_entity* object_1, int8_t* hit_timer, int8_t* direction); + +void hh_movement_entity(hh_entity* object_1, int8_t* direction);  /** @brief specific bullet background collisions detection */  bool hh_background_collision_bulllet (hh_entity temp_old_entity);  /** @brief checks any entity has a hit on each othe*/  void hh_check_all_collisions(hh_entity* player, hh_entity* enemies, int total_enemies, hh_entity* bullets, int total_bullets, vec_cor cam_pos); + diff --git a/src/engine/level_const.c b/src/engine/level_const.c index 642a474..5d5f5e0 100644 --- a/src/engine/level_const.c +++ b/src/engine/level_const.c @@ -4,7 +4,7 @@  hh_g_all_levels hh_init_game_levels(){  	hh_g_all_levels levels; -	levels.current_level=0; +	levels.current_level=1;  	levels.level[0].size.x=40;  	levels.level[0].size.y=15; diff --git a/src/engine/player_controller.c b/src/engine/player_controller.c index 6400b02..0148792 100644 --- a/src/engine/player_controller.c +++ b/src/engine/player_controller.c @@ -18,7 +18,7 @@ void hh_player_actions(hh_entity* player){  	int8_t direction_x = (-1 * g_hh_controller_p1.dpad_left) + (1 * g_hh_controller_p1.dpad_right);  	int8_t direction_y = (-1 * g_hh_controller_p1.dpad_up) + (1 * g_hh_controller_p1.dpad_down); -	hh_hit_entity(player,hit_timer,direction_x); +	hh_player_move_hit(player,hit_timer,direction_x);  	hh_gravity_entity(player);  	if(g_hh_controller_p1.button_primary){  		hh_jump_entity(player); diff --git a/src/engine/types.h b/src/engine/types.h index 00b381b..8040e46 100644 --- a/src/engine/types.h +++ b/src/engine/types.h @@ -4,6 +4,9 @@  typedef uint8_t hh_ppu_fg_idx;  // typedef uint16_t hh_bg_idx; +typedef enum { +	slime, jumping_slime, terror_owl, +}hh_e_all_objects_game_type;  typedef enum {  	fire, ice, poison @@ -31,6 +34,7 @@ typedef struct {  	vec2 pos, vel, size;  	bool is_grounded;  	bool is_hit; +	hh_e_all_objects_game_type object_type;  	uint8_t radius;  	int8_t hp;  	int8_t speed; |