aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUnavailableDev <69792062+UnavailableDev@users.noreply.github.com>2023-04-03 09:52:40 +0200
committerGitHub <noreply@github.com>2023-04-03 09:52:40 +0200
commit0a014f39c375c0cf28de70ebaab6cb0a5266f3c2 (patch)
tree4ee2404a1e796e8803035dd9285debcfdcb7bbea
parentd32a4942c7e16af5daf71a769906b17cb44de8e1 (diff)
parentcc23564547b736125fe7e7869de277ea4d4455ab (diff)
Merge branch 'lonkaars:dev' into dev
-rw-r--r--src/GameLoop/shop.c30
-rw-r--r--src/GameLoop/shop.h16
-rw-r--r--src/GameLoop/startingScreen.c32
-rw-r--r--src/GameLoop/startingScreen.h14
-rw-r--r--src/demo.c76
-rw-r--r--src/engine/bullet.c65
-rw-r--r--src/engine/bullet.h17
-rw-r--r--src/engine/camera.c7
-rw-r--r--src/engine/draw_screen.c138
-rw-r--r--src/engine/draw_screen.h22
-rw-r--r--src/engine/level_const.c37
-rw-r--r--src/engine/level_const.h31
-rw-r--r--src/game_loop/game_over.c28
-rw-r--r--src/game_loop/game_over.h18
-rw-r--r--src/game_loop/gameplay.c47
-rw-r--r--src/game_loop/gameplay.h17
-rw-r--r--src/game_loop/shop.c30
-rw-r--r--src/game_loop/shop.h18
-rw-r--r--src/game_loop/starting_screen.c32
-rw-r--r--src/game_loop/starting_screen.h14
-rw-r--r--src/makefile7
21 files changed, 449 insertions, 247 deletions
diff --git a/src/GameLoop/shop.c b/src/GameLoop/shop.c
deleted file mode 100644
index eb6bed5..0000000
--- a/src/GameLoop/shop.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include "shop.h"
-
-
-bool hh_show_Shop(){
- static hh_e_ShopStates hh_e_Shop = hh_e_STATE_SHOW;
-
- switch (hh_e_Shop)
- {
- case hh_e_STATE_SHOW:
- //hh_clear_screen();
-
- //hh_setup_shop();
- hh_e_Shop = hh_e_STATE_Input;
- return false;
- break;
- case hh_e_STATE_Input:
- if(g_hh_controller_p1.button_primary){
- hh_e_Shop = hh_e_STATE_END;
- }
- break;
- case hh_e_STATE_END:
- hh_e_Shop = hh_e_STATE_SHOW;
- return true;
- break;
- default:
- hh_e_Shop = hh_e_STATE_SHOW;
- break;
- }
- return false;
-}
diff --git a/src/GameLoop/shop.h b/src/GameLoop/shop.h
deleted file mode 100644
index 4014f58..0000000
--- a/src/GameLoop/shop.h
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "input.h"
-#include "engine/draw_screen.h"
-
-
-
-#include <stdint.h>
-#include <stdbool.h>
-
-typedef enum {
- hh_e_STATE_SHOW,
- hh_e_STATE_Input,
- hh_e_STATE_END
-} hh_e_ShopStates;
-
-
-bool hh_show_Shop();
diff --git a/src/GameLoop/startingScreen.c b/src/GameLoop/startingScreen.c
deleted file mode 100644
index 4fc5af9..0000000
--- a/src/GameLoop/startingScreen.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include "startingScreen.h"
-#include "input.h"
-#include "engine/title_screen.h"
-#include "engine/draw_screen.h"
-// #include "engine/player_controller.h"
-
-bool hh_show_startingScreen(){
- static hh_e_screenStates hh_e_startingScreen = hh_e_STATE_SHOW;
-
- switch (hh_e_startingScreen)
- {
- case hh_e_STATE_SHOW:
- hh_clear_screen();
- hh_init_title_screen();
- hh_e_startingScreen = hh_e_STATE_Input;
- return false;
- break;
- case hh_e_STATE_Input:
- if(g_hh_controller_p1.button_primary){
- hh_e_startingScreen = hh_e_STATE_END;
- }
- break;
- case hh_e_STATE_END:
- hh_e_startingScreen = hh_e_STATE_SHOW;
- return true;
- break;
- default:
- hh_e_startingScreen = hh_e_STATE_SHOW;
- break;
- }
- return false;
-}
diff --git a/src/GameLoop/startingScreen.h b/src/GameLoop/startingScreen.h
deleted file mode 100644
index f51cc66..0000000
--- a/src/GameLoop/startingScreen.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#pragma once
-
-#include <stdint.h>
-#include <stdbool.h>
-
-typedef enum {
- hh_e_STATE_SHOW,
- hh_e_STATE_Input,
- hh_e_STATE_END
-} hh_e_screenStates;
-
-
-bool hh_show_startingScreen();
-
diff --git a/src/demo.c b/src/demo.c
index 22ee8b7..4fa1be2 100644
--- a/src/demo.c
+++ b/src/demo.c
@@ -11,19 +11,14 @@
#include "engine/draw_screen.h"
#include "engine/player_controller.h"
#include "engine/sprite_controller.h"
-#include "GameLoop/startingScreen.h"
+#include "engine/level_const.h"
-
-typedef enum {
- hh_e_STATE_startingScreen,
- hh_e_STATE_Shop,
- hh_e_STATE_Gameplay,
- hh_e_STATE_GameOver,
- hh_e_STATE_HighScore
-} hh_e_GameState;
-hh_e_GameState hh_gameStates;
+#include "game_loop/starting_screen.h"
+#include "game_loop/gameplay.h"
+#include "game_loop/shop.h"
+hh_g_all_levels hh_game;
uint16_t g_hh_pos_x = 1000; // 0b0000 0001 0011 0110
uint16_t g_hh_pos_y;
@@ -43,69 +38,56 @@ typedef struct {
}hh_s_tiles;
-hh_entity hh_g_player, hh_g_player_new;
+hh_e_game_state hh_game_states;
+ hh_entity hh_g_player, hh_g_player_new;
void hh_demo_setup() {
hh_setup_palettes();
- // hh_setup_screen();
-
-
+ hh_game = hh_init_game_levels();
}
void hh_demo_loop(unsigned long frame) {
- switch (hh_gameStates)
+ switch (hh_game_states)
{
- case hh_e_STATE_startingScreen:
- bool ret = hh_show_startingScreen();
+ case hh_e_state_starting_screen:
+ bool ret = hh_show_starting_screen();
if(ret){
- hh_gameStates = hh_e_STATE_Shop;
+ hh_game_states = hh_e_state_shop;
}
break;
- case hh_e_STATE_Shop:
- // TODO:
- // if(hh_show_Shop()){
- hh_clear_screen();
- hh_clear_sprite();
- hh_setup_screen();
- hh_clear_sprite();
- hh_gameStates = hh_e_STATE_Gameplay;
- // }
- // function: new level is chosen goto level
+ case hh_e_state_shop:
+ hh_shop(&hh_game_states);
break;
- case hh_e_STATE_Gameplay:
- hh_player_actions();
-
- // TODO:
- // function: if level complete goto shop
- // function: if player is dead goto game over
+ case hh_e_state_gameplay:
+ hh_gameplay(hh_game, &hh_game_states);
break;
- case hh_e_STATE_GameOver:
- // TODO:
+ case hh_e_state_game_over:
+ // todo:
// function: show game over screen
// function: after time goto high score
break;
- case hh_e_STATE_HighScore:
- // TODO:
+ case hh_e_state_high_score:
+ // todo:
// fucntion: show all previously scored points
// function: button pressed goto starting screen
break;
default:
- hh_gameStates = hh_e_STATE_startingScreen;
+ hh_game_states = hh_e_state_starting_screen;
break;
}
}
-// void sendData(uint8_t address, uint16_t data) {
-// uint8_t bitData[3];
-// bitData[2] = data & 0xff;
-// bitData[1] = (data >> 8);
-// bitData[0] = address; // first byte is address
+// void send_data(uint8_t address, uint16_t data) {
+// uint8_t bit_data[3];
+// bit_data[2] = data & 0xff;
+// bit_data[1] = (data >> 8);
+// bit_data[0] = address; // first byte is address
//
-// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
-// HAL_SPI_Transmit(&hspi1, bitData, 3, 100); //2*8 bit data
-// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
+// hal_gpio_write_pin(gpioa, gpio_pin_9, gpio_pin_reset);
+// hal_spi_transmit(&hspi1, bit_data, 3, 100); //2*8 bit data
+// hal_gpio_write_pin(gpioa, gpio_pin_9, gpio_pin_set);
// }
diff --git a/src/engine/bullet.c b/src/engine/bullet.c
index 5aa9e51..e6ca6df 100644
--- a/src/engine/bullet.c
+++ b/src/engine/bullet.c
@@ -1,44 +1,35 @@
#include "bullet.h"
-#include "engine/sprite_controller.h"
-void shootBullet(vec2 playerPos, Bullet* bullet){
- // Set bullet's x and y coordinates to player's coordinates
- bullet->x = playerPos.x;
- bullet->y = playerPos.y;
- // Set bullet's velocity to a fixed value
- bullet->velocity = 1;
- // Set bullet's status to active
- bullet->isActive = true;
-}
-void updateBullet(Bullet* bullet, int deltaTime){
- // Only update bullet if it is active
- static int latestLocationBullet = 0;
- if (bullet->isActive) {
- // Move bullet based on velocity and deltaTime
- bullet->x += bullet->velocity * deltaTime;
- drawBullet(bullet);
- // Check if bullet has moved 16 pixels
- if (bullet->x - latestLocationBullet > 32) {
- // Set bullet's status to inactive
- bullet->isActive = false;
- drawBullet(&(Bullet){.x = -16,.y = -16. });
- }
- }
- else{
- latestLocationBullet = bullet->x;
- }
+
+// TODO: use hh_entity as bullet struct
+void hh_shoot_bullet(vec2 player, vec_cor cam_pos, hh_entity* bullet){
+ vec2 temp;
+ if(g_hh_controller_p1.button_secondary){
+ if(bullet->is_grounded){
+ bullet->is_grounded=false;
+ bullet->pos = player;
+ }
+ }
+ else{
+ if(!bullet->is_grounded){
+ hh_update_bullet(bullet , cam_pos);
+ hh_draw_bullet(*bullet);
+ }
+ }
+
+
}
-void drawBullet(Bullet* bullet){
+void hh_update_bullet(hh_entity* bullet, vec_cor cam_pos){
+ bullet->pos.x += 1;
- hh_ppu_update_foreground(10, (hh_s_ppu_loc_fam_entry)
- {
- .position_x = bullet->x,
- .position_y = bullet->y,
- .horizontal_flip = false,
- .vertical_flip = false,
- .palette_index = 7,
- .tilemap_index = 84, // change tilemap to the correct foreground index;
- });
+ // update bullet sprite on ppu
+ bullet->render.fam.position_x = (bullet->pos.x-cam_pos.x);
+ bullet->render.fam.position_y = (bullet->pos.y-cam_pos.y);
+
+}
+void hh_draw_bullet(hh_entity bullet){
+ hh_s_ppu_loc_fam_entry temp = bullet.render.fam;
+ hh_ppu_update_foreground(10,temp);
}
diff --git a/src/engine/bullet.h b/src/engine/bullet.h
index ad67d84..5f07b2e 100644
--- a/src/engine/bullet.h
+++ b/src/engine/bullet.h
@@ -1,16 +1,11 @@
#pragma once
#include "player_controller.h"
+#include "engine/sprite_controller.h"
+#include "input.h"
-typedef struct {
- int x;
- int y;
- int velocity;
- int isActive;
- int hit;
-} Bullet;
+void hh_shoot_bullet(vec2 playerPos, vec_cor cam_pos, hh_entity*);
-//Bullet* createBullet(float x, float y, float velocity, float direction);
-void shootBullet(vec2 playerPos, Bullet* bullet);
-void updateBullet(Bullet* bullet, int deltaTime);
-void drawBullet(Bullet* bullet);
+void hh_update_bullet(hh_entity* , vec_cor );
+
+void hh_draw_bullet(hh_entity);
diff --git a/src/engine/camera.c b/src/engine/camera.c
index 2c3e517..6898430 100644
--- a/src/engine/camera.c
+++ b/src/engine/camera.c
@@ -4,12 +4,13 @@
vec_cor hh_update_camera(vec_cen new, vec2 min, vec2 max){
-
//TODO: change floating point math to fix point math
//TODO: remove magic number at y camera offset
// new = vec_cen2cor(new,(vec2){.x=max.x/2,.y=max.y/2});
- new = vec_cen2cor((vec2){.x=new.x+(HH_PPU_SPRITE_WIDTH),.y=new.y+(HH_PPU_SPRITE_HEIGHT*8)},(vec2){.x=max.x/2,.y=max.y/2});
+ new = vec_cen2cor((vec2){.x=new.x+(HH_PPU_SPRITE_WIDTH),.y=new.y+(HH_PPU_SPRITE_HEIGHT*8)},(vec2){.x=(max.x - min.x)/2,.y=(max.y - min.y)/2});
+ // new = vec_cen2cor((vec2){.x=new.x+(HH_PPU_SPRITE_WIDTH),.y=new.y+(HH_PPU_SPRITE_HEIGHT*8)},(vec2){.x=max.x/2,.y=max.y/2});
+
// new.x = new.x << HH_MATH_FIXED_POINT;
// new.y = new.y << HH_MATH_FIXED_POINT;
static vec_cor old;
@@ -30,6 +31,8 @@ vec_cor hh_update_camera(vec_cen new, vec2 min, vec2 max){
old.x = CLAMP(new.x,min.x,max.x);
old.y = CLAMP(new.y,min.y,max.y);
+ //printf("camera new %d min %d max %d\n",new.y,min.y,max.y);
return old;
}
+
diff --git a/src/engine/draw_screen.c b/src/engine/draw_screen.c
index 0c31bf6..d1d7a04 100644
--- a/src/engine/draw_screen.c
+++ b/src/engine/draw_screen.c
@@ -1,66 +1,106 @@
#include "engine/draw_screen.h"
-#include "engine/sprite_controller.h"
+hh_level_entity level;
+uint64_t offsetY=0;
+uint64_t offsetX=0;
uint8_t hh_world_to_tile(vec2 pos){
- //TODO: remove magic file name here
- FILE* level = fopen("static/level1_test.bin", "rb"); /* open binary file */
- if (!level) { /* check if file opened successfully */
- fprintf(stderr, "Error: Failed to open file.\n");
- return 0;
- }
- int index = ((pos.y/16)*40 + pos.x/16);//TODO: remove magic number(s)
- fseek(level, (index * sizeof(int)) + sizeof(int), SEEK_SET);
- int tile;// = (int*)malloc(sizeof(int));
- fread(&tile, sizeof(int), 1, level); // read 1 tile from binary
-
- fclose(level);
- // int val = tile;
- // free(tile);
+
+ int index = (((pos.y/HH_PPU_SPRITE_HEIGHT)*level.size.x) + (pos.x/HH_PPU_SPRITE_WIDTH));//TODO: remove magic number(s)
+ int tile= level.place[index];
return tile;
}
+void hh_update_screen(vec2 view, vec2 player){
+ int current_tile_y = view.y / HH_PPU_SPRITE_HEIGHT;
+ int current_tile_x = view.x / HH_PPU_SPRITE_WIDTH;
+ int offset_py = view.y - (offsetY / 40 * HH_PPU_SPRITE_HEIGHT);
+ int offset_px = view.x - offsetX * HH_PPU_SPRITE_WIDTH;
+ static int prev_ofsset = 0;
-// remeber old value to know which part to update.
-vec2 previousViewport = { .x = 0, .y = 0 };
-void hh_draw_screen(vec_cor viewport){
- if (viewport.x == previousViewport.x && viewport.y == previousViewport.y) return;
-
- hh_ppu_update_aux((hh_s_ppu_loc_aux){
- .bg_shift_x = viewport.x,
- .bg_shift_y = viewport.y,
- .fg_fetch = 0,
- .sysreset = 0,
- });
-
- // update previous viewport values
- previousViewport = viewport;
-}
+ int size = MIN(HH_PPU_BG_CANVAS_TILES_H,level.size.x) * MIN(HH_PPU_BG_CANVAS_TILES_V,level.size.y);
+ if( (offset_py == 0 || offset_py > 230) && level.size.y > level.size.x && prev_ofsset != offset_py){
+ if(offset_py==0){
+ offsetY = (current_tile_y-14) * level.size.x;
+ }
+ else{
+ offsetY = current_tile_y * level.size.x;
+ }
-void hh_setup_screen(){
- //(HH_map_size_X*HH_map_size_Y)
- int size = 2400; // max X = 40 en max Y = 80
- //TODO: remove magic file name here
- FILE* level = fopen("static/level1_test.bin", "rb"); /* open binary file */
- if (!level) { /* check if file opened successfully */
- fprintf(stderr, "Error: Failed to open level file.\n");
- return;
+ // Update the background screen
+ for (int BAM_index = 0; BAM_index < size; BAM_index++) {
+ hh_ppu_update_background(BAM_index, (hh_s_ppu_loc_bam_entry){
+ .horizontal_flip = false,
+ .vertical_flip = false,
+ .palette_index = hh_get_palette(level.place[offsetY + BAM_index]),
+ .tilemap_index = level.place[offsetY + BAM_index],
+ });
+ }
+ prev_ofsset = offset_py;
+ }
+ else if ((offset_px == 0 || offset_px > 310) && level.size.x > level.size.y && prev_ofsset != offset_px)
+ {
+ if(offset_px==0){
+ offsetX = current_tile_x - 14;
+ }
+ else{
+ offsetX = current_tile_x;
+ }
+ // Update the background screen
+ for (int BAM_index = 0; BAM_index < size; BAM_index++) {
+ int var = (BAM_index / HH_PPU_BG_CANVAS_TILES_H) * level.size.x + MIN((BAM_index % HH_PPU_BG_CANVAS_TILES_H + offsetX),level.size.x);
+ hh_ppu_update_background(BAM_index, (hh_s_ppu_loc_bam_entry){
+ .horizontal_flip = false,
+ .vertical_flip = false,
+ .palette_index = hh_get_palette(level.place[var]),
+ .tilemap_index = level.place[var],
+ });
+ }
}
- fseek(level, (0* sizeof(int)) + sizeof(int), SEEK_SET);
- int* tile = (int*)malloc(size*sizeof(int));
- fread(tile, sizeof(int), size, level); // read 1 tile from binary
-
- fclose(level);
- for(int BAM_index = 0; BAM_index < size; BAM_index++){
+ prev_ofsset = offset_px;
+
+}
+void hh_setup_screen(hh_level_entity currentlevel){
+ hh_clear_screen();
+ hh_clear_sprite();
+ level = currentlevel;
+ offsetY=0;
+ offsetX=0;
+ int size = MIN(HH_PPU_BG_CANVAS_TILES_H, level.size.x) * MIN(HH_PPU_BG_CANVAS_TILES_V, level.size.y);
+ for (int BAM_index = 0; BAM_index < size; BAM_index++) {
+ int var = (BAM_index / HH_PPU_BG_CANVAS_TILES_H) * level.size.x + BAM_index % HH_PPU_BG_CANVAS_TILES_H;
hh_ppu_update_background(BAM_index, (hh_s_ppu_loc_bam_entry){
.horizontal_flip = false,
.vertical_flip = false,
- .palette_index = hh_get_palette(tile[BAM_index]),
- .tilemap_index = tile[BAM_index],
+ .palette_index = hh_get_palette(currentlevel.place[var]),
+ .tilemap_index = currentlevel.place[var],
+ });
+ }
+}
+vec_cor hh_draw_screen(vec2 player) {
+ static vec_cor previousViewport = {0, 0};
+ int offset_py = offsetY / 40 * HH_PPU_SPRITE_HEIGHT;
+
+ int offset_px = (offsetX * HH_PPU_SPRITE_WIDTH) ;
+ vec_cor viewport = hh_update_camera(player,(vec2){.x = offset_px, .y = offset_py},(vec2){.x = HH_PPU_SCREEN_WIDTH + offset_px, .y = 480 + offset_py});//TODO: remove magic number(s)
+ viewport.x = CLAMP(viewport.x, 0, level.size.x * HH_PPU_SPRITE_WIDTH - HH_PPU_SCREEN_WIDTH);
+ viewport.y = CLAMP(viewport.y, 0, level.size.y * HH_PPU_SPRITE_HEIGHT - HH_PPU_SCREEN_HEIGHT);
+
+ hh_update_screen((vec2){.y=viewport.y,.x=viewport.x},player);
+ if (viewport.x == previousViewport.x && viewport.y == previousViewport.y){}
+ else{
+ hh_ppu_update_aux((hh_s_ppu_loc_aux){
+ .bg_shift_x = viewport.x - offset_px,
+ .bg_shift_y = viewport.y - offset_py,
+ .fg_fetch = 0,
+ .sysreset = 0,
});
+ previousViewport = viewport;
}
- free(tile);
+
+ return viewport;
}
+
void hh_clear_screen(){
// (HH_PPU_SCREEN_HEIGHT*HH_PPU_SCREEN_WIDTH)/(HH_PPU_SPRITE_HEIGHT*HH_PPU_SPRITE_WIDTH)
for (int i = 0; i < HH_PPU_BG_CANVAS_TILES_H*HH_PPU_BG_CANVAS_TILES_V; i++) {
@@ -82,8 +122,8 @@ void hh_clear_screen(){
void hh_clear_sprite(){
for (int i = 0; i < HH_PPU_FG_SPRITE_COUNT; i++) {
hh_ppu_update_foreground(i,(hh_s_ppu_loc_fam_entry){
- .position_x = -16,
- .position_y = -16,
+ .position_x = -HH_PPU_SPRITE_WIDTH,
+ .position_y = -HH_PPU_SPRITE_HEIGHT,
});
}
}
diff --git a/src/engine/draw_screen.h b/src/engine/draw_screen.h
index 95765e5..9130842 100644
--- a/src/engine/draw_screen.h
+++ b/src/engine/draw_screen.h
@@ -3,24 +3,32 @@
// every function call for drawing the screen goes here.
#include "engine/maths.h"
-#include "ppu/consts.h"
#include "ppu/ppu.h"
-
+#include "engine/level_const.h"
+#include "engine/sprite_controller.h"
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
+#include "engine/camera.h"
-
-#define HH_map_size_X 80
-#define HH_map_size_Y 60
+#define hh_max_x_size 40
+#define hh_max_y_size 30
/** @brief return a single tile from world binary */
uint8_t hh_world_to_tile(vec2 pos);
+
/** @brief shift to level if viewport changed position */
-void hh_draw_screen(vec2 viewport);
+vec_cor hh_draw_screen(vec2 player);
+
/** @brief send data to BAM memory from binary level */
-void hh_setup_screen();
+void hh_setup_screen(hh_level_entity currentlevel);
+/** @brief updates screen based on view and maybe player position if it needs to turn back*/
+void hh_update_screen(vec2 view, vec2 );
+
/** @brief send black screen to background memory */
void hh_clear_screen();
+
/** @brief clears all sprite data */
void hh_clear_sprite();
+/** @brief send data to BAM memory from binary from shop */
+void hh_setup_Shop();
diff --git a/src/engine/level_const.c b/src/engine/level_const.c
new file mode 100644
index 0000000..5ba0187
--- /dev/null
+++ b/src/engine/level_const.c
@@ -0,0 +1,37 @@
+#include "engine/level_const.h"
+
+
+hh_g_all_levels hh_init_game_levels(){
+ hh_g_all_levels levels;
+ levels.current_level=0;
+
+ levels.level[0].size.x=40;
+ levels.level[0].size.y=100;
+ levels.level[0].hh_level_completed=false;
+
+ levels.level[1].size.x=100;
+ levels.level[1].size.y=28;
+ levels.level[1].hh_level_completed=false;
+
+ FILE *fp = fopen("../test/bin/level1_test.bin", "rb");
+ fseek(fp, 0, SEEK_END);
+ int size = ftell(fp) / sizeof(int);
+ fseek(fp, (0 * sizeof(int)) + sizeof(int), SEEK_SET);
+ int* hh_game_level1 = malloc(size * sizeof(int));
+ fread(hh_game_level1, sizeof(int), size, fp);
+ fclose(fp);
+
+ FILE *lvl2 = fopen("../test/bin/level2_test.bin", "rb");
+ fseek(lvl2, 0, SEEK_END);
+ size = ftell(lvl2) / sizeof(int);
+ fseek(lvl2, (0 * sizeof(int)) + sizeof(int), SEEK_SET);
+ int* hh_game_level2 = malloc(size * sizeof(int));
+ fread(hh_game_level2, sizeof(int), size, lvl2);
+ fclose(lvl2);
+
+ levels.level[0].place = hh_game_level1;
+ levels.level[1].place = hh_game_level2;
+
+ return levels;
+}
+
diff --git a/src/engine/level_const.h b/src/engine/level_const.h
new file mode 100644
index 0000000..b86ae7b
--- /dev/null
+++ b/src/engine/level_const.h
@@ -0,0 +1,31 @@
+#pragma once
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include "engine/maths.h"
+#include "engine/entity.h"
+
+typedef enum {
+ hh_e_state_starting_screen,
+ hh_e_state_shop,
+ hh_e_state_gameplay,
+ hh_e_state_game_over,
+ hh_e_state_high_score
+} hh_e_game_state;
+//entity array met enemeies
+typedef struct {
+ vec2 size;
+ int hh_total_enemies;
+ int* place;
+ bool hh_level_completed;
+}hh_level_entity;
+
+typedef struct {
+ hh_level_entity level[2];
+ int current_level;
+
+
+}hh_g_all_levels;
+
+hh_g_all_levels hh_init_game_levels();
diff --git a/src/game_loop/game_over.c b/src/game_loop/game_over.c
new file mode 100644
index 0000000..f5b70cf
--- /dev/null
+++ b/src/game_loop/game_over.c
@@ -0,0 +1,28 @@
+#include "game_over.h"
+
+
+void hh_game_over(hh_e_game_state* hh_game_state){
+ static hh_e_game_over hh_e_states_game_over = hh_e_game_over_show;
+
+ switch (hh_e_states_game_over)
+ {
+ case hh_e_game_over_show:
+ hh_clear_screen();
+ hh_clear_sprite();
+ // todo: make function to show game over
+ hh_e_states_game_over = hh_e_game_over_input;
+ break;
+ case hh_e_game_over_input:
+ if(g_hh_controller_p1.button_primary){
+ hh_e_states_game_over = hh_e_game_over_end;
+ }
+ break;
+ case hh_e_game_over_end:
+ hh_e_states_game_over = hh_e_game_over_show;
+ *hh_game_state = hh_e_state_game_over;
+ break;
+ default:
+ hh_e_states_game_over = hh_e_game_over_show;
+ break;
+ }
+}
diff --git a/src/game_loop/game_over.h b/src/game_loop/game_over.h
new file mode 100644
index 0000000..80db667
--- /dev/null
+++ b/src/game_loop/game_over.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "input.h"
+#include "engine/draw_screen.h"
+#include "engine/level_const.h"
+
+
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef enum {
+ hh_e_game_over_show,
+ hh_e_game_over_input,
+ hh_e_game_over_end,
+} hh_e_game_over;
+
+
+void hh_game_over(hh_e_game_state*);
diff --git a/src/game_loop/gameplay.c b/src/game_loop/gameplay.c
new file mode 100644
index 0000000..295eb5d
--- /dev/null
+++ b/src/game_loop/gameplay.c
@@ -0,0 +1,47 @@
+#include "gameplay.h"
+
+// player struct
+
+
+void hh_gameplay(hh_g_all_levels game, hh_e_game_state* hh_game_state){
+ static hh_e_gameplay gameplay = hh_e_setup_screen;
+
+ switch (gameplay)
+ {
+ case hh_e_setup_screen:
+ hh_setup_screen(game.level[game.current_level]);
+ gameplay = hh_e_play_level;
+ break;
+ case hh_e_play_level:
+ // todo: here come all the different functions for the gameplay
+ hh_player_actions();
+
+
+
+
+
+ if(game.level[game.current_level].hh_level_completed){
+ gameplay = hh_e_level_complete;
+ }
+ break;
+ case hh_e_level_complete:
+ if(game.current_level < 3){
+ game.current_level++;
+ gameplay = hh_e_setup_screen;
+ }
+ else {
+ gameplay = hh_e_game_over;
+ }
+ break;
+ case hh_e_game_over:
+ // todo make reset levels
+ hh_reset_levels();
+ gameplay = hh_e_setup_screen;
+ *hh_game_state = hh_e_state_game_over;
+ break;
+ default:
+ break;
+ }
+
+}
+void hh_reset_levels(){}
diff --git a/src/game_loop/gameplay.h b/src/game_loop/gameplay.h
new file mode 100644
index 0000000..d309e78
--- /dev/null
+++ b/src/game_loop/gameplay.h
@@ -0,0 +1,17 @@
+#pragma once
+#include "engine/draw_screen.h"
+#include "engine/player_controller.h"
+#include "engine/sprite_controller.h"
+#include "game_loop/starting_screen.h"
+#include "engine/level_const.h"
+
+typedef enum {
+ hh_e_setup_screen,
+ hh_e_play_level,
+ hh_e_level_complete,
+ hh_e_game_over,
+}hh_e_gameplay;
+
+void hh_reset_levels();
+void hh_gameplay(hh_g_all_levels, hh_e_game_state*);
+
diff --git a/src/game_loop/shop.c b/src/game_loop/shop.c
new file mode 100644
index 0000000..b3d2234
--- /dev/null
+++ b/src/game_loop/shop.c
@@ -0,0 +1,30 @@
+#include "shop.h"
+
+
+void hh_shop(hh_e_game_state* hh_game_state){
+ static hh_e_shop_states hh_e_shop = hh_e_shop_show;
+
+ switch (hh_e_shop)
+ {
+ case hh_e_shop_show:
+ hh_clear_screen();
+ hh_clear_sprite();
+ // todo: make function to show shop
+ //hh_setup_shop();
+ hh_e_shop = hh_e_shop_input;
+ break;
+ case hh_e_shop_input:
+ // todo: make it so that you can choose between shop
+ if(g_hh_controller_p1.button_primary){
+ hh_e_shop = hh_e_shop_end;
+ }
+ break;
+ case hh_e_shop_end:
+ hh_e_shop = hh_e_shop_show;
+ *hh_game_state = hh_e_state_gameplay;
+ break;
+ default:
+ hh_e_shop = hh_e_shop_show;
+ break;
+ }
+}
diff --git a/src/game_loop/shop.h b/src/game_loop/shop.h
new file mode 100644
index 0000000..7d01b7e
--- /dev/null
+++ b/src/game_loop/shop.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "input.h"
+#include "engine/draw_screen.h"
+#include "engine/level_const.h"
+
+
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef enum {
+ hh_e_shop_show,
+ hh_e_shop_input,
+ hh_e_shop_end,
+} hh_e_shop_states;
+
+
+void hh_shop(hh_e_game_state*);
diff --git a/src/game_loop/starting_screen.c b/src/game_loop/starting_screen.c
new file mode 100644
index 0000000..6ab0278
--- /dev/null
+++ b/src/game_loop/starting_screen.c
@@ -0,0 +1,32 @@
+#include "starting_screen.h""
+#include "input.h"
+#include "engine/title_screen.h"
+#include "engine/draw_screen.h"
+// #include "engine/player_controller.h"
+
+bool hh_show_starting_screen(){
+ static hh_e_screen_states hh_e_starting_screen = hh_e_state_show;
+
+ switch (hh_e_starting_screen)
+ {
+ case hh_e_state_show:
+ hh_clear_screen();
+ hh_init_title_screen();
+ hh_e_starting_screen = hh_e_state_input;
+ return false;
+ break;
+ case hh_e_state_input:
+ if(g_hh_controller_p1.button_primary){
+ hh_e_starting_screen = hh_e_state_end;
+ }
+ break;
+ case hh_e_state_end:
+ hh_e_starting_screen = hh_e_state_show;
+ return true;
+ break;
+ default:
+ hh_e_starting_screen = hh_e_state_show;
+ break;
+ }
+ return false;
+}
diff --git a/src/game_loop/starting_screen.h b/src/game_loop/starting_screen.h
new file mode 100644
index 0000000..4228f38
--- /dev/null
+++ b/src/game_loop/starting_screen.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+
+typedef enum {
+ hh_e_state_show,
+ hh_e_state_input,
+ hh_e_state_end
+} hh_e_screen_states;
+
+
+bool hh_show_starting_screen();
+
diff --git a/src/makefile b/src/makefile
index cd248e2..4dc84e6 100644
--- a/src/makefile
+++ b/src/makefile
@@ -40,8 +40,11 @@ LOCAL_SRCS += main.c \
engine/entity.c \
engine/bullet.c \
engine/title_screen.c \
- GameLoop/shop.c \
- GameLoop/startingScreen.c
+ engine/level_const.c \
+ game_loop/shop.c \
+ game_loop/gameplay.c \
+ game_loop/game_over.c \
+ game_loop/starting_screen.c
CFLAGS += $(SHARED_FLAGS)
LFLAGS += $(SHARED_FLAGS)