From 03748610041bcc8ec7a7743e9a5fb35c06731fa0 Mon Sep 17 00:00:00 2001 From: UnavailableDev Date: Thu, 6 Apr 2023 17:31:38 +0200 Subject: printing strings coming to YOUR screen! --- .vscode/settings.json | 6 ++++- src/demo.c | 2 +- src/engine/animator.c | 1 - src/game_loop/shop.c | 7 +++-- src/game_loop/shop.h | 2 +- src/game_loop/ui.c | 9 +++++-- src/game_loop/ui.h | 2 ++ src/static/.gitignore | 1 + src/static/dynamic.tsx | 71 +++++++++++++++++++++++++++++++++++++++++++++++--- 9 files changed, 89 insertions(+), 12 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d027762..55d7b04 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,5 +8,9 @@ } }, "cmake.configureOnOpen": false, - "files.eol": "\n" + "files.eol": "\n", + "files.associations": { + "entity.h": "c", + "shop.h": "c" + } } diff --git a/src/demo.c b/src/demo.c index 20f8381..c8e3c0e 100644 --- a/src/demo.c +++ b/src/demo.c @@ -59,7 +59,7 @@ void hh_demo_loop(unsigned long frame) { } break; case hh_e_state_shop: - hh_shop(&hh_game_states, &hh_game.shop); + hh_shop(&hh_game_states, &hh_game.shop, hh_game.current_level); 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 71d0582..0811ba7 100644 --- a/src/engine/animator.c +++ b/src/engine/animator.c @@ -45,5 +45,4 @@ void hh_show_quad(uint16_t *idx, hh_s_rendering* in) { temp.position_y = CLAMP(in->fam.position_y, -16, HH_PPU_SCREEN_HEIGHT); temp.position_x = CLAMP(in->fam.position_x, -16, HH_PPU_SCREEN_WIDTH); hh_ppu_update_foreground(++*idx, temp); - temp.tilemap_index++; } diff --git a/src/game_loop/shop.c b/src/game_loop/shop.c index 60fc70b..ab2a1a0 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){ +void hh_shop(hh_e_game_state* hh_game_state, hh_level_entity* level_shop, int current_level){ 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; @@ -22,7 +22,10 @@ void hh_shop(hh_e_game_state* hh_game_state, hh_level_entity* level_shop){ selected = HH_SHOP_UPG_DISPLAY/2; hh_shop_display(selected, &upgrades); int idx = 16; - hh_ui_show_char(&idx,"aBYz09",(vec2){32,32}); + // hh_ui_show_char(&idx,"abyz09",(vec2){32,32}); + char* c[3]; + itoa(c,current_level); + hh_ui_show_char(&idx,c,(vec2){304-16-8,0}); hh_e_shop = hh_e_shop_main; break; diff --git a/src/game_loop/shop.h b/src/game_loop/shop.h index 6f8f5a7..cce0817 100644 --- a/src/game_loop/shop.h +++ b/src/game_loop/shop.h @@ -34,4 +34,4 @@ 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* ); +void hh_shop(hh_e_game_state* ,hh_level_entity* , int); diff --git a/src/game_loop/ui.c b/src/game_loop/ui.c index 3354d43..8980d03 100644 --- a/src/game_loop/ui.c +++ b/src/game_loop/ui.c @@ -16,7 +16,6 @@ void hh_ui_show_hp(int* idx, hh_entity* player, uint8_t max_hp, vec_cor cam_pos) }); } } - void hh_ui_show_char(int* idx, char* str, vec2 pos) { int i = 0; int tilemap_idx, @@ -38,10 +37,16 @@ void hh_ui_show_char(int* idx, char* str, vec2 pos) { .horizontal_flip = false, .vertical_flip = false, .palette_index = palette_idx, .tilemap_index = tilemap_idx, - .position_x = 8 + i*15, .position_y = 8 + .position_x = pos.x + i*15, .position_y = pos.y } }); i++; } } + +void itoa(char *c, int i) { + c[0] = i + '0'; + c[1] = '\0'; +} + diff --git a/src/game_loop/ui.h b/src/game_loop/ui.h index 7a8ffbd..527cc74 100644 --- a/src/game_loop/ui.h +++ b/src/game_loop/ui.h @@ -17,3 +17,5 @@ void hh_ui_show_hp(int* idx, hh_entity* player, uint8_t max_hp, vec_cor cam_pos) 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); diff --git a/src/static/.gitignore b/src/static/.gitignore index e960c6e..4d628f9 100644 --- a/src/static/.gitignore +++ b/src/static/.gitignore @@ -7,3 +7,4 @@ tiled.mk *.csv *.out *.tiled-session +*.tmx diff --git a/src/static/dynamic.tsx b/src/static/dynamic.tsx index 742083f..fde4347 100644 --- a/src/static/dynamic.tsx +++ b/src/static/dynamic.tsx @@ -1,6 +1,9 @@ - + + + + @@ -103,9 +106,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -130,6 +175,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -322,7 +388,4 @@ - - - -- cgit v1.2.3 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