#include <nds.h>
#include <stdio.h>
#include <maxmod9.h>
#include <ctime>
#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;
}
}
}
Comments