aboutsummaryrefslogtreecommitdiff
path: root/src/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/TODO/entity.c41
-rw-r--r--src/engine/TODO/player_controller.h4
-rw-r--r--src/engine/TODO/sprite_controller.h6
-rw-r--r--src/engine/camera.c34
-rw-r--r--src/engine/camera.h6
-rw-r--r--src/engine/draw_screen.c27
-rw-r--r--src/engine/draw_screen.h2
-rw-r--r--src/engine/engine.c1
-rw-r--r--src/engine/entity.c46
-rw-r--r--src/engine/entity.h (renamed from src/engine/TODO/entity.h)8
-rw-r--r--src/engine/maths.c19
-rw-r--r--src/engine/maths.h7
-rw-r--r--src/engine/player_controller.c1
-rw-r--r--src/engine/player_controller.h7
-rw-r--r--src/engine/sprite_controller.c22
-rw-r--r--src/engine/sprite_controller.h106
16 files changed, 268 insertions, 69 deletions
diff --git a/src/engine/TODO/entity.c b/src/engine/TODO/entity.c
deleted file mode 100644
index fa550d5..0000000
--- a/src/engine/TODO/entity.c
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <stdbool.h>
-
-#include "hh_entity.h"
-#include "maths.h"
-
-/*
- PLAYER: (pos on X)
- ,___,
- | |
- | X |
- |___|
-
-*/
-
-bool hh_collision(vec2* pos1, vec2* pos2){
- if (pos2->x == CLAMP(pos2->x,pos1->x,pos1->x+1.0f)){// hit x
- return true;
- }
-
- if (pos2->y == CLAMP(pos2->y,pos1->y,pos1->y+0.99f)){// hit y
- return true;
- }
- return false;
-}
-
-void hh_solve_collision(vec2* pos_environment, hh_entity* entity){
- if (entity->vec.x > 0.0f){
- entity->pos.x = MIN(entity->pos.x,pos_environment->x-1.0f);
- entity->vec.x = 0.0f;
- } else if (entity->vec.x < 0.0f){
- entity->pos.x = MAX(entity->pos.x,pos_environment->x+1.0f);
- entity->vec.x = 0.0f;
- } else if (entity->vec.y > 0.0f){
- entity->pos.x = MIN(entity->pos.x,pos_environment->x-1.0f);
- entity->vec.x = 0.0f;
- } else if (entity->vec.y < 0.0f){
- entity->pos.x = MAX(entity->pos.x,pos_environment->x+1.0f);
- entity->vec.x = 0.0f;
- }
-}
-
diff --git a/src/engine/TODO/player_controller.h b/src/engine/TODO/player_controller.h
deleted file mode 100644
index 1e9b86c..0000000
--- a/src/engine/TODO/player_controller.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "maths.h"
-#include "hh_entity.h"
-
-// inputs
diff --git a/src/engine/TODO/sprite_controller.h b/src/engine/TODO/sprite_controller.h
deleted file mode 100644
index c1fadff..0000000
--- a/src/engine/TODO/sprite_controller.h
+++ /dev/null
@@ -1,6 +0,0 @@
-// handles sprites
-
-// Bg sprites
-
-
-// Fg or entity sprites
diff --git a/src/engine/camera.c b/src/engine/camera.c
new file mode 100644
index 0000000..e756bd4
--- /dev/null
+++ b/src/engine/camera.c
@@ -0,0 +1,34 @@
+#include "engine/camera.h"
+
+#include "ppu/consts.h"
+
+
+vec_cor hh_update_camera(vec_cen new, vec2 min, vec2 max){
+
+ //TODO: change floating point math to fix point math
+ //TODO: fix buggy y-axis ??
+
+ // new = vec_cen2cor(new,(vec2){.x=max.x/2,.y=max.y/2});
+ new = vec_cen2cor((vec2){.x=new.x+(HH_PPU_SPRITE_WIDTH/2),.y=(new.y+(HH_PPU_SPRITE_HEIGHT/2))*2},(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;
+ // old.x = old.x << HH_MATH_FIXED_POINT;
+ // old.y = old.y << HH_MATH_FIXED_POINT;
+
+ // int16_t some = 0;
+ // some = some <<= HH_MATH_FIXED_POINT-1;
+
+ new.x = (int)((float)new.x*0.1f + (float)old.x*0.9f);
+ new.y = (int)((float)new.y*0.1f + (float)old.y*0.9f);
+
+ // old.x = old.x >> HH_MATH_FIXED_POINT;
+ // old.y = old.y >> HH_MATH_FIXED_POINT;
+
+
+ old.x = CLAMP(new.x,min.x,max.x);
+ old.y = CLAMP(new.y,min.y,max.y);
+
+ return old;
+}
+
diff --git a/src/engine/camera.h b/src/engine/camera.h
new file mode 100644
index 0000000..b3ffb52
--- /dev/null
+++ b/src/engine/camera.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#include "engine/maths.h"
+
+vec_cor hh_update_camera(vec_cor new, vec2 min, vec2 max);
+
diff --git a/src/engine/draw_screen.c b/src/engine/draw_screen.c
index acf5b41..c4f3389 100644
--- a/src/engine/draw_screen.c
+++ b/src/engine/draw_screen.c
@@ -1,21 +1,22 @@
-#include "draw_screen.h"
+#include "engine/draw_screen.h"
+#include "engine/sprite_controller.h"
uint8_t hh_world_to_tile(vec2 pos){
- FILE* level = fopen("../test/bin/test_map.bin", "rb"); /* open binary file */
+ FILE* level = fopen("../test/bin/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 + pos.x);
+ 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
+ int tile;// = (int*)malloc(sizeof(int));
+ fread(&tile, sizeof(int), 1, level); // read 1 tile from binary
fclose(level);
- int val = *tile;
- free(tile);
- return val;
+ // int val = tile;
+ // free(tile);
+ return tile;
}
@@ -25,8 +26,8 @@ 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*HH_PPU_SPRITE_WIDTH,
- .bg_shift_y = viewport.y*HH_PPU_SPRITE_HEIGHT,
+ .bg_shift_x = viewport.x,
+ .bg_shift_y = viewport.y,
.fg_fetch = 0,
.sysreset = 0,
});
@@ -37,8 +38,8 @@ void hh_draw_screen(vec_cor viewport){
void hh_setup_screen(){
//(HH_map_size_X*HH_map_size_Y)
- int size = 3200; // max X = 40 en max Y = 80
- FILE* level = fopen("../test/bin/test_map.bin", "rb"); /* open binary file */
+ int size = 2400; // max X = 40 en max Y = 80
+ FILE* level = fopen("../test/bin/level1_test.bin", "rb"); /* open binary file */
if (!level) { /* check if file opened successfully */
fprintf(stderr, "Error: Failed to open file.\n");
return;
@@ -53,7 +54,7 @@ void hh_setup_screen(){
hh_ppu_update_background(BAM_index, (hh_s_ppu_loc_bam_entry){
.horizontal_flip = false,
.vertical_flip = false,
- .palette_index = tile[BAM_index]+1,
+ .palette_index = hh_get_palette(tile[BAM_index]),
.tilemap_index = tile[BAM_index],
});
}
diff --git a/src/engine/draw_screen.h b/src/engine/draw_screen.h
index 8d7df47..b181108 100644
--- a/src/engine/draw_screen.h
+++ b/src/engine/draw_screen.h
@@ -2,7 +2,7 @@
// every function call for drawing the screen goes here.
-#include "../engine/maths.h"
+#include "engine/maths.h"
#include "ppu/ppu.h"
#include <stdio.h>
diff --git a/src/engine/engine.c b/src/engine/engine.c
index f3410a4..799ee7c 100644
--- a/src/engine/engine.c
+++ b/src/engine/engine.c
@@ -1,3 +1,4 @@
#include "engine/draw_screen.h"
#include "engine/level.h"
#include "engine/maths.h"
+#include "engine/sprite_controller.h"
diff --git a/src/engine/entity.c b/src/engine/entity.c
new file mode 100644
index 0000000..152cf1d
--- /dev/null
+++ b/src/engine/entity.c
@@ -0,0 +1,46 @@
+#include <stdbool.h>
+
+#include "engine/entity.h"
+#include "engine/maths.h"
+
+/*
+ PLAYER: (pos on X)
+ ,___,
+ | |
+ | X |
+ |___|
+
+*/
+
+bool hh_collision(vec_cor pos1, vec2 pos2){
+ if (pos2.x == CLAMP(pos2.x, pos1.x, pos1.x+16)){// hit x
+ return true;
+ }
+
+ if (pos2.y == CLAMP(pos2.y, pos1.y, pos1.y+16)){// hit y
+ return true;
+ }
+ return false;
+}
+
+void hh_solve_collision(vec2 pos_environment, hh_entity* entity){
+ if (!hh_collision(pos_environment,entity->pos))
+ return;
+
+ printf("BONK!/n");
+ // if (entity->vec.y > 0){
+ // entity->pos.y = MAX(entity->pos.y,pos_environment.y);
+ // entity->vec.y = 0;
+ // } else {
+ // entity->pos.y = MIN(entity->pos.y,pos_environment.y);
+ // entity->vec.y = 0;
+ // }
+ // if (entity->vec.x <= 0){
+ // entity->pos.x = MIN(entity->pos.x,pos_environment.x-16);
+ // entity->vec.x = 0;
+ // } else {
+ // entity->pos.x = MAX(entity->pos.x,pos_environment.x+16);
+ // entity->vec.x = 0;
+ // }
+}
+
diff --git a/src/engine/TODO/entity.h b/src/engine/entity.h
index fdbeb8a..dee4aed 100644
--- a/src/engine/TODO/entity.h
+++ b/src/engine/entity.h
@@ -1,13 +1,15 @@
#pragma once
#include <stdint.h>
+#include <stdbool.h>
-#include "maths.h"
+#include "engine/maths.h"
typedef struct {
vec2 pos, vec;
bool is_grounded;
int8_t hp;
+ int8_t speed;
//armor/block?
}hh_entity;
@@ -15,10 +17,10 @@ typedef struct {
/// @param pos1 position of environment tile to be checked
/// @param pos2 position entity
/// @return true if collision between enity and environment
-bool hh_collision(vec2* pos1, vec2* pos2);
+bool hh_collision(vec2 pos1, vec2 pos2);
/// @brief solve collisions
/// @param environment position
/// @param entity position
/// @return solved new entity position
-void hh_solve_collision(vec2* pos_environment, hh_entity* entity);
+void hh_solve_collision(vec2 pos_environment, hh_entity* entity);
diff --git a/src/engine/maths.c b/src/engine/maths.c
new file mode 100644
index 0000000..475bba2
--- /dev/null
+++ b/src/engine/maths.c
@@ -0,0 +1,19 @@
+#include "engine/maths.h"
+
+vec2 vec_add(vec2 a, vec2 b){
+ return (vec2){a.x + b.x, a.y + b.y};
+}
+
+vec_cor vec_cen2cor(vec_cen in, vec2 halfDistance){
+ return (vec_cor){
+ .x = in.x - halfDistance.x,
+ .y = in.y - halfDistance.y,
+ };
+}
+
+vec_cen vec_cor2cen(vec_cor in, vec2 halfDistance){
+ return (vec_cen){
+ .x = in.x + halfDistance.x,
+ .y = in.y + halfDistance.y,
+ };
+}
diff --git a/src/engine/maths.h b/src/engine/maths.h
index c7f1b44..bef287e 100644
--- a/src/engine/maths.h
+++ b/src/engine/maths.h
@@ -3,12 +3,17 @@
// #include <math.h>
typedef struct {
- uint32_t x,y;
+ int32_t x,y;
} vec2;
typedef vec2 vec_cen;//centered
typedef vec2 vec_cor;//left upper corner
+vec2 vec_add(vec2 a, vec2 b);
+
+vec_cor vec_cen2cor(vec_cen in, vec2 halfDistance);
+vec_cor vec_cor2cen(vec_cen in, vec2 halfDistance);
+
//fixed point at decimal 7lsb (world positions in pixels (with fixed decimal point))
#define HH_MATH_FIXED_POINT 7
diff --git a/src/engine/player_controller.c b/src/engine/player_controller.c
new file mode 100644
index 0000000..27e522e
--- /dev/null
+++ b/src/engine/player_controller.c
@@ -0,0 +1 @@
+#include "engine/player_controller.h"
diff --git a/src/engine/player_controller.h b/src/engine/player_controller.h
new file mode 100644
index 0000000..400c18e
--- /dev/null
+++ b/src/engine/player_controller.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "engine/maths.h"
+#include "engine/entity.h"
+// inputs
+
+void hh_player_actions();
diff --git a/src/engine/sprite_controller.c b/src/engine/sprite_controller.c
new file mode 100644
index 0000000..5d93cf8
--- /dev/null
+++ b/src/engine/sprite_controller.c
@@ -0,0 +1,22 @@
+#include <stdint.h>
+
+#include "engine/sprite_controller.h"
+#include "ppu/types.h"
+#include "ppu/consts.h"
+#include "ppu/ppu.h"
+
+uint8_t hh_get_palette(uint8_t tile_idx) {
+ return hh_g_sprite_palette[tile_idx];
+}
+
+void hh_setup_palettes(){
+ for (int idx = 0; idx < HH_PPU_PALETTE_COUNT; idx++) {
+ for (int col = 0; col < HH_PPU_PALETTE_COLOR_COUNT; col++) {
+ hh_ppu_update_color(idx,col,hh_g_palette[idx][col]);
+ }
+ }
+}
+
+bool hh_colidable(uint8_t tile_idx){
+ return (hh_get_palette(tile_idx) != 0);
+}
diff --git a/src/engine/sprite_controller.h b/src/engine/sprite_controller.h
new file mode 100644
index 0000000..001a459
--- /dev/null
+++ b/src/engine/sprite_controller.h
@@ -0,0 +1,106 @@
+#pragma once
+#include <stdint.h>
+
+#include "ppu/types.h"
+
+// handles sprites
+
+// Bg sprites
+
+// Fg or entity sprites
+
+//TODO: pack data inside of sprite_palette LUT
+//HH_PPU_PALETTE_COUNT
+#define HH_SPRITE_COUNT 40
+#define HH_PAL_IDX_SKY 0
+#define HH_PAL_IDX_BRICK 1
+const static uint8_t hh_g_sprite_palette[HH_SPRITE_COUNT] = {
+ 0,1,1,1,1,1,1,1,1,1, //1+9
+ 1,1,1,1,1,1,1,1,1,1, //6+4
+ 1,1,1,1,1,1,1,1,1, //9
+ 7,7,7,2,7,7,1,2,7
+ //other palettes here:
+};
+
+
+const static hh_ppu_loc_palette_table_t hh_g_palette = {
+ {//palette info here
+ {0x1,0x2,0x3},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0}},
+ {//Bricks
+ {0x1,0x2,0x3},//01
+ {0xd,0x8,0xa},//24
+ {0x0,0x0,0x1},//25
+ {0x1,0x1,0x1},//26
+ {0x1,0x1,0x2},//27
+ {0x2,0x2,0x3},//28
+ {0x3,0x4,0x5},//29
+ {0x5,0x1,0x7}},
+ {//slime
+ {0x1,0x2,0x3},
+ {0x1,0x3,0x2},
+ {0x4,0x8,0x3},
+ {0x7,0xa,0x4},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0}},
+ {
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0}},
+ {
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0}},
+ {
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0}},
+ {
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0},
+ {0x0,0x0,0x0}},
+ {
+ {0x0,0xf,0xf},
+ {0xf,0xf,0xf},
+ {0xf,0x0,0xf},
+ {0xf,0xf,0x0},
+ {0xf,0x0,0x0},
+ {0x0,0xf,0x0},
+ {0x0,0x0,0xf},
+ {0x0,0x0,0x0}}
+};
+
+void hh_setup_palettes();
+
+/** @brief return palette index that belongs to tilemap index */
+uint8_t hh_get_palette(uint8_t tile_idx);
+
+bool hh_colidable(uint8_t tile_idx);