#include #include #include #include #include "Mem_int.h" #include "Divmod.h" #include "images.h" #include "soundbank.h" #include "soundbank_bin.h" using namespace std; #define MAX_IMG 36 #define LCD_X 256 #define LCD_Y 192 vu32 vframe = 0; bool g_auto_run; //glb store for array idx- typedef struct{ u32 imgNum; u32 imgNumSub; u32 prevImgNum; u32 prevImgNumSub; } ImgIdx; void InitImgSystem(ImgIdx* ImgSys, const u32* nameSet[]); void UpdateImgSystem(ImgIdx* ImgSys, const u32* nameSet[], touchPosition* data); void buttonChange(ImgIdx* ImgSys, const u32* nameSet[]); void touchChange(ImgIdx* ImgSys, const u32* nameSet[], touchPosition* data); void VBlankHandler() { vframe++; } int main(void) { irqEnable(IRQ_VBLANK); irqSet(IRQ_VBLANK, VBlankHandler); srand(time(NULL)); ImgIdx idx; touchPosition pad; g_auto_run = false; mmInitDefaultMem((mm_addr)soundbank_bin); mmLoad( MOD_PIANO2 ); mmStart( MOD_PIANO2, MM_PLAY_LOOP ); const u32* imgNames[] = { _S11IBitmap, _sz3tBitmap, qPqqBBitmap, QekDFBitmap, PgxwNBitmap, oWdtNBitmap, N8vGYBitmap, myObXhBitmap, MQHYBBitmap, lNk8UBitmap, L6KqSBitmap, IwbHgBitmap, if2K3Bitmap, GvvZbBitmap, _8pvOBitmap, _7be3Bitmap, wUZ2rBitmap, UwnCABitmap, twGxYBitmap, Tg7krBitmap, TbwWnBitmap, TbMXIBitmap, skSpOBitmap, rkfEKBitmap, _gf5sBitmap, _MUiJBitmap, _nDbnBitmap, _C6luBitmap, _cHkJBitmap, _EI7eBitmap, _6lUbBitmap, _4ReeBitmap, _9U23Bitmap, rFOlvBitmap, WScaBBitmap, lkem4Bitmap }; //engine modes ------------ videoSetMode(MODE_5_2D); videoSetModeSub(MODE_5_2D); //engine banks ------------ vramSetBankA(VRAM_A_MAIN_BG); vramSetBankC(VRAM_C_SUB_BG); // set up our bitmap backgrounds, both engines bgInit(3, BgType_Bmp16, BgSize_B16_256x256, 0,0); bgInitSub(3, BgType_Bmp16, BgSize_B16_256x256, 0,0); InitImgSystem(&idx, imgNames); while(1) { swiWaitForVBlank(); scanKeys(); touchRead(&pad); if(keysDown() & KEY_R) { if(g_auto_run) { g_auto_run = false; } else { g_auto_run = true; } } UpdateImgSystem(&idx, imgNames, &pad); } return 0; } void InitImgSystem(ImgIdx* ImgSys, const u32* nameSet[]) { //pick 1st pic--------------------------------------------- ImgSys->imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); ImgSys->imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); ImgSys->prevImgNum = 0; ImgSys->prevImgNumSub = 0; //make sure the first picture is never the same------------ while(ImgSys->imgNum == ImgSys->imgNumSub) { ImgSys->imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); } decompress(nameSet[ImgSys->imgNum], BG_GFX, LZ77Vram); decompress(nameSet[ImgSys->imgNumSub], BG_GFX_SUB, LZ77Vram); } void UpdateImgSystem(ImgIdx* ImgSys, const u32* nameSet[], touchPosition* data) { buttonChange(ImgSys, nameSet); touchChange(ImgSys, nameSet, data); } void buttonChange(ImgIdx* ImgSys, const u32* nameSet[]) { if(!g_auto_run) { if(keysDown() & KEY_A) { u32 l_imgNum = ImgSys->imgNum; u32 l_imgNumSub = ImgSys->imgNumSub; u32 l_prevImgNum = ImgSys->prevImgNum; l_prevImgNum = l_imgNum; l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); while((l_imgNum == l_prevImgNum) || (l_imgNum == l_imgNumSub)) { l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); } ImgSys->imgNum = l_imgNum; ImgSys->prevImgNum = l_prevImgNum; Memset8(BG_GFX, 0, 0x20000); decompress(nameSet[l_imgNum], BG_GFX, LZ77Vram); } else if(keysDown() & KEY_B) { u32 l_imgNum = ImgSys->imgNum; u32 l_imgNumSub = ImgSys->imgNumSub; u32 l_prevImgNumSub = ImgSys->prevImgNumSub; l_prevImgNumSub = l_imgNumSub; l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); while((l_imgNumSub == l_prevImgNumSub) || (l_imgNumSub == l_imgNum)) { l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); } ImgSys->imgNumSub = l_imgNumSub; ImgSys->prevImgNumSub = l_prevImgNumSub; Memset8(BG_GFX_SUB, 0, 0x20000); decompress(nameSet[l_imgNumSub], BG_GFX_SUB, LZ77Vram); } else if(keysDown() & KEY_L) { u32 l_imgNum = ImgSys->imgNum; u32 l_imgNumSub = ImgSys->imgNumSub; u32 l_prevImgNum = ImgSys->prevImgNum; u32 l_prevImgNumSub = ImgSys->prevImgNumSub; l_prevImgNum = l_imgNum; l_prevImgNumSub = l_imgNumSub; l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); while((l_imgNum == l_prevImgNum) || (l_imgNumSub == l_prevImgNumSub) || (l_imgNum == l_imgNumSub)) { if(l_imgNum == l_prevImgNum) { l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); } else if(l_imgNumSub == l_prevImgNumSub) { l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); } else if(l_imgNum == l_imgNumSub) { l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); } } ImgSys->imgNum = l_imgNum; ImgSys->prevImgNum = l_prevImgNum; ImgSys->imgNumSub = l_imgNumSub; ImgSys->prevImgNumSub = l_prevImgNumSub; Memset8(BG_GFX, 0, 0x20000); Memset8(BG_GFX_SUB, 0, 0x20000); decompress(nameSet[l_imgNum], BG_GFX, LZ77Vram); decompress(nameSet[l_imgNumSub], BG_GFX_SUB, LZ77Vram); } } else { if(DivmodUnsigned(vframe, 360, MOD) == 1) { u32 l_imgNum = ImgSys->imgNum; u32 l_imgNumSub = ImgSys->imgNumSub; u32 l_prevImgNum = ImgSys->prevImgNum; u32 l_prevImgNumSub = ImgSys->prevImgNumSub; l_prevImgNum = l_imgNum; l_prevImgNumSub = l_imgNumSub; l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); while((l_imgNum == l_prevImgNum) || (l_imgNumSub == l_prevImgNumSub) || (l_imgNum == l_imgNumSub)) { if(l_imgNum == l_prevImgNum) { l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); } else if(l_imgNumSub == l_prevImgNumSub) { l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); } else if(l_imgNum == l_imgNumSub) { l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); } } ImgSys->imgNum = l_imgNum; ImgSys->prevImgNum = l_prevImgNum; ImgSys->imgNumSub = l_imgNumSub; ImgSys->prevImgNumSub = l_prevImgNumSub; Memset8(BG_GFX, 0, 0x20000); Memset8(BG_GFX_SUB, 0, 0x20000); decompress(nameSet[l_imgNum], BG_GFX, LZ77Vram); decompress(nameSet[l_imgNumSub], BG_GFX_SUB, LZ77Vram); } } } void touchChange(ImgIdx* ImgSys, const u32* nameSet[], touchPosition* data) { if(!g_auto_run) { u32 l_px = data->px; u32 l_py = data->py; if((keysDown() & KEY_TOUCH) && ((l_px < (LCD_X / 2)) && (l_py < (LCD_Y / 2)))) { u32 l_imgNum = ImgSys->imgNum; u32 l_imgNumSub = ImgSys->imgNumSub; u32 l_prevImgNum = ImgSys->prevImgNum; l_prevImgNum = l_imgNum; l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); while((l_imgNum == l_prevImgNum) || (l_imgNum == l_imgNumSub)) { l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); } ImgSys->imgNum = l_imgNum; ImgSys->prevImgNum = l_prevImgNum; Memset8(BG_GFX, 0, 0x20000); decompress(nameSet[l_imgNum], BG_GFX, LZ77Vram); } else if((keysDown() & KEY_TOUCH) && ((l_px >= (LCD_X / 2)) && (l_py < (LCD_Y / 2)))) { u32 l_imgNum = ImgSys->imgNum; u32 l_imgNumSub = ImgSys->imgNumSub; u32 l_prevImgNumSub = ImgSys->prevImgNumSub; l_prevImgNumSub = l_imgNumSub; l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); while((l_imgNumSub == l_prevImgNumSub) || (l_imgNumSub == l_imgNum)) { l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); } ImgSys->imgNumSub = l_imgNumSub; ImgSys->prevImgNumSub = l_prevImgNumSub; Memset8(BG_GFX_SUB, 0, 0x20000); decompress(nameSet[l_imgNumSub], BG_GFX_SUB, LZ77Vram); } else if((keysDown() & KEY_TOUCH) && ((l_px < (LCD_X / 2)) && (l_py >= (LCD_Y / 2)))) { u32 l_imgNum = ImgSys->imgNum; u32 l_imgNumSub = ImgSys->imgNumSub; u32 l_prevImgNum = ImgSys->prevImgNum; u32 l_prevImgNumSub = ImgSys->prevImgNumSub; l_prevImgNum = l_imgNum; l_prevImgNumSub = l_imgNumSub; l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); while((l_imgNum == l_prevImgNum) || (l_imgNumSub == l_prevImgNumSub) || (l_imgNum == l_imgNumSub)) { if(l_imgNum == l_prevImgNum) { l_imgNum = DivmodUnsigned(rand(), MAX_IMG, MOD); } else if(l_imgNumSub == l_prevImgNumSub) { l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); } else if(l_imgNum == l_imgNumSub) { l_imgNumSub = DivmodUnsigned(rand(), MAX_IMG, MOD); } } ImgSys->imgNum = l_imgNum; ImgSys->prevImgNum = l_prevImgNum; ImgSys->imgNumSub = l_imgNumSub; ImgSys->prevImgNumSub = l_prevImgNumSub; Memset8(BG_GFX, 0, 0x20000); Memset8(BG_GFX_SUB, 0, 0x20000); decompress(nameSet[l_imgNum], BG_GFX, LZ77Vram); decompress(nameSet[l_imgNumSub], BG_GFX_SUB, LZ77Vram); } } u32 l_px = data->px; u32 l_py = data->py; if((keysDown() & KEY_TOUCH) && ((l_px >= (LCD_X / 2)) && (l_py >= (LCD_Y / 2)))) { if(g_auto_run) { g_auto_run = false; } else { g_auto_run = true; } } }