From e88c48ae60dd48542e44b0cc244b191c91782681 Mon Sep 17 00:00:00 2001 From: UnavailableDev Date: Thu, 6 Apr 2023 21:36:24 +0200 Subject: random shop items + animations --- src/demo.c | 4 +++- src/engine/animator.c | 25 +++++++++++++++++++++---- src/engine/enemy_ai.c | 13 ++++++++++++- src/engine/entity.c | 5 ++++- src/engine/player_controller.c | 4 ++++ src/engine/sprite_controller.h | 3 ++- src/engine/types.h | 6 ++++++ src/game_loop/gameplay.c | 5 +++-- src/game_loop/shop.c | 31 +++++++++++++++---------------- src/game_loop/shop.h | 15 ++++++++------- src/game_loop/ui.c | 7 +++++++ src/game_loop/ui.h | 3 +++ 12 files changed, 88 insertions(+), 33 deletions(-) diff --git a/src/demo.c b/src/demo.c index c8e3c0e..d072dbc 100644 --- a/src/demo.c +++ b/src/demo.c @@ -48,6 +48,8 @@ void hh_demo_setup() { } void hh_demo_loop(unsigned long frame) { + static uint64_t hh_rng_seed = 0; + hh_rng_seed++; switch (hh_game_states) @@ -59,7 +61,7 @@ void hh_demo_loop(unsigned long frame) { } break; case hh_e_state_shop: - hh_shop(&hh_game_states, &hh_game.shop, hh_game.current_level); + hh_e_upgrades upg = hh_shop(&hh_game_states, &hh_game, hh_rng_seed); break; case hh_e_state_gameplay: hh_gameplay(&hh_game, &hh_game_states); diff --git a/src/engine/animator.c b/src/engine/animator.c index 0811ba7..f188096 100644 --- a/src/engine/animator.c +++ b/src/engine/animator.c @@ -6,21 +6,38 @@ #define hh_white_palette 6 +#define hh_animate_cycle 4 void hh_animate_hit(hh_s_rendering* in, bool hit) { if (hit) { in->fam.palette_index = hh_white_palette; - } else { + in->cooldown = hh_animate_cycle; + } else if(in->cooldown == 0) { in->fam.palette_index = in->palette; + } else { + if (in->cooldown > 0) { + in->cooldown--; + } } } void hh_animate(hh_s_rendering* in, uint16_t start, uint16_t end, uint8_t step) { - if (in->fam.tilemap_index >= start && in->fam.tilemap_index < end) { - in->fam.tilemap_index += step; - } else {// rollover + if (in->fam.tilemap_index < start) {//check for sudden animation change in->fam.tilemap_index = start; + in->cooldown = hh_animate_cycle; + } else { + if (in->cooldown-- == 0) { + + if (in->fam.tilemap_index < end) { + in->fam.tilemap_index += step; + } else {// rollover + in->fam.tilemap_index = start; + } + in->cooldown = hh_animate_cycle; + } + } + } //TODO: if entity not inside of screen, don't update idx (problems with old idx not being overwritten anymore) diff --git a/src/engine/enemy_ai.c b/src/engine/enemy_ai.c index 81d04d9..974de9e 100644 --- a/src/engine/enemy_ai.c +++ b/src/engine/enemy_ai.c @@ -34,9 +34,15 @@ void hh_slime_ai(hh_entity* enemy, hh_entity player){ hh_gravity_entity(enemy); hh_update_enemy_movement(enemy); + hh_animate(&enemy->render, + HH_TM_SLIME_JUMPABLE_OFFSET , + HH_TM_SLIME_JUMPABLE_OFFSET + 3,1 + ); + } void hh_jump_slime_ai(hh_entity* enemy, hh_entity player){ + bool jumped = false; 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){ @@ -44,11 +50,16 @@ void hh_jump_slime_ai(hh_entity* enemy, hh_entity player){ // 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); + jumped = true; } } - + hh_animate(&enemy->render, + HH_TM_SLIME_JUMPABLE_OFFSET + (jumped?4:0), + HH_TM_SLIME_JUMPABLE_OFFSET + (enemy->render.fam.tilemap_index>=HH_TM_SLIME_JUMPABLE_OFFSET+5 ? 7 : 3),1 + ); hh_update_enemy_movement(enemy); + } #define terror_owl_attack_timer 100 #define terror_owl_follow_player_delay 5 diff --git a/src/engine/entity.c b/src/engine/entity.c index eba6481..4bf1b60 100644 --- a/src/engine/entity.c +++ b/src/engine/entity.c @@ -173,7 +173,9 @@ 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 += 1; //gravity + if(object_1->vel.y < 15) { + object_1->vel.y += 1; //gravity + } } } @@ -181,6 +183,7 @@ 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; + object_1->render.fam.horizontal_flip=(object_1->vel.x>0?0:1);// flips direction of object_1 } else { if (object_1->vel.x > 0) { object_1->vel.x--; diff --git a/src/engine/player_controller.c b/src/engine/player_controller.c index 0148792..7e2e678 100644 --- a/src/engine/player_controller.c +++ b/src/engine/player_controller.c @@ -37,6 +37,10 @@ void hh_player_actions(hh_entity* player){ *player = hh_background_collision ( *player, player_new); + + if (direction_x != 0) { + player->render.fam.horizontal_flip = (direction_x > 0 ?0:1); + } } diff --git a/src/engine/sprite_controller.h b/src/engine/sprite_controller.h index 93a2aaf..7467289 100644 --- a/src/engine/sprite_controller.h +++ b/src/engine/sprite_controller.h @@ -18,6 +18,7 @@ #define HH_PAL_IDX_BRICK 1 #define HH_PAL_IDX_SLIME 2 #define HH_PAL_IDX_HUD 2 +#define HH_PAL_IDX_UPGRADE 2 #define HH_PAL_IDX_BULLET 3 #define HH_PAL_IDX_GOZER 3 #define HH_PAL_IDX_TITLE_SCREEN_ICON 3 @@ -35,7 +36,7 @@ const static uint8_t hh_g_sprite_palette[HH_TM_GROUPS] = { HH_PAL_IDX_TITLE_SCREEN_ICON, HH_PAL_IDX_TITLE_SCREEN_ICON, HH_PAL_IDX_HUD, - HH_PAL_IDX_HUD, + HH_PAL_IDX_UPGRADE, HH_PAL_IDX_BULLET, HH_PAL_IDX_GOZER, HH_PAL_IDX_SLIME, diff --git a/src/engine/types.h b/src/engine/types.h index 5fc80fa..ba41ca7 100644 --- a/src/engine/types.h +++ b/src/engine/types.h @@ -26,9 +26,15 @@ typedef struct { hh_s_ppu_loc_fam_entry fam; //screen uint16_t frame0; uint16_t palette; + uint16_t cooldown; }hh_s_rendering; +typedef struct { + uint8_t* start, len; +}hh_s_animations; + + typedef struct { vec2 pos, vel, size; bool is_grounded; diff --git a/src/game_loop/gameplay.c b/src/game_loop/gameplay.c index 3d750f4..200dfac 100644 --- a/src/game_loop/gameplay.c +++ b/src/game_loop/gameplay.c @@ -10,7 +10,7 @@ void hh_gameplay(hh_g_all_levels* game, hh_e_game_state* hh_game_state){ static hh_entity* bullets; static hh_entity player1={ .hp = 4, - .speed = 6, + .speed = 3, .is_grounded = false, .is_hit = false, .radius = 8, @@ -48,7 +48,8 @@ void hh_gameplay(hh_g_all_levels* game, hh_e_game_state* hh_game_state){ .vertical_flip = false, .palette_index = 2, .tilemap_index = HH_TM_SLIME_OFFSET, - } + }, + .cooldown = 0 } }; static int total_bullets = 15; diff --git a/src/game_loop/shop.c b/src/game_loop/shop.c index ab2a1a0..c8dcfe5 100644 --- a/src/game_loop/shop.c +++ b/src/game_loop/shop.c @@ -4,7 +4,7 @@ #include "game_loop/ui.h" -void hh_shop(hh_e_game_state* hh_game_state, hh_level_entity* level_shop, int current_level){ +hh_e_upgrades hh_shop(hh_e_game_state* hh_game_state, hh_g_all_levels* levels, int rng_seed){ static hh_e_shop_states hh_e_shop = hh_e_shop_show; static hh_e_upgrades upgrades[HH_SHOP_UPG_DISPLAY] = {0}; static uint8_t selected = 0; @@ -17,14 +17,14 @@ void hh_shop(hh_e_game_state* hh_game_state, hh_level_entity* level_shop, int cu // hh_clear_sprite(); // TODO: make function to show shop //hh_setup_shop(); - hh_setup_screen(*level_shop); - hh_shop_init(&upgrades); + hh_setup_screen(levels->shop); + hh_shop_upg_init(&upgrades, rng_seed); selected = HH_SHOP_UPG_DISPLAY/2; hh_shop_display(selected, &upgrades); int idx = 16; // hh_ui_show_char(&idx,"abyz09",(vec2){32,32}); char* c[3]; - itoa(c,current_level); + itoa(c,levels->current_level); hh_ui_show_char(&idx,c,(vec2){304-16-8,0}); hh_e_shop = hh_e_shop_main; @@ -42,6 +42,7 @@ void hh_shop(hh_e_game_state* hh_game_state, hh_level_entity* level_shop, int cu if(g_hh_controller_p1.button_primary){ //apply selected upgrade // hh_e_shop = hh_e_shop_end; + return upgrades[selected]; } if(g_hh_controller_p1.button_secondary){//Quick exit hh_e_shop = hh_e_shop_end; @@ -55,15 +56,21 @@ void hh_shop(hh_e_game_state* hh_game_state, hh_level_entity* level_shop, int cu hh_e_shop = hh_e_shop_show; break; } + return hh_e_NULL; } uint8_t hh_shop_translate_upgrades(hh_e_upgrades upg) { - return upg+10; + return HH_TM_UPGRADES_OFFSET+upg; } -void hh_shop_init(hh_e_upgrades* in) { +void hh_shop_upg_init(hh_e_upgrades* in, int seed) { + srand(seed); for (int i = 0; i < HH_SHOP_UPG_DISPLAY; i++) { - in[i] = i%HH_SHOP_UPG_COUNT; + hh_e_upgrades rng = rand()%(HH_SHOP_UPG_COUNT); + while (rng == in[i-1]){ + rng = rand()%(HH_SHOP_UPG_COUNT); + } + in[i] = rng; } } @@ -77,18 +84,10 @@ void hh_shop_display(uint8_t selected, hh_e_upgrades* upgrades) { (hh_s_ppu_loc_fam_entry){ .horizontal_flip = false, .vertical_flip = false, .position_x = i*space+start.x, .position_y = start.y + (i==selected?-up:0), - .palette_index = 7, + .palette_index = HH_PAL_IDX_UPGRADE, .tilemap_index = hh_shop_translate_upgrades(upgrades[i]) }); } } -void hh_shift_selected(uint8_t *pos, bool dir, uint8_t min, uint8_t max) { - if (dir) { - *pos = MIN(*pos+1,max); - } else { - *pos = MAX(*pos-1,min); - } - // printf("b: %d sel: %d\n",dir, *pos); -} diff --git a/src/game_loop/shop.h b/src/game_loop/shop.h index cce0817..c4f3ced 100644 --- a/src/game_loop/shop.h +++ b/src/game_loop/shop.h @@ -3,6 +3,7 @@ #include "input.h" #include "engine/draw_screen.h" #include "engine/level_const.h" +#include "engine/sprite_controller.h" #include @@ -20,18 +21,18 @@ typedef enum { #define HH_SHOP_UPG_DISPLAY 4 /** @brief all possible upgrades */ typedef enum { - hh_e_upg_jump, - hh_e_upg_speed, - hh_e_upg_damage, + hh_e_NULL = -1, hh_e_upg_heal, hh_e_upg_max_health, + hh_e_upg_jump, + hh_e_upg_damage, + hh_e_upg_max_ammo, + hh_e_upg_speed, } hh_e_upgrades; /** @brief init */ -void hh_shop_init(hh_e_upgrades* in); +void hh_shop_upg_init(hh_e_upgrades* in, int seed); /** @brief deals with displayed entity rendering */ void hh_shop_display(uint8_t selected, hh_e_upgrades* upgrades); -/** @brief moves 'cursor' through selection field */ -void hh_shift_selected(uint8_t* pos, bool dir, uint8_t min, uint8_t max); -void hh_shop(hh_e_game_state* ,hh_level_entity* , int); +hh_e_upgrades hh_shop(hh_e_game_state* ,hh_g_all_levels* , int); diff --git a/src/game_loop/ui.c b/src/game_loop/ui.c index 8980d03..60dbfc2 100644 --- a/src/game_loop/ui.c +++ b/src/game_loop/ui.c @@ -50,3 +50,10 @@ void itoa(char *c, int i) { c[1] = '\0'; } +void hh_shift_selected(uint8_t *pos, bool dir, uint8_t min, uint8_t max) { + if (dir) { + *pos = MIN(*pos+1,max); + } else { + *pos = MAX(*pos-1,min); + } +} diff --git a/src/game_loop/ui.h b/src/game_loop/ui.h index 527cc74..073824e 100644 --- a/src/game_loop/ui.h +++ b/src/game_loop/ui.h @@ -19,3 +19,6 @@ void hh_ui_show_char(int* idx, char* str, vec2 pos); /** @brief converts char* [0] to i and [1]='\0' */ void itoa(char *c, int i); + +/** @brief moves 'cursor' through selection field */ +void hh_shift_selected(uint8_t *pos, bool dir, uint8_t min, uint8_t max); -- cgit v1.2.3