diff --git a/sample/game/sonic/inc/level.h b/sample/game/sonic/inc/level.h index 5cd40da8..75b661cb 100644 --- a/sample/game/sonic/inc/level.h +++ b/sample/game/sonic/inc/level.h @@ -23,7 +23,7 @@ void LEVEL_updateMapAlternate(VDPPlane plane, Map* map, s16 xmt, s16 ymt); void LEVEL_updateVDPScroll(); void LEVEL_onVBlank(void); -void LEVEL_handleInput(u16 value); +void LEVEL_doJoyAction(u16 joy, u16 changed, u16 state); #endif // _LEVEL_H_ diff --git a/sample/game/sonic/out/rom.bin b/sample/game/sonic/out/rom.bin index c080df96..9273efea 100644 Binary files a/sample/game/sonic/out/rom.bin and b/sample/game/sonic/out/rom.bin differ diff --git a/sample/game/sonic/src/level.c b/sample/game/sonic/src/level.c index 9af5243b..942e2b78 100644 --- a/sample/game/sonic/src/level.c +++ b/sample/game/sonic/src/level.c @@ -21,6 +21,10 @@ Map *bga; u16 bgBaseTileIndex[2]; +// forward +static void PatchDataCallback(Map *map, u16 *buf, u16 x, u16 y, MapUpdateType updateType, u16 size); + + u16 LEVEL_init(u16 vramIndex) { u16 ind; @@ -167,9 +171,45 @@ void LEVEL_updateMapAlternate(VDPPlane plane, Map* map, s16 xmt, s16 ymt) } +void LEVEL_doJoyAction(u16 joy, u16 changed, u16 state) +{ + if (changed & state & BUTTON_X) + { + if (bga->mapDataPatchCB != NULL) MAP_setDataPatchCallback(bga, NULL); + else MAP_setDataPatchCallback(bga, PatchDataCallback); + } +} + + void LEVEL_onVBlank(void) { // reset tilemap buffer position after update bufOffset = 0; } + +static void PatchDataCallback(Map *map, u16 *buf, u16 x, u16 y, MapUpdateType updateType, u16 size) +{ + u16* dst = buf; + u16 xt = x; + u16 yt = y; + u16 i = size; + + while(i--) + { + u16 tileData = *dst; + + // remove palette info + tileData &= ~TILE_ATTR_PALETTE_MASK; + // set palette depending tile position (just for fun) + tileData |= ((xt ^ yt) & 3) << TILE_ATTR_PALETTE_SFT; + + // set back tile data + *dst++ = tileData; + + // just to keep track of current tile position + if (updateType == ROW_UPDATE) xt++; + else yt++; + } +} + diff --git a/sample/game/sonic/src/main.c b/sample/game/sonic/src/main.c index cb171943..0ea29d42 100644 --- a/sample/game/sonic/src/main.c +++ b/sample/game/sonic/src/main.c @@ -139,9 +139,10 @@ static void joyEvent(u16 joy, u16 changed, u16 state) // can't do more in paused state if (paused) return; - // handle player / camera joy actions + // handle player / camera / level joy actions PLAYER_doJoyAction(joy, changed, state); CAMERA_doJoyAction(joy, changed, state); + LEVEL_doJoyAction(joy, changed, state); } static void vblank() diff --git a/sample/game/sonic/src/player.c b/sample/game/sonic/src/player.c index 9c1dbd99..34f5b481 100644 --- a/sample/game/sonic/src/player.c +++ b/sample/game/sonic/src/player.c @@ -173,7 +173,7 @@ void PLAYER_handleInput(u16 value) void PLAYER_doJoyAction(u16 joy, u16 changed, u16 state) { - if (changed & state & (BUTTON_A | BUTTON_B | BUTTON_C | BUTTON_X | BUTTON_Y | BUTTON_Z)) + if (changed & state & (BUTTON_A | BUTTON_B | BUTTON_C)) { if (movY == 0) { diff --git a/sample/game/sonic/src/utils.c b/sample/game/sonic/src/utils.c index 189403ea..d37a0c01 100644 --- a/sample/game/sonic/src/utils.c +++ b/sample/game/sonic/src/utils.c @@ -13,4 +13,3 @@ void setSpritePosition(Sprite* sprite, s16 x, s16 y) SPR_setPosition(sprite, x, y); } } -