diff options
Diffstat (limited to 'src')
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(); @@ -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 |