aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/GameLoop/shop.c68
-rw-r--r--src/GameLoop/shop.h22
-rw-r--r--src/demo.c76
-rw-r--r--src/engine/animator.c41
-rw-r--r--src/engine/animator.h14
-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/entity.c22
-rw-r--r--src/engine/entity.h46
-rw-r--r--src/engine/level_const.c46
-rw-r--r--src/engine/level_const.h31
-rw-r--r--src/engine/maths.h1
-rw-r--r--src/engine/player_controller.c172
-rw-r--r--src/engine/types.h44
-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.c85
-rw-r--r--src/game_loop/shop.h37
-rw-r--r--src/game_loop/starting_screen.c32
-rw-r--r--src/game_loop/starting_screen.h14
-rw-r--r--src/makefile8
-rw-r--r--src/static/foreground/font.hex580
-rw-r--r--src/static/foreground/slime.h3
-rw-r--r--src/static/foreground/slime.hex90
-rw-r--r--src/static/foreground/slime_jumpable.h4
-rw-r--r--src/static/foreground/slime_jumpable.hex134
31 files changed, 1578 insertions, 351 deletions
diff --git a/src/GameLoop/shop.c b/src/GameLoop/shop.c
index eb6bed5..fb7ef4c 100644
--- a/src/GameLoop/shop.c
+++ b/src/GameLoop/shop.c
@@ -1,30 +1,78 @@
#include "shop.h"
-
+#include "engine/maths.h"
+#include "ppu/ppu.h"
bool hh_show_Shop(){
- static hh_e_ShopStates hh_e_Shop = hh_e_STATE_SHOW;
+ static hh_e_ShopStates hh_e_Shop = hh_e_shop_init;
+ static hh_e_upgrades upgrades[HH_SHOP_UPG_DISPLAY] = {0};
+ static uint8_t selected = 0;
switch (hh_e_Shop)
{
- case hh_e_STATE_SHOW:
- //hh_clear_screen();
+ case hh_e_shop_init:
+ hh_clear_screen();
+ hh_clear_sprite();
+ //TODO: render shop bg from level file here
//hh_setup_shop();
- hh_e_Shop = hh_e_STATE_Input;
+ hh_shop_init(&upgrades);
+ selected = HH_SHOP_UPG_DISPLAY/2;
+ hh_shop_display(selected, &upgrades);
+ hh_e_Shop = hh_e_shop_main;
return false;
break;
- case hh_e_STATE_Input:
+ case hh_e_shop_main:
+ if(g_hh_controller_p1.dpad_left || g_hh_controller_p1.dpad_right){
+ hh_shift_selected(&selected,(g_hh_controller_p1.dpad_right?1:0),0,HH_SHOP_UPG_DISPLAY);
+ hh_shop_display(selected, &upgrades);
+ }
if(g_hh_controller_p1.button_primary){
- hh_e_Shop = hh_e_STATE_END;
+ //apply selected upgrade
+ hh_e_Shop = hh_e_shop_end;
+ }
+ if(g_hh_controller_p1.button_secondary){
+ hh_e_Shop = hh_e_shop_end;
}
break;
- case hh_e_STATE_END:
- hh_e_Shop = hh_e_STATE_SHOW;
+ case hh_e_shop_end:
+ hh_e_Shop = hh_e_shop_init;
return true;
break;
default:
- hh_e_Shop = hh_e_STATE_SHOW;
+ hh_e_Shop = hh_e_shop_init;
break;
}
return false;
}
+
+void hh_shop_init(hh_e_upgrades* in) {
+ for (int i = 0; i < HH_SHOP_UPG_DISPLAY; i++) {
+ in[i] = i%HH_SHOP_UPG_COUNT;
+ }
+}
+
+void hh_shop_display(uint8_t selected, hh_e_upgrades* upgrades) {
+ const vec_cor start = {48,16};
+ const uint8_t up = 8,
+ space = 24+8;
+
+ for (int i = 0; i < HH_SHOP_UPG_DISPLAY; i++) {
+ hh_ppu_update_foreground(i+16,
+ (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,
+ .tilemap_index = i
+ });
+ }
+}
+
+void hh_shift_selected(uint8_t* pos, bool dir, uint8_t min, uint8_t max) {
+ if (dir) {
+ pos = CLAMP(++pos,min,max);
+ } else {
+ if (pos > 0) {
+ pos--;
+ }
+ }
+}
diff --git a/src/GameLoop/shop.h b/src/GameLoop/shop.h
index 4014f58..5cd6b53 100644
--- a/src/GameLoop/shop.h
+++ b/src/GameLoop/shop.h
@@ -7,10 +7,26 @@
#include <stdbool.h>
typedef enum {
- hh_e_STATE_SHOW,
- hh_e_STATE_Input,
- hh_e_STATE_END
+ hh_e_shop_init,
+ hh_e_shop_main,
+ hh_e_shop_end
} hh_e_ShopStates;
+/** @brief amount of upgrade types */
+#define HH_SHOP_UPG_COUNT 2
+/** @brief count of visible upgrades in shop */
+#define HH_SHOP_UPG_DISPLAY 4
+/** @brief all possible upgrades */
+typedef enum {
+ hh_e_UPG_JUMP,
+ hh_e_UPG_HEALTH
+} hh_e_upgrades;
+
+/** @brief init */
+void hh_shop_init(hh_e_upgrades* in);
+/** @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);
bool hh_show_Shop();
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/animator.c b/src/engine/animator.c
new file mode 100644
index 0000000..3d46ea0
--- /dev/null
+++ b/src/engine/animator.c
@@ -0,0 +1,41 @@
+#include "engine/animator.h"
+#include "engine/entity.h"
+#include "engine/maths.h"
+#include "ppu/consts.h"
+#include "ppu/ppu.h"
+
+
+#define hh_white_palette 6
+
+void hh_animate_hit(hh_s_rendering* in, bool hit) {
+ if (hit) {
+ in->fam.palette_index = hh_white_palette;
+ } else {
+ in->fam.palette_index = in->palette;
+ }
+}
+
+void hh_animate(hh_s_rendering* in, uint16_t start, uint16_t end, uint8_t step) {
+ if (in->fam.palette_index >= start && in->fam.palette_index < end) {
+ in->fam.palette_index += step;
+ } else {// rollover
+ in->fam.palette_index = start;
+ }
+}
+
+//TODO: if entity not inside of screen, don't update idx (problems with old idx not being overwritten anymore)
+void hh_update_sprite(uint16_t *idx, hh_entity* in, vec_cor cam) {
+ hh_animate_hit(&in->render, in->is_hit);
+ hh_s_ppu_loc_fam_entry temp = in->render.fam;
+ for (int y = 0; y < CEILI(in->size.y,16); y++) {
+ temp.position_y = CLAMP(in->pos.y - cam.y + y*HH_PPU_SPRITE_HEIGHT, -16, HH_PPU_SCREEN_HEIGHT);
+ for (int x = 0; x < CEILI(in->size.x,16); x++) {
+ temp.position_x = CLAMP(in->pos.x - cam.x + x*HH_PPU_SPRITE_WIDTH, -16, HH_PPU_SCREEN_WIDTH);
+ // if (temp.position_x != -16 && temp.position_y != -16) {// removes redundant sprites
+ hh_ppu_update_foreground(++*idx, temp);
+ temp.tilemap_index++;
+ // hh_animate(&in->render, start+counter,end+counter,4);
+ // }
+ }
+ }
+}
diff --git a/src/engine/animator.h b/src/engine/animator.h
new file mode 100644
index 0000000..2f6e00d
--- /dev/null
+++ b/src/engine/animator.h
@@ -0,0 +1,14 @@
+#pragma once
+#include <stdint.h>
+
+#include "ppu/types.h"
+#include "engine/types.h"
+#include "engine/entity.h"
+
+/** @brief flashes sprite white, also needs to be called next frame */
+void hh_animate_hit(hh_s_rendering*, bool hit);
+/** @brief updates current animation frame */
+void hh_animate(hh_s_rendering*, uint16_t start, uint16_t end, uint8_t step);
+
+/** @brief passively updates sprite*/
+void hh_update_sprite(uint16_t* idx, hh_entity* in, vec_cor cam);
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..823c284 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_offset = 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_offset != offset_py){
+ if(offset_py==0){
+ offsetY = MAX(current_tile_y-14,0) * 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_offset = offset_py;
+ }
+ else if ((offset_px == 0 || offset_px > 310) && level.size.x > level.size.y && prev_offset != offset_px)
+ {
+ if(offset_px==0){
+ offsetX = MAX((current_tile_x - 14),0);
+ }
+ 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_offset = 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/entity.c b/src/engine/entity.c
index 535759d..58b62c9 100644
--- a/src/engine/entity.c
+++ b/src/engine/entity.c
@@ -45,18 +45,18 @@ void hh_solve_collision(vec2 pos_environment, hh_entity* entity){
}
hh_entity hh_background_collision (hh_entity temp_old_entity,hh_entity temp_new_entity){
- temp_old_entity.is_grounded = false;
+ temp_new_entity.is_grounded = false;
// solves x collision
if (temp_old_entity.vel.x <= 0) {
if (hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 0, .y=temp_old_entity.pos.y + 0})) ||
- hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 0, .y=temp_old_entity.pos.y + 15}))) {
+ hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 0, .y=temp_old_entity.pos.y + (temp_old_entity.size.y-1)}))) {
temp_new_entity.pos.x = (temp_new_entity.pos.x & ~15) + 16,
temp_new_entity.vel.x = 0;
}
} else {
- if (hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 16, .y=temp_old_entity.pos.y + 0})) ||
- hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 16, .y=temp_old_entity.pos.y + 15}))) {
+ if (hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + temp_old_entity.size.x, .y=temp_old_entity.pos.y + 0})) ||
+ hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + temp_old_entity.size.x, .y=temp_old_entity.pos.y + (temp_old_entity.size.y-1)}))) {
temp_new_entity.pos.x = temp_new_entity.pos.x & ~15, // <-- magic comma, NOT TOUCHY
temp_new_entity.vel.x = 0;
}
@@ -65,20 +65,22 @@ hh_entity hh_background_collision (hh_entity temp_old_entity,hh_entity temp_new_
//solves y collision
if (temp_old_entity.vel.y <= 0) {
if (hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 0, .y=temp_new_entity.pos.y + 0})) ||
- hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 15, .y=temp_new_entity.pos.y + 0}))) {
+ hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + (temp_new_entity.size.x-1), .y=temp_new_entity.pos.y + 0}))) {
temp_new_entity.pos.y = (temp_new_entity.pos.y & ~15) + 16,
temp_new_entity.vel.y = 0;
}
} else {
- if (hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 0, .y=temp_new_entity.pos.y + 15})) ||
- hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 15, .y=temp_new_entity.pos.y + 15}))) {
+ if (hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + 0, .y=temp_new_entity.pos.y + (temp_new_entity.size.y-1)})) ||
+ hh_colidable(hh_world_to_tile((vec2){.x=temp_new_entity.pos.x + (temp_new_entity.size.x-1), .y=temp_new_entity.pos.y + (temp_new_entity.size.y-1)}))) {
temp_new_entity.pos.y = temp_new_entity.pos.y & ~15,
temp_new_entity.vel.y = 0;
- temp_old_entity.is_grounded = true;
+ temp_new_entity.is_grounded = true;
}
}
- temp_old_entity.pos = temp_new_entity.pos;
- temp_old_entity.vel = temp_new_entity.vel;
+ temp_old_entity = temp_new_entity;
+ // temp_old_entity.is_grounded = temp_new_entity.is_grounded;
+ // temp_old_entity.pos = temp_new_entity.pos;
+ // temp_old_entity.vel = temp_new_entity.vel;
return temp_old_entity;
}
diff --git a/src/engine/entity.h b/src/engine/entity.h
index cad6ba4..68b450d 100644
--- a/src/engine/entity.h
+++ b/src/engine/entity.h
@@ -5,47 +5,11 @@
#include <stdio.h>
#include "ppu/types.h"
-
#include "engine/maths.h"
+#include "engine/types.h"
+// #include "engine/animator.h"
-typedef uint8_t hh_idx_t;
-
-typedef enum {
- fire, ice, poison
-}hh_e_damage_t;
-
-typedef struct {
- hh_s_ppu_loc_fam_entry fam; //screen
- hh_idx_t frame0;
- hh_idx_t palette;
-
-}hh_s_rendering;
-
-typedef struct {
- int8_t hp;
- int8_t dmg;
- hh_e_damage_t dmg_type;
- int8_t speed_x, speed_y;
-
-} hh_s_atributes;
-
-
-typedef struct {
- vec2 pos, vel, vec;
- bool is_grounded;
- bool is_hit;
- uint8_t radius;
- int8_t hp;
- int8_t speed;
- hh_s_rendering render;
- //armor/block?
-}hh_entity;
-
-typedef struct {
- hh_entity p;
- hh_s_atributes atr;
-}hh_s_player;
-
+// TODO: make a sprite update function (and required data structs?)
/// @brief detect for collision enity and eviroment
/// @param pos1 position of environment tile to be checked
@@ -63,7 +27,7 @@ void hh_solve_collision(vec2 pos_environment, hh_entity* entity);
/// @param temp_old_entity old data of entity
/// @param temp_new_entity new data of entity where it wants to go to
/// @return updated new entity where it actually can go to
-hh_entity hh_background_collision (hh_entity temp_old_entity, hh_entity temp_new_entity);
+hh_entity hh_background_collision(hh_entity temp_old_entity, hh_entity temp_new_entity);
/// @brief solve collision of player with enemy
/// @param temp_player data of player
@@ -77,6 +41,6 @@ hh_entity hh_enemy_collision(hh_entity temp_player, hh_entity temp_enemy);
/// @param radius_1 radius of first object (entity)
/// @param radius_2 radius of second object (entity)
/// @return true if objects collids
-bool hh_distance_circles (vec2 object_1, vec2 object_2, int radius_1, int radius_2);
+bool hh_distance_circles(vec2 object_1, vec2 object_2, int radius_1, int radius_2);
diff --git a/src/engine/level_const.c b/src/engine/level_const.c
new file mode 100644
index 0000000..3847ad8
--- /dev/null
+++ b/src/engine/level_const.c
@@ -0,0 +1,46 @@
+#include "engine/level_const.h"
+
+#include <stdio.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");
+ if (fp == NULL) {
+ printf("level1_test.bin not found!\n");
+ return levels;
+ }
+ 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");
+ if (lvl2 == NULL) {
+ printf("level2_test.bin not found!\n");
+ return levels;
+ }
+ 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/engine/maths.h b/src/engine/maths.h
index bef287e..6f66042 100644
--- a/src/engine/maths.h
+++ b/src/engine/maths.h
@@ -20,3 +20,4 @@ vec_cor vec_cor2cen(vec_cen in, vec2 halfDistance);
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
#define CLAMP(N,LOWER,UPPER) (MIN(MAX(LOWER, N), UPPER))
+#define CEILI(numerator, denominator) (numerator / denominator + (numerator % denominator != 0))
diff --git a/src/engine/player_controller.c b/src/engine/player_controller.c
index 647b00c..0fed82d 100644
--- a/src/engine/player_controller.c
+++ b/src/engine/player_controller.c
@@ -3,35 +3,52 @@
#include "engine/draw_screen.h"
#include "engine/sprite_controller.h"
#include "engine/player_controller.h"
-
#include "input.h"
+#include "engine/animator.h"
#include "engine/bullet.h"
void hh_player_actions() {
- static Bullet bullet ={
- .isActive=false,
- };
static hh_entity player={
.hp = 4,
.speed = 6,
.is_grounded = false,
.is_hit = false,
- .radius = 8,
- .pos = (vec2){32,32},
+ .radius = 16,
+ .pos = (vec2){128+16,32},
.vel = (vec2){0,0},
- .vec = (vec2){0,0},
+ .size = (vec2){32,32},
.render = {
.frame0 = 80,
.palette = 3,
+ .ppu_foreground_index = 0,
.fam = (hh_s_ppu_loc_fam_entry){
.horizontal_flip = false,
.vertical_flip = false,
- .palette_index = 2,
- .tilemap_index = 60,
+ .palette_index = 3,
+ .tilemap_index = 80,
}
}
}, player_new = {0};
+ static hh_entity bullet={
+// .hp = 4,
+ .speed = 6,
+ .is_grounded = true,
+ .is_hit = false,
+ .radius = 8,
+ .pos = (vec2){-16,-16},
+ .vel = (vec2){0,0},
+ .render = {
+ .frame0 = 84,
+ .palette = 3,
+ .fam = (hh_s_ppu_loc_fam_entry){
+ .horizontal_flip = false,
+ .vertical_flip = false,
+ .palette_index = 7,
+ .tilemap_index = 84,
+ }
+ }
+ };
static hh_entity enemy={
.hp = 4,
@@ -41,10 +58,11 @@ void hh_player_actions() {
.radius = 8,
.pos = (vec2){128,48},
.vel = (vec2){0,0},
- .vec = (vec2){0,0},
+ .size = (vec2){16,16},
.render = {
.frame0 = 20,
.palette = 7,
+ .ppu_foreground_index = 16,
.fam = (hh_s_ppu_loc_fam_entry){
.horizontal_flip = false,
.vertical_flip = false,
@@ -117,13 +135,6 @@ void hh_player_actions() {
} else if (player.vel.y < 6){
player.vel.y += 1; //gravity
}
-
- if(g_hh_controller_p1.button_secondary==true){
- shootBullet(player.pos,&bullet);
- }
- updateBullet(&bullet,5);
-
-
/*
player.vel = (vec2){.x = (-1 * g_hh_controller_p1.dpad_left) + (1 * g_hh_controller_p1.dpad_right),
@@ -140,33 +151,7 @@ void hh_player_actions() {
.y = player.vel.y,
};
- player_new = hh_enemy_collision(player, enemy);
-
-
- // const int8_t maa = 3;
- // const int8_t mbb = -3;
- // if (g_hh_controller_p1.dpad_up)
- //
- // if (g_hh_controller_p1.dpad_down)
- //
- // if (g_hh_controller_p1.dpad_left) {
- // player.vel.x += mbb;
- // // g_hh_demo_balls[0].horizontal_flip = true;
- // }
- // if (g_hh_controller_p1.dpad_right) {
- // player.vel.x += maa;
- // // g_hh_demo_balls[0].horizontal_flip = true;
- // }
- // if (g_hh_controller_p1.button_primary /*&& player.is_grounded*/) //JUMP
- // player.vel.y += -6;
- // // // if (g_hh_controller_p1.button_secondary)
-
- // player.vel.y += 1; //gravity
-
-
- //END OF VECTOR CHANGES
- // player.vel.y = CLAMP(player.vel.y,-32,32);
- // player.vel.x = CLAMP(player.vel.x,-32,32);
+ player_new = hh_enemy_collision(player, enemy);
player_new.pos = (vec2){
.x = player.pos.x + player_new.vel.x,
@@ -174,77 +159,44 @@ void hh_player_actions() {
};
-
- // const uint8_t empty = 0;
- // hh_s_tiles tiles[9];
- // const vec2 tile_offset[9] = {
- // (vec2){-16,-16},(vec2){0,-16},(vec2){+16,-16},
- // (vec2){-16,0}, (vec2){0,0}, (vec2){+16,0},
- // (vec2){-16,+16},(vec2){0,+16},(vec2){+16,+16},
- // };
- // for (int i = 0; i < 9; i++) {
- // vec2 temp_pos = vec_add(player.pos, tile_offset[i]);
- // temp_pos =(vec2){
- // .x = temp_pos.x,
- // .y = temp_pos.y,
- // };
- // hh_s_tiles tile = {
- // .pos = temp_pos,
- // .idx = hh_world_to_tile(temp_pos)
- // };
- // if(hh_colidable(tile.idx)) {
- // tiles[i]=tile;
- // // printf(" collidable near!");
- // } else {
- // tiles[i].idx = 0;
- // }
- // }
- /*
- 012
- 345
- 678
- */
- // for (int i = 0; i < 9; i++)
- // {
- // if (tiles[i].idx != 0){
- // hh_solve_collision(tiles[i].pos, &player);
- // }
- // }
-
- player = hh_background_collision ( player, player_new);
+ player = hh_background_collision( player, player_new);
- //player = player_new;
-
vec_cor cam_pos;//value in tiles
- // cam_pos = (vec2){0,0};
- cam_pos = hh_update_camera(player.pos,(vec2){0,0},(vec2){.x=20*16,.y=30*16});//TODO: remove magic number(s)
- // printf("%i, %i:%i, %i\n",player.pos.x,player.pos.y,cam_pos.x,cam_pos.y);
- hh_draw_screen(cam_pos);
+ cam_pos = hh_draw_screen(player.pos);
+ hh_shoot_bullet(player.pos, cam_pos ,&bullet);
+ uint16_t idx = 16;
+ // hh_clear_sprite();
+ hh_update_sprite(&idx, &enemy, cam_pos);
+ hh_update_sprite(&idx, &player, cam_pos);
+
+ idx =16;
+
+ // TODO: make this a function call
// update player sprite on ppu
- player.render.fam.position_x = (player.pos.x-cam_pos.x);
- player.render.fam.position_y = (player.pos.y-cam_pos.y);
-
- enemy.render.fam.position_x = (enemy.pos.x-cam_pos.x);
- enemy.render.fam.position_y = (enemy.pos.y-cam_pos.y);
-
- player.render.fam.tilemap_index = 2;//TODO: these two lines should be redundant
- player.render.fam.palette_index = 7;
- // hh_ppu_update_foreground(0, player.render.fam);
-
- for (int i = 0; i < 4; i++)
- {
- hh_s_ppu_loc_fam_entry temp = player.render.fam;
- temp.position_x = player.render.fam.position_x+(!(player.vel.x>0)?-1:1)*(i%2?8:-8);
- temp.position_y = player.render.fam.position_y+(i>1?0:-16);
- temp.tilemap_index = player.render.frame0 + i;
- temp.palette_index = player.render.palette;
- temp.horizontal_flip = !(player.vel.x>0);
- hh_ppu_update_foreground(i,temp);
- }
-
+ // player.render.fam.position_x = (player.pos.x-cam_pos.x);
+ // player.render.fam.position_y = (player.pos.y-cam_pos.y);
+
+ // enemy.render.fam.position_x = (enemy.pos.x-cam_pos.x);
+ // enemy.render.fam.position_y = (enemy.pos.y-cam_pos.y);
- hh_ppu_update_foreground(4, enemy.render.fam);
+ // TODO: make this loop a function call
+ // for (int i = 0; i < 4; i++)
+ // {
+ // hh_s_ppu_loc_fam_entry temp = player.render.fam;
+ // temp.position_x = player.render.fam.position_x+(!(player.vel.x>0)?-1:1)*(i%2?8:-8);
+ // temp.position_y = player.render.fam.position_y+(i>1?0:-16);
+ // temp.tilemap_index = player.render.fam.tilemap_index + i;
+ // temp.horizontal_flip = !(player.vel.x>0);
+ // hh_ppu_update_foreground(i,temp);
+
+ // // hh_s_ppu_loc_fam_entry temp = {
+ // // .position_x = player.render.fam.position_x+(!(player.vel.x>0)?-1:1)*(i%2?8:-8)
+ // // };
+
+ // }
+
+ // hh_ppu_update_foreground(4, enemy.render.fam);
}
diff --git a/src/engine/types.h b/src/engine/types.h
new file mode 100644
index 0000000..00b381b
--- /dev/null
+++ b/src/engine/types.h
@@ -0,0 +1,44 @@
+#pragma once
+
+#include "engine/maths.h"
+
+typedef uint8_t hh_ppu_fg_idx;
+// typedef uint16_t hh_bg_idx;
+
+typedef enum {
+ fire, ice, poison
+}hh_e_damage_t;
+
+
+typedef struct {
+ int8_t hp;
+ int8_t dmg;
+ hh_e_damage_t dmg_type;
+ int8_t speed_x, speed_y;
+
+} hh_s_atributes;
+
+
+typedef struct {
+ hh_s_ppu_loc_fam_entry fam; //screen
+ uint16_t frame0;
+ uint16_t palette;
+ uint16_t ppu_foreground_index;
+
+}hh_s_rendering;
+
+typedef struct {
+ vec2 pos, vel, size;
+ bool is_grounded;
+ bool is_hit;
+ uint8_t radius;
+ int8_t hp;
+ int8_t speed;
+ hh_s_rendering render;
+
+}hh_entity;
+
+typedef struct {
+ hh_entity p;
+ hh_s_atributes atr;
+}hh_s_player;
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..6a97d25
--- /dev/null
+++ b/src/game_loop/shop.c
@@ -0,0 +1,85 @@
+#include "shop.h"
+#include "engine/maths.h"
+#include "ppu/ppu.h"
+
+void hh_shop(hh_e_game_state* hh_game_state){
+ 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;
+ static bool pressed_LR = false;
+
+ 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_shop_init(&upgrades);
+ selected = HH_SHOP_UPG_DISPLAY/2;
+ hh_shop_display(selected, &upgrades);
+ hh_e_shop = hh_e_shop_main;
+ break;
+ case hh_e_shop_main:
+ if(g_hh_controller_p1.dpad_left || g_hh_controller_p1.dpad_right){
+ if (!pressed_LR) {
+ hh_shift_selected(&selected,(g_hh_controller_p1.dpad_right?1:0),0,HH_SHOP_UPG_DISPLAY-1);
+ hh_shop_display(selected, &upgrades);
+ }
+ pressed_LR = true;
+ } else {
+ pressed_LR = false;
+ }
+ if(g_hh_controller_p1.button_primary){
+ //apply selected upgrade
+ hh_e_shop = hh_e_shop_end;
+ }
+ if(g_hh_controller_p1.button_secondary){//Quick exit
+ hh_e_shop = hh_e_shop_end;
+ }
+ break;
+ case hh_e_shop_end: // delay?
+ hh_e_shop = hh_e_shop_show;
+ *hh_game_state = hh_e_state_gameplay;
+ break;
+ default:
+ hh_e_shop = hh_e_shop_show;
+ break;
+ }
+}
+
+uint8_t hh_shop_translate_upgrades(hh_e_upgrades upg) {
+ return upg+10;
+}
+
+void hh_shop_init(hh_e_upgrades* in) {
+ for (int i = 0; i < HH_SHOP_UPG_DISPLAY; i++) {
+ in[i] = i%HH_SHOP_UPG_COUNT;
+ }
+}
+
+void hh_shop_display(uint8_t selected, hh_e_upgrades* upgrades) {
+ const vec_cor start = {48,16};
+ const uint8_t up = 8,
+ space = 24+8;
+
+ for (int i = 0; i < HH_SHOP_UPG_DISPLAY; i++) {
+ hh_ppu_update_foreground(i+16,
+ (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,
+ .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
new file mode 100644
index 0000000..642bcc3
--- /dev/null
+++ b/src/game_loop/shop.h
@@ -0,0 +1,37 @@
+#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_main,
+ hh_e_shop_end,
+} hh_e_shop_states;
+
+/** @brief amount of upgrade types */
+#define HH_SHOP_UPG_COUNT 5
+/** @brief count of visible upgrades in shop */
+#define HH_SHOP_UPG_DISPLAY 5
+/** @brief all possible upgrades */
+typedef enum {
+ hh_e_upg_jump,
+ hh_e_upg_speed,
+ hh_e_upg_damage,
+ hh_e_upg_heal,
+ hh_e_upg_max_health,
+} hh_e_upgrades;
+
+/** @brief init */
+void hh_shop_init(hh_e_upgrades* in);
+/** @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*);
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 51ce7e9..ac67c86 100644
--- a/src/makefile
+++ b/src/makefile
@@ -40,8 +40,12 @@ LOCAL_SRCS += main.c \
engine/entity.c \
engine/bullet.c \
engine/title_screen.c \
- GameLoop/shop.c \
- GameLoop/startingScreen.c
+ engine/level_const.c \
+ engine/animator.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)
diff --git a/src/static/foreground/font.hex b/src/static/foreground/font.hex
new file mode 100644
index 0000000..890554b
--- /dev/null
+++ b/src/static/foreground/font.hex
@@ -0,0 +1,580 @@
+;indices: 2
+;17 20 38
+;40 27 51
+
+000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000020: 00 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00
+000030: 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00
+000040: 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00 00
+000050: 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00 00
+000060: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+000070: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+000080: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+000090: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0000a0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0000b0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0000c0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0000d0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0000e0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0000f0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000120: 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00
+000130: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+000140: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000150: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000160: 00 00 00 01 01 00 00 00 00 01 01 01 00 00 00 00
+000170: 00 00 00 00 00 00 00 00 01 01 01 01 00 00 00 00
+000180: 00 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00
+000190: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+0001a0: 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00 00
+0001b0: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+0001c0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0001d0: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+0001e0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+0001f0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000210: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+000220: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+000230: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000240: 00 00 00 01 01 00 00 00 00 01 01 01 00 00 00 00
+000250: 00 00 00 00 00 00 00 00 01 01 01 01 00 00 00 00
+000260: 00 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00
+000270: 00 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00
+000280: 00 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00
+000290: 00 00 00 00 00 00 00 00 01 01 01 01 00 00 00 00
+0002a0: 00 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00
+0002b0: 00 00 00 01 01 00 00 00 00 01 01 01 00 00 00 00
+0002c0: 00 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00
+0002d0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+0002e0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0002f0: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+000300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000310: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+000320: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+000330: 00 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00
+000340: 00 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00
+000350: 00 00 00 00 00 01 01 00 01 01 01 00 00 00 00 00
+000360: 00 00 00 00 01 01 00 00 01 01 01 00 00 00 00 00
+000370: 00 00 00 00 01 00 00 00 01 01 01 00 00 00 00 00
+000380: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000390: 00 00 01 01 01 01 01 01 01 01 01 01 01 00 00 00
+0003a0: 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00 00
+0003b0: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+0003c0: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+0003d0: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+0003e0: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+0003f0: 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00
+000400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000410: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000420: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000430: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+000440: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000450: 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00 00
+000460: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+000470: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000480: 00 00 00 01 01 01 01 00 00 01 01 01 00 00 00 00
+000490: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0004a0: 00 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00
+0004b0: 00 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00
+0004c0: 00 00 00 01 01 00 00 00 01 01 01 01 00 00 00 00
+0004d0: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+0004e0: 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00
+0004f0: 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00
+000500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000510: 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00
+000520: 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00
+000530: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+000540: 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00
+000550: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+000560: 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00
+000570: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+000580: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000590: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0005a0: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0005b0: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0005c0: 00 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00
+0005d0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0005e0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0005f0: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+000600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000610: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000620: 00 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00
+000630: 00 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00
+000640: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000650: 00 00 00 00 00 00 00 00 00 00 01 01 00 00 00 00
+000660: 00 00 00 00 00 00 00 00 00 01 01 00 00 00 00 00
+000670: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+000680: 00 00 00 00 00 00 00 00 01 01 00 00 00 00 00 00
+000690: 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00
+0006a0: 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00
+0006b0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0006c0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0006d0: 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00
+0006e0: 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00
+0006f0: 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00
+000700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000710: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+000720: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+000730: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000740: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000750: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000760: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000770: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+000780: 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00
+000790: 00 00 00 01 01 01 01 00 01 01 01 01 00 00 00 00
+0007a0: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0007b0: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0007c0: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0007d0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+0007e0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0007f0: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+000800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000810: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000820: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+000830: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+000840: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+000850: 00 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00
+000860: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000870: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000880: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000890: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+0008a0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0008b0: 00 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00
+0008c0: 00 00 00 00 00 00 00 00 01 01 00 00 00 00 00 00
+0008d0: 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00
+0008e0: 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00 00
+0008f0: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+000900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000910: 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00
+000920: 00 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00
+000930: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+000940: 00 00 00 00 01 01 01 00 01 01 01 01 00 00 00 00
+000950: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000960: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000970: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000980: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000990: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0009a0: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0009b0: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+0009c0: 00 00 00 00 01 01 01 00 01 01 01 00 00 00 00 00
+0009d0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0009e0: 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00
+0009f0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+000a00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000a10: 00 00 00 00 00 00 00 00 01 01 00 00 00 00 00 00
+000a20: 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00
+000a30: 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00
+000a40: 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00
+000a50: 00 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00
+000a60: 00 00 00 00 00 01 01 00 01 01 01 00 00 00 00 00
+000a70: 00 00 00 00 00 01 01 00 01 01 01 00 00 00 00 00
+000a80: 00 00 00 00 01 01 00 00 01 01 01 00 00 00 00 00
+000a90: 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00
+000aa0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000ab0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000ac0: 00 00 00 01 01 00 00 00 00 01 01 01 00 00 00 00
+000ad0: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+000ae0: 00 00 01 01 00 00 00 00 00 00 01 01 01 00 00 00
+000af0: 00 00 01 01 00 00 00 00 00 00 00 01 01 00 00 00
+000b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000b10: 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00 00
+000b20: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+000b30: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000b40: 00 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00
+000b50: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000b60: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+000b70: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+000b80: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+000b90: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000ba0: 00 00 00 01 01 01 00 00 00 01 01 01 01 00 00 00
+000bb0: 00 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00
+000bc0: 00 00 00 01 01 01 00 00 00 01 01 01 01 00 00 00
+000bd0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000be0: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+000bf0: 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00 00
+000c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000c10: 00 00 00 00 00 00 00 01 01 01 01 01 01 00 00 00
+000c20: 00 00 00 00 00 00 01 01 01 01 01 01 01 00 00 00
+000c30: 00 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00
+000c40: 00 00 00 00 01 01 01 01 00 00 00 01 01 00 00 00
+000c50: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+000c60: 00 00 00 01 01 01 01 00 00 00 00 00 00 00 00 00
+000c70: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000c80: 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00 00
+000c90: 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00 00
+000ca0: 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00 00
+000cb0: 00 00 01 01 01 00 00 00 00 00 00 01 01 00 00 00
+000cc0: 00 00 01 01 01 01 00 00 00 01 01 01 01 00 00 00
+000cd0: 00 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00
+000ce0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+000cf0: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+000d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000d10: 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00 00
+000d20: 00 00 01 01 01 01 01 00 00 00 00 00 00 00 00 00
+000d30: 00 00 01 01 01 01 01 01 01 00 00 00 00 00 00 00
+000d40: 00 00 01 01 01 00 01 01 01 01 00 00 00 00 00 00
+000d50: 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00 00
+000d60: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+000d70: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+000d80: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+000d90: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+000da0: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+000db0: 00 00 01 01 01 00 00 00 00 01 01 01 01 00 00 00
+000dc0: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+000dd0: 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00 00
+000de0: 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00 00
+000df0: 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00 00
+000e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000e10: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000e20: 00 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00
+000e30: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000e40: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000e50: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000e60: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000e70: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000e80: 00 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00
+000e90: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000ea0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000eb0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000ec0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000ed0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000ee0: 00 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00
+000ef0: 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00
+000f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000f10: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000f20: 00 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00
+000f30: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000f40: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000f50: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000f60: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000f70: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+000f80: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+000f90: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+000fa0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000fb0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000fc0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000fd0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000fe0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+000ff0: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+001000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001010: 00 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00
+001020: 00 00 00 00 00 00 01 01 01 01 01 01 00 00 00 00
+001030: 00 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00
+001040: 00 00 00 00 01 01 01 01 00 00 00 01 01 00 00 00
+001050: 00 00 00 01 01 01 01 00 00 00 00 00 00 00 00 00
+001060: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+001070: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+001080: 00 00 01 01 01 00 00 00 01 01 01 01 01 01 00 00
+001090: 00 00 01 01 01 00 01 01 01 01 01 01 01 01 00 00
+0010a0: 00 00 01 01 01 00 01 01 01 01 01 01 01 00 00 00
+0010b0: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+0010c0: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+0010d0: 00 00 01 01 01 01 01 01 01 01 01 01 00 00 00 00
+0010e0: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+0010f0: 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00 00
+001100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001110: 00 00 00 01 00 00 00 00 00 00 00 00 01 00 00 00
+001120: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+001130: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+001140: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+001150: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+001160: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+001170: 00 00 01 01 01 01 01 01 01 01 01 01 01 01 00 00
+001180: 00 00 01 01 01 01 01 01 01 01 01 01 01 01 00 00
+001190: 00 00 01 01 01 01 01 01 01 01 01 01 01 01 00 00
+0011a0: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+0011b0: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+0011c0: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+0011d0: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+0011e0: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+0011f0: 00 00 00 01 00 00 00 00 00 00 00 00 01 00 00 00
+001200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001210: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+001220: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+001230: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+001240: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001250: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001260: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001270: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001280: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001290: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0012a0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0012b0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0012c0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0012d0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0012e0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+0012f0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+001300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001310: 00 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00
+001320: 00 00 00 00 01 01 01 01 01 01 01 01 01 01 00 00
+001330: 00 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00
+001340: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+001350: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+001360: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+001370: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+001380: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+001390: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+0013a0: 00 00 00 01 00 00 00 00 01 01 01 00 00 00 00 00
+0013b0: 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00 00
+0013c0: 00 00 01 01 01 01 00 00 01 01 01 00 00 00 00 00
+0013d0: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+0013e0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0013f0: 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00
+001400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001410: 00 00 00 00 01 00 00 00 00 00 01 01 00 00 00 00
+001420: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+001430: 00 00 00 01 01 01 00 00 00 01 01 00 00 00 00 00
+001440: 00 00 00 01 01 01 00 00 01 01 01 00 00 00 00 00
+001450: 00 00 00 01 01 01 00 01 01 01 00 00 00 00 00 00
+001460: 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00 00
+001470: 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00 00
+001480: 00 00 00 01 01 01 01 01 00 00 00 00 00 00 00 00
+001490: 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00 00
+0014a0: 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00 00
+0014b0: 00 00 00 01 01 01 00 01 01 01 01 00 00 00 00 00
+0014c0: 00 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00
+0014d0: 00 00 00 01 01 01 00 00 00 01 01 01 01 00 00 00
+0014e0: 00 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00
+0014f0: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+001500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001510: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+001520: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+001530: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+001540: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+001550: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+001560: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+001570: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+001580: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+001590: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0015a0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0015b0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0015c0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0015d0: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+0015e0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+0015f0: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+001600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001610: 00 00 00 00 01 01 00 00 00 00 01 01 00 00 00 00
+001620: 00 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00
+001630: 00 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00
+001640: 00 00 01 01 01 01 01 00 00 00 01 01 01 00 00 00
+001650: 00 00 01 01 01 01 01 00 00 01 01 01 01 00 00 00
+001660: 00 00 01 01 01 01 01 00 00 01 01 01 01 01 00 00
+001670: 00 00 01 01 01 01 01 00 00 01 01 01 01 01 00 00
+001680: 00 00 01 01 00 01 01 00 01 01 01 01 01 01 00 00
+001690: 00 01 01 01 00 01 01 00 01 01 01 01 01 01 00 00
+0016a0: 00 01 01 01 00 01 01 01 01 01 00 00 01 01 00 00
+0016b0: 00 01 01 01 00 01 01 01 01 01 00 00 01 01 00 00
+0016c0: 01 01 01 00 00 01 01 01 01 01 00 00 01 01 01 00
+0016d0: 01 01 01 00 00 00 01 01 01 01 00 00 01 01 01 00
+0016e0: 01 01 01 00 00 00 01 01 01 00 00 00 01 01 01 00
+0016f0: 01 01 01 00 00 00 01 01 01 00 00 00 00 01 01 00
+001700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001710: 00 00 01 01 00 00 00 00 00 00 00 00 01 01 00 00
+001720: 00 00 01 01 01 00 00 00 00 00 00 00 01 01 01 00
+001730: 00 00 01 01 01 01 00 00 00 00 00 00 01 01 01 00
+001740: 00 00 01 01 01 01 00 00 00 00 00 00 01 01 01 00
+001750: 00 00 01 01 01 01 01 00 00 00 00 00 01 01 01 00
+001760: 00 00 01 01 01 01 01 01 00 00 00 00 01 01 01 00
+001770: 00 00 01 01 01 00 01 01 00 00 00 00 01 01 01 00
+001780: 00 00 01 01 01 00 00 01 01 00 00 00 01 01 01 00
+001790: 00 00 01 01 01 00 00 00 01 01 00 00 01 01 01 00
+0017a0: 00 00 01 01 01 00 00 00 01 01 01 00 01 01 01 00
+0017b0: 00 00 01 01 01 00 00 00 00 01 01 01 01 01 01 00
+0017c0: 00 00 01 01 01 00 00 00 00 00 01 01 01 01 01 00
+0017d0: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 01 00
+0017e0: 00 00 01 01 01 00 00 00 00 00 00 00 01 01 01 00
+0017f0: 00 00 00 01 00 00 00 00 00 00 00 00 00 01 00 00
+001800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001810: 00 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00
+001820: 00 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00
+001830: 00 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00
+001840: 00 00 00 01 01 01 01 00 00 00 01 01 01 01 00 00
+001850: 00 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00
+001860: 00 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00
+001870: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+001880: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+001890: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+0018a0: 00 00 01 01 01 00 00 00 00 00 01 01 01 01 00 00
+0018b0: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+0018c0: 00 00 01 01 01 01 00 00 00 01 01 01 01 00 00 00
+0018d0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+0018e0: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+0018f0: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+001900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001910: 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00 00
+001920: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+001930: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+001940: 00 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00
+001950: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+001960: 00 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00
+001970: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+001980: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+001990: 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00 00
+0019a0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0019b0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0019c0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0019d0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0019e0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0019f0: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+001a00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001a10: 00 00 00 00 00 00 01 01 01 01 01 01 00 00 00 00
+001a20: 00 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00
+001a30: 00 00 00 01 01 01 01 01 01 01 01 01 01 01 00 00
+001a40: 00 00 01 01 01 01 01 00 00 00 00 01 01 01 01 00
+001a50: 00 00 01 01 01 00 00 00 00 00 00 00 01 01 01 00
+001a60: 00 01 01 01 01 00 00 00 00 00 00 00 00 01 01 01
+001a70: 00 01 01 01 00 00 00 00 00 00 00 00 00 01 01 01
+001a80: 00 01 01 01 00 00 00 00 00 00 00 00 00 01 01 01
+001a90: 00 01 01 01 00 00 00 00 00 00 00 00 00 01 01 01
+001aa0: 00 01 01 01 00 00 00 00 01 01 00 00 00 01 01 01
+001ab0: 00 00 01 01 01 00 00 00 01 01 01 00 01 01 01 01
+001ac0: 00 00 01 01 01 01 01 00 00 01 01 01 01 01 01 00
+001ad0: 00 00 00 01 01 01 01 01 01 01 01 01 01 01 00 00
+001ae0: 00 00 00 00 01 01 01 01 01 01 01 01 01 01 00 00
+001af0: 00 00 00 00 00 00 01 01 01 01 01 01 01 01 01 00
+001b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001b10: 00 00 01 01 01 01 01 00 00 00 00 00 00 00 00 00
+001b20: 00 00 01 01 01 01 01 01 01 00 00 00 00 00 00 00
+001b30: 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00 00
+001b40: 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00 00
+001b50: 00 00 01 01 01 00 00 00 01 01 01 01 00 00 00 00
+001b60: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+001b70: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+001b80: 00 00 01 01 01 00 00 00 01 01 01 01 00 00 00 00
+001b90: 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00 00
+001ba0: 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00 00
+001bb0: 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00 00
+001bc0: 00 00 01 01 01 00 01 01 01 01 01 00 00 00 00 00
+001bd0: 00 00 01 01 01 00 00 00 01 01 01 01 01 00 00 00
+001be0: 00 00 01 01 01 00 00 00 00 01 01 01 01 00 00 00
+001bf0: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00
+001c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001c10: 00 00 00 00 00 00 00 01 01 01 01 00 00 00 00 00
+001c20: 00 00 00 00 00 00 01 01 01 01 01 01 00 00 00 00
+001c30: 00 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00
+001c40: 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00 00
+001c50: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+001c60: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+001c70: 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00 00
+001c80: 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00
+001c90: 00 00 00 00 00 00 01 01 01 01 01 01 01 00 00 00
+001ca0: 00 00 00 00 00 00 00 00 00 00 01 01 01 00 00 00
+001cb0: 00 00 00 01 01 00 00 00 00 00 01 01 01 00 00 00
+001cc0: 00 00 00 01 01 00 00 00 00 01 01 01 01 00 00 00
+001cd0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+001ce0: 00 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00
+001cf0: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+001d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001d10: 00 00 01 01 01 01 01 01 01 01 01 01 01 00 00 00
+001d20: 00 01 01 01 01 01 01 01 01 01 01 01 01 01 00 00
+001d30: 00 00 01 01 01 01 01 01 01 01 01 01 01 00 00 00
+001d40: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001d50: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001d60: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001d70: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001d80: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001d90: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001da0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001db0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001dc0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001dd0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001de0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+001df0: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00
+001e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001e10: 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00
+001e20: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+001e30: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+001e40: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+001e50: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+001e60: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+001e70: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+001e80: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+001e90: 00 00 01 01 01 00 00 00 00 00 01 01 00 00 00 00
+001ea0: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+001eb0: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+001ec0: 00 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00
+001ed0: 00 00 00 01 01 01 01 01 01 01 01 00 00 00 00 00
+001ee0: 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00
+001ef0: 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00
+001f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+001f10: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+001f20: 00 00 01 01 01 00 00 00 00 01 01 01 01 00 00 00
+001f30: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+001f40: 00 00 01 01 01 01 00 00 00 01 01 01 00 00 00 00
+001f50: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+001f60: 00 00 00 01 01 01 00 00 01 01 01 00 00 00 00 00
+001f70: 00 00 00 01 01 01 00 00 01 01 01 00 00 00 00 00
+001f80: 00 00 00 00 01 01 00 00 01 01 01 00 00 00 00 00
+001f90: 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00
+001fa0: 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00
+001fb0: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+001fc0: 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00
+001fd0: 00 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00
+001fe0: 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00 00
+001ff0: 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00 00
+002000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+002010: 01 01 00 00 00 00 00 01 01 00 00 00 00 00 01 01
+002020: 01 01 00 00 00 00 01 01 01 00 00 00 00 00 01 01
+002030: 01 01 00 00 00 00 01 01 01 00 00 00 00 01 01 01
+002040: 01 01 01 00 00 01 01 01 01 01 00 00 00 01 01 01
+002050: 01 01 01 00 00 01 01 01 01 01 00 00 00 01 01 01
+002060: 01 01 01 00 00 01 01 01 01 01 00 00 00 01 01 01
+002070: 01 01 01 00 00 01 01 01 01 01 00 00 01 01 01 00
+002080: 00 01 01 00 01 01 01 00 01 01 00 00 01 01 01 00
+002090: 00 01 01 00 01 01 01 00 01 01 00 00 01 01 00 00
+0020a0: 00 01 01 01 01 01 00 00 01 01 01 01 01 01 00 00
+0020b0: 00 01 01 01 01 01 00 00 01 01 01 01 01 01 00 00
+0020c0: 00 00 01 01 01 01 00 00 01 01 01 01 01 00 00 00
+0020d0: 00 00 01 01 01 00 00 00 00 01 01 01 01 00 00 00
+0020e0: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+0020f0: 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00 00
+002100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+002110: 00 00 00 01 01 00 00 00 00 00 00 00 01 01 00 00
+002120: 00 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00
+002130: 00 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00
+002140: 00 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00
+002150: 00 00 00 00 00 01 01 01 00 01 01 01 00 00 00 00
+002160: 00 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00
+002170: 00 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00
+002180: 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00
+002190: 00 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00
+0021a0: 00 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00
+0021b0: 00 00 00 00 01 01 01 01 00 01 01 01 00 00 00 00
+0021c0: 00 00 00 01 01 01 01 00 00 01 01 01 01 00 00 00
+0021d0: 00 00 00 01 01 01 00 00 00 00 01 01 01 00 00 00
+0021e0: 00 00 01 01 01 01 00 00 00 00 01 01 01 01 00 00
+0021f0: 00 00 01 01 01 00 00 00 00 00 00 01 01 01 00 00
+002200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+002210: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+002220: 00 00 01 01 01 00 00 00 00 00 01 01 01 00 00 00
+002230: 00 00 01 01 01 01 00 00 00 01 01 01 01 00 00 00
+002240: 00 00 00 01 01 01 00 00 00 01 01 01 00 00 00 00
+002250: 00 00 00 01 01 01 00 00 01 01 01 01 00 00 00 00
+002260: 00 00 00 00 01 01 01 00 01 01 01 00 00 00 00 00
+002270: 00 00 00 00 01 01 01 00 01 01 01 00 00 00 00 00
+002280: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+002290: 00 00 00 00 00 01 01 01 01 01 00 00 00 00 00 00
+0022a0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0022b0: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+0022c0: 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00
+0022d0: 00 00 00 00 01 01 01 01 00 00 00 00 00 00 00 00
+0022e0: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+0022f0: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+002300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+002310: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+002320: 00 00 01 01 01 01 01 01 01 01 01 01 01 00 00 00
+002330: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+002340: 00 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00
+002350: 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00
+002360: 00 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00
+002370: 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00
+002380: 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00 00
+002390: 00 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00
+0023a0: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+0023b0: 00 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00
+0023c0: 00 00 00 01 01 01 00 00 00 00 00 00 00 00 00 00
+0023d0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00
+0023e0: 00 00 01 01 01 01 01 01 01 01 01 01 01 00 00 00
+0023f0: 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00 00 \ No newline at end of file
diff --git a/src/static/foreground/slime.h b/src/static/foreground/slime.h
new file mode 100644
index 0000000..98a4cb7
--- /dev/null
+++ b/src/static/foreground/slime.h
@@ -0,0 +1,3 @@
+#define HH_TM_SLIME_ANI_WALK_OFFSET HH_TM_SLIME_OFFSET
+#define HH_TM_SLIME_ANI_WALK_SIZE 4
+
diff --git a/src/static/foreground/slime.hex b/src/static/foreground/slime.hex
index ce20533..9ce574b 100644
--- a/src/static/foreground/slime.hex
+++ b/src/static/foreground/slime.hex
@@ -1,24 +1,70 @@
-;slime sprite
;indices: 4
-;23 32 56
-;25 51 45
-;70 130 50
-;117 167 67
-
-00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
-40: 00 00 00 00 01 01 01 01 01 01 00 00 00 00 00 00
-50: 00 00 00 01 03 03 03 03 03 03 01 00 00 00 00 00
-60: 00 00 01 03 03 03 03 03 03 03 03 01 00 00 00 00
-70: 00 01 03 03 03 03 03 03 03 01 02 03 01 00 00 00
-80: 01 03 03 03 01 02 03 03 03 01 01 03 03 01 00 00
-90: 01 03 03 03 01 01 03 03 03 03 03 03 03 03 01 00
-a0: 01 03 03 03 03 03 03 03 02 03 03 03 03 03 02 01
-b0: 01 02 03 03 03 03 03 03 03 03 03 03 03 02 02 01
-c0: 00 01 02 03 03 03 03 03 03 03 03 02 02 02 02 01
-d0: 00 00 01 02 02 03 03 03 02 02 02 02 02 02 01 00
-e0: 00 00 00 01 02 02 02 02 02 02 02 02 02 01 00 00
-f0: 00 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00
+;17 20 38
+;19 33 2d
+;46 82 32
+;75 a7 43
+000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000050: 00 00 00 00 02 02 02 02 02 02 02 02 00 00 00 00
+000060: 00 00 02 02 03 03 03 03 03 03 03 03 02 00 00 00
+000070: 00 01 03 03 03 03 03 03 03 03 01 01 03 02 00 00
+000080: 01 03 03 03 01 01 03 03 03 03 01 01 03 03 01 00
+000090: 01 03 03 03 01 01 03 03 03 03 03 03 03 03 03 01
+0000a0: 01 03 03 03 03 03 03 03 03 03 03 03 03 03 03 01
+0000b0: 01 02 03 03 03 03 03 03 02 03 03 03 03 03 02 01
+0000c0: 01 02 02 03 03 03 03 03 03 03 03 03 02 02 02 01
+0000d0: 00 01 02 02 03 03 03 03 03 03 02 02 02 02 01 00
+0000e0: 00 00 01 01 02 02 02 02 02 02 02 02 02 01 00 00
+0000f0: 00 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00
+000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000140: 00 00 00 00 02 02 02 02 02 02 02 02 00 00 00 00
+000150: 00 00 02 02 03 03 03 03 03 03 03 03 02 00 00 00
+000160: 00 01 03 03 03 03 03 03 03 03 03 03 03 02 00 00
+000170: 00 01 03 03 01 01 03 03 03 03 01 01 03 02 00 00
+000180: 00 01 03 03 01 01 03 03 03 03 01 01 03 03 01 00
+000190: 01 02 03 03 03 03 03 03 03 03 03 03 03 03 01 00
+0001a0: 01 02 02 03 03 03 03 03 03 03 03 03 03 03 03 01
+0001b0: 00 01 02 02 03 03 03 03 02 03 03 03 03 02 02 01
+0001c0: 00 01 01 02 02 03 03 03 03 03 03 02 02 02 02 01
+0001d0: 00 00 00 01 01 02 02 02 03 02 02 02 02 02 01 00
+0001e0: 00 00 00 00 00 01 01 01 02 02 02 02 02 01 00 00
+0001f0: 00 00 00 00 00 00 00 00 01 01 01 01 01 00 00 00
+000200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000220: 00 00 00 00 00 02 02 02 02 02 02 02 00 00 00 00
+000230: 00 00 00 02 02 03 03 03 03 03 03 03 02 00 00 00
+000240: 00 00 02 03 03 03 03 03 03 03 03 03 03 01 00 00
+000250: 00 01 03 03 01 01 03 03 03 03 01 01 03 01 00 00
+000260: 00 01 03 03 01 01 03 03 03 03 01 01 03 01 00 00
+000270: 00 01 03 03 03 03 03 03 03 03 03 03 03 01 00 00
+000280: 00 01 03 03 03 03 03 03 03 03 03 03 03 01 00 00
+000290: 00 01 02 03 03 03 03 03 03 03 03 03 03 01 00 00
+0002a0: 00 00 01 02 03 03 03 03 02 03 03 03 02 01 00 00
+0002b0: 00 00 01 02 02 03 03 03 03 03 03 03 02 01 00 00
+0002c0: 00 00 00 01 02 02 03 03 03 03 03 02 02 01 00 00
+0002d0: 00 00 00 01 02 02 02 03 03 02 02 02 02 01 00 00
+0002e0: 00 00 00 00 01 02 02 02 02 02 02 02 01 00 00 00
+0002f0: 00 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00
+000300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000310: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000320: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000330: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000340: 00 00 00 00 02 02 02 02 02 02 02 02 00 00 00 00
+000350: 00 00 00 02 03 03 03 03 03 03 03 03 02 02 00 00
+000360: 00 00 02 03 03 03 03 03 03 03 03 03 03 03 01 00
+000370: 00 00 02 03 01 01 03 03 03 03 01 01 03 03 01 00
+000380: 00 01 03 03 01 01 03 03 03 03 01 01 03 03 01 00
+000390: 00 01 03 03 03 03 03 03 03 03 03 03 03 03 02 01
+0003a0: 01 03 03 03 03 03 03 03 03 03 03 03 03 02 02 01
+0003b0: 01 02 02 03 03 03 03 03 02 03 03 03 02 02 01 00
+0003c0: 01 02 02 02 02 03 03 03 03 03 03 02 02 01 01 00
+0003d0: 00 01 02 02 02 02 02 03 02 02 02 01 01 00 00 00
+0003e0: 00 00 01 02 02 02 02 02 01 01 01 00 00 00 00 00
+0003f0: 00 00 00 01 01 01 01 01 00 00 00 00 00 00 00 00 \ No newline at end of file
diff --git a/src/static/foreground/slime_jumpable.h b/src/static/foreground/slime_jumpable.h
new file mode 100644
index 0000000..1112591
--- /dev/null
+++ b/src/static/foreground/slime_jumpable.h
@@ -0,0 +1,4 @@
+#define HH_TM_SLIME_JUMPABLE_ANI_WALK_OFFSET HH_TM_SLIME_JUMPABLE_OFFSET
+#define HH_TM_SLIME_JUMPABLE_ANI_WALK_SIZE 4
+#define HH_TM_SLIME_JUMPABLE_ANI_JUMP_OFFSET HH_TM_SLIME_JUMPABLE_OFFSET + HH_TM_SLIME_JUMPABLE_ANI_WALK_SIZE
+#define HH_TM_SLIME_JUMPABLE_ANI_JUMP_SIZE 4
diff --git a/src/static/foreground/slime_jumpable.hex b/src/static/foreground/slime_jumpable.hex
new file mode 100644
index 0000000..e808df5
--- /dev/null
+++ b/src/static/foreground/slime_jumpable.hex
@@ -0,0 +1,134 @@
+;indices: 4
+;17 20 38
+;19 33 2d
+;46 82 32
+;75 a7 43
+
+000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000040: 00 00 00 00 00 00 02 02 02 02 00 00 00 00 00 00
+000050: 00 00 00 00 02 02 03 03 03 03 02 02 00 00 00 00
+000060: 00 00 02 02 03 03 03 03 03 03 03 03 02 00 00 00
+000070: 00 01 03 03 03 03 03 03 03 03 03 01 03 02 00 00
+000080: 01 03 03 03 03 01 03 03 03 03 03 01 03 03 01 00
+000090: 01 03 03 03 03 01 03 03 03 03 03 03 03 03 03 01
+0000a0: 01 03 03 03 03 03 03 02 03 02 03 03 03 03 03 01
+0000b0: 01 02 03 03 03 03 03 03 02 03 03 03 03 03 02 01
+0000c0: 01 02 02 03 03 03 03 03 03 03 03 03 02 02 02 01
+0000d0: 00 01 02 02 03 03 03 03 03 03 02 02 02 02 01 00
+0000e0: 00 00 01 01 02 02 02 02 02 02 02 02 02 01 00 00
+0000f0: 00 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00
+000100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000130: 00 00 00 00 00 00 00 02 02 02 00 00 00 00 00 00
+000140: 00 00 00 00 02 02 02 03 03 03 02 02 00 00 00 00
+000150: 00 00 02 02 03 03 03 03 03 03 03 03 02 00 00 00
+000160: 00 01 03 03 03 03 03 03 03 03 03 03 03 02 00 00
+000170: 00 01 03 03 03 01 03 03 03 03 03 01 03 02 00 00
+000180: 00 01 03 03 03 01 03 03 03 03 03 01 03 03 01 00
+000190: 01 02 03 03 03 03 03 03 03 03 03 03 03 03 01 00
+0001a0: 01 02 02 03 03 03 03 02 03 02 03 03 03 03 03 01
+0001b0: 00 01 02 02 03 03 03 03 02 03 03 03 03 02 02 01
+0001c0: 00 01 01 02 02 03 03 03 03 03 03 02 02 02 02 01
+0001d0: 00 00 00 01 01 02 02 02 03 02 02 02 02 02 01 00
+0001e0: 00 00 00 00 00 01 01 01 02 02 02 02 02 01 00 00
+0001f0: 00 00 00 00 00 00 00 00 01 01 01 01 01 00 00 00
+000200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000210: 00 00 00 00 02 02 02 02 02 02 02 00 00 00 00 00
+000220: 00 00 00 02 03 03 03 03 03 03 03 02 00 00 00 00
+000230: 00 00 02 03 03 03 03 03 03 03 03 03 02 00 00 00
+000240: 00 00 02 03 03 03 03 03 03 03 03 03 03 01 00 00
+000250: 00 01 03 03 03 01 03 03 03 03 03 01 03 01 00 00
+000260: 00 01 03 03 03 01 03 03 03 03 03 01 03 01 00 00
+000270: 00 01 03 03 03 03 03 03 03 03 03 03 03 01 00 00
+000280: 00 01 03 03 03 03 03 03 03 03 03 03 03 01 00 00
+000290: 00 01 02 03 03 03 03 02 03 02 03 03 03 01 00 00
+0002a0: 00 00 01 02 03 03 03 03 02 03 03 03 02 01 00 00
+0002b0: 00 00 01 02 02 03 03 03 03 03 03 03 02 01 00 00
+0002c0: 00 00 00 01 02 02 03 03 03 03 03 02 02 01 00 00
+0002d0: 00 00 00 01 02 02 02 03 03 02 02 02 02 01 00 00
+0002e0: 00 00 00 00 01 02 02 02 02 02 02 02 01 00 00 00
+0002f0: 00 00 00 00 00 01 01 01 01 01 01 01 00 00 00 00
+000300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000310: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000320: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000330: 00 00 00 00 00 00 02 02 02 00 00 00 00 00 00 00
+000340: 00 00 00 00 02 02 03 03 03 02 02 02 00 00 00 00
+000350: 00 00 00 02 03 03 03 03 03 03 03 03 02 02 00 00
+000360: 00 00 02 03 03 03 03 03 03 03 03 03 03 03 01 00
+000370: 00 00 02 03 03 01 03 03 03 03 03 01 03 03 01 00
+000380: 00 01 03 03 03 01 03 03 03 03 03 01 03 03 01 00
+000390: 00 01 03 03 03 03 03 03 03 03 03 03 03 03 02 01
+0003a0: 01 03 03 03 03 03 03 02 03 02 03 03 03 02 02 01
+0003b0: 01 02 02 03 03 03 03 03 02 03 03 03 02 02 01 00
+0003c0: 01 02 02 02 02 03 03 03 03 03 03 02 02 01 01 00
+0003d0: 00 01 02 02 02 02 02 03 02 02 02 01 01 00 00 00
+0003e0: 00 00 01 02 02 02 02 02 01 01 01 00 00 00 00 00
+0003f0: 00 00 00 01 01 01 01 01 00 00 00 00 00 00 00 00
+000400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000410: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000420: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000430: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000440: 00 00 00 00 00 00 02 02 02 02 00 00 00 00 00 00
+000450: 00 00 00 00 02 02 03 03 03 03 02 02 00 00 00 00
+000460: 00 00 02 02 03 03 03 03 03 03 03 03 02 00 00 00
+000470: 00 01 03 03 03 03 03 03 03 03 01 03 03 02 00 00
+000480: 01 03 03 03 03 01 03 03 03 03 01 03 03 03 01 00
+000490: 01 03 03 03 03 01 03 03 03 03 03 03 03 03 03 01
+0004a0: 01 03 03 03 03 03 03 02 03 02 03 03 03 03 03 01
+0004b0: 01 02 03 03 03 03 03 03 02 03 03 03 03 03 02 01
+0004c0: 01 02 02 03 03 03 03 03 03 03 03 03 02 02 02 01
+0004d0: 00 01 02 02 03 03 03 03 03 03 02 02 02 02 01 00
+0004e0: 00 00 01 01 02 02 02 02 02 02 02 02 02 01 00 00
+0004f0: 00 00 00 00 01 01 01 01 01 01 01 01 01 00 00 00
+000500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000510: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000520: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000530: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000540: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000550: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000560: 00 00 00 00 02 02 02 02 02 02 02 00 00 00 00 00
+000570: 00 00 02 02 03 03 03 03 03 03 03 02 02 00 00 00
+000580: 00 01 03 03 03 03 03 03 03 03 01 03 03 02 00 00
+000590: 01 03 03 03 03 01 03 03 03 03 01 03 03 03 01 00
+0005a0: 01 03 03 03 03 01 03 03 03 03 03 03 03 03 03 01
+0005b0: 01 03 03 03 03 03 03 02 03 02 03 03 03 03 03 01
+0005c0: 01 02 03 03 03 03 03 03 02 03 03 03 03 03 02 01
+0005d0: 01 02 02 03 03 03 03 03 03 03 03 03 02 02 02 01
+0005e0: 00 01 02 02 02 02 02 02 02 02 02 02 02 02 01 00
+0005f0: 00 00 01 01 01 01 01 01 01 01 01 01 01 01 00 00
+000600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000610: 00 00 00 00 00 00 02 02 02 00 00 00 00 00 00 00
+000620: 00 00 00 00 02 02 03 03 03 02 02 00 00 00 00 00
+000630: 00 00 00 02 03 03 03 03 03 03 03 02 00 00 00 00
+000640: 00 00 01 03 03 03 03 03 03 03 01 03 01 00 00 00
+000650: 00 01 03 03 03 01 03 03 03 03 01 03 01 00 00 00
+000660: 00 01 03 03 03 01 03 03 03 03 03 03 03 01 00 00
+000670: 00 01 03 03 03 03 03 02 03 02 03 03 03 01 00 00
+000680: 00 00 01 02 03 03 03 03 02 03 03 03 02 01 00 00
+000690: 00 00 00 01 02 03 03 03 03 03 03 02 01 00 00 00
+0006a0: 00 00 00 00 01 02 03 03 03 03 02 02 01 00 00 00
+0006b0: 00 00 00 00 01 02 02 03 03 02 02 01 00 00 00 00
+0006c0: 00 00 00 00 00 01 02 02 03 02 01 00 00 00 00 00
+0006d0: 00 00 00 00 00 00 01 02 02 01 00 00 00 00 00 00
+0006e0: 00 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00
+0006f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+000700: 00 00 00 00 00 00 02 02 02 00 00 00 00 00 00 00
+000710: 00 00 00 00 02 02 03 03 03 02 02 00 00 00 00 00
+000720: 00 00 00 02 03 03 03 03 03 03 03 02 00 00 00 00
+000730: 00 00 01 03 03 03 03 03 03 03 01 03 02 00 00 00
+000740: 00 01 03 03 03 01 03 03 03 03 01 03 03 01 00 00
+000750: 00 01 03 03 03 01 03 03 03 03 03 03 03 03 01 00
+000760: 00 01 03 03 03 03 03 02 03 02 03 03 03 03 01 00
+000770: 00 01 02 03 03 03 03 03 02 03 03 03 03 02 01 00
+000780: 00 01 02 02 03 03 03 03 03 03 03 03 02 02 01 00
+000790: 00 00 01 02 02 03 03 03 03 03 03 03 02 01 00 00
+0007a0: 00 00 00 01 01 02 02 03 03 03 02 02 01 00 00 00
+0007b0: 00 00 00 00 00 01 01 02 02 02 01 01 00 00 00 00
+0007c0: 00 00 00 00 00 00 00 01 01 01 00 00 00 00 00 00
+0007d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+0007e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+0007f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \ No newline at end of file