379 lines
11 KiB
C
379 lines
11 KiB
C
#include <gint/gint.h>
|
|
#include <gint/hardware.h>
|
|
#include <gint/kmalloc.h>
|
|
#include <gint/display.h>
|
|
|
|
#include <libprof.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <SDL/SDL.h>
|
|
#include <SDL/SDL_gfxPrimitives.h>
|
|
#include <SDL/SDL_image.h>
|
|
|
|
#include "clock.h"
|
|
|
|
|
|
#define GRID_H 10
|
|
#define GRID_W 16
|
|
#define CELL_SIZE 15
|
|
|
|
#define SCREEN_W 396
|
|
#define SCREEN_H 224
|
|
|
|
#define GRID_CENTER_X (SCREEN_W/2-40)
|
|
#define GRID_Y (SCREEN_H-14)
|
|
|
|
SDL_Surface* screen = NULL;
|
|
SDL_Surface* background = NULL;
|
|
SDL_Surface* blocks = NULL;
|
|
cSDL_Font *font;
|
|
|
|
typedef struct
|
|
{
|
|
char color;
|
|
bool marked;
|
|
bool next;
|
|
} block;
|
|
|
|
block GridBoard[GRID_W][GRID_H];
|
|
|
|
|
|
uint32_t timerstart=0;
|
|
uint32_t currenttimer=0;
|
|
float currentX=0;
|
|
|
|
uint32_t time_frame=0;
|
|
|
|
|
|
void drawGrid( SDL_Surface *surf )
|
|
{
|
|
for(int x=0; x<GRID_W/2; x++)
|
|
{
|
|
for(int y=0; y<GRID_H; y++)
|
|
{
|
|
rectangleRGBA( surf, GRID_CENTER_X-x*CELL_SIZE, GRID_Y-y*CELL_SIZE, GRID_CENTER_X-(x+1)*CELL_SIZE, GRID_Y-(y+1)*CELL_SIZE, 0, 0, 0, 255 );
|
|
rectangleRGBA( surf, GRID_CENTER_X+x*CELL_SIZE, GRID_Y-y*CELL_SIZE, GRID_CENTER_X+(x+1)*CELL_SIZE, GRID_Y-(y+1)*CELL_SIZE, 0, 0, 0, 255 );
|
|
}
|
|
}
|
|
for(int x=0; x<=GRID_W/2; x++)
|
|
{
|
|
for(int y=0; y<=GRID_H; y++)
|
|
{
|
|
rectangleRGBA( surf, GRID_CENTER_X-x*CELL_SIZE-1, GRID_Y-y*CELL_SIZE-1, GRID_CENTER_X-x*CELL_SIZE+1, GRID_Y-y*CELL_SIZE+1, 0, 0, 0, 255 );
|
|
rectangleRGBA( surf, GRID_CENTER_X+x*CELL_SIZE-1, GRID_Y-y*CELL_SIZE-1, GRID_CENTER_X+x*CELL_SIZE+1, GRID_Y-y*CELL_SIZE+1, 0, 0, 0, 255 );
|
|
}
|
|
}
|
|
rectangleRGBA(surf, GRID_CENTER_X-GRID_W/2*CELL_SIZE-1, GRID_Y-GRID_H*CELL_SIZE-1, GRID_CENTER_X+GRID_W/2*CELL_SIZE+1, GRID_Y+1, 0, 0, 0, 255 );
|
|
}
|
|
|
|
void drawBlock( SDL_Surface *surf, unsigned int cellX, unsigned int cellY, unsigned char blockColor )
|
|
{
|
|
if (blockColor==-1) return; // this is an empty cell;
|
|
|
|
|
|
SDL_Rect srcrect, dstrect;
|
|
|
|
int theme = blockColor / 2;
|
|
|
|
if (blockColor%2==0)
|
|
{
|
|
srcrect.x = theme*15;
|
|
srcrect.y = 0;
|
|
srcrect.h = 14;
|
|
srcrect.w = 14;
|
|
}
|
|
else
|
|
{
|
|
srcrect.x = theme*15;
|
|
srcrect.y = 15;
|
|
srcrect.h = 14;
|
|
srcrect.w = 14;
|
|
}
|
|
|
|
dstrect.x = GRID_CENTER_X-GRID_W/2*CELL_SIZE+cellX*CELL_SIZE+1;
|
|
dstrect.y = GRID_Y-(cellY+1)*CELL_SIZE+1;
|
|
dstrect.h = 14;
|
|
dstrect.w = 14;
|
|
|
|
SDL_BlitSurface(blocks, &srcrect, surf, &dstrect);
|
|
}
|
|
|
|
void drawBackground( SDL_Surface *surf )
|
|
{
|
|
SDL_BlitSurface(background, NULL, surf, NULL);
|
|
}
|
|
|
|
void drawSweepLine( SDL_Surface *surf, uint32_t deltat, uint8_t speed, float *currentpositionX )
|
|
{
|
|
float x = *currentpositionX;
|
|
x+=(float) (deltat*speed)/100.0f;
|
|
|
|
if (x>GRID_W*CELL_SIZE) x=0;
|
|
|
|
*currentpositionX=x;
|
|
|
|
for(int y=1; y<20; y++)
|
|
if (x-y>=0) lineRGBA( surf, GRID_CENTER_X-GRID_W/2*CELL_SIZE+x-y, GRID_Y-GRID_H*CELL_SIZE-1, GRID_CENTER_X-GRID_W/2*CELL_SIZE+x-y, GRID_Y+1, 255, 255, 0, 255-y*10 );
|
|
else lineRGBA( surf, GRID_CENTER_X+GRID_W/2*CELL_SIZE+x-y, GRID_Y-GRID_H*CELL_SIZE-1, GRID_CENTER_X+GRID_W/2*CELL_SIZE+x-y, GRID_Y+1, 255, 255, 0, 255-y*10 );
|
|
|
|
lineRGBA( surf, GRID_CENTER_X-GRID_W/2*CELL_SIZE+x, GRID_Y-GRID_H*CELL_SIZE-1, GRID_CENTER_X-GRID_W/2*CELL_SIZE+x, GRID_Y+1, 255, 255, 0, 255 );
|
|
lineRGBA( surf, GRID_CENTER_X-GRID_W/2*CELL_SIZE+x+1, GRID_Y-GRID_H*CELL_SIZE-1, GRID_CENTER_X-GRID_W/2*CELL_SIZE+x+1, GRID_Y+1, 255, 255, 0, 255 );
|
|
}
|
|
|
|
void initBoard( void )
|
|
{
|
|
srand( 0 );
|
|
|
|
for(int x=0; x<GRID_W; x++)
|
|
{
|
|
for(int y=0; y<GRID_H; y++)
|
|
{
|
|
GridBoard[x][y].color = (char) rand()%2;
|
|
if (GridBoard[x][y].color<0) GridBoard[x][y].color=0;
|
|
if (GridBoard[x][y].color>9) GridBoard[x][y].color=9;
|
|
GridBoard[x][y].marked = false;
|
|
GridBoard[x][y].next = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
void drawBlockGrid( SDL_Surface *surf )
|
|
{
|
|
for(int x=0; x<GRID_W; x++)
|
|
{
|
|
for(int y=0; y<GRID_H; y++)
|
|
{
|
|
drawBlock( surf, x, y, (int) GridBoard[x][y].color );
|
|
}
|
|
}
|
|
}
|
|
|
|
void checkSquareGroups( SDL_Surface *surf, float currentSweepX )
|
|
{
|
|
/*int column = 0;
|
|
if (currentSweepX<CELL_SIZE) column = GRID_W-1;
|
|
else column=(int) currentSweepX/CELL_SIZE - 1;
|
|
*/
|
|
int column = (int) currentSweepX/CELL_SIZE;
|
|
|
|
for(int x=0; x<GRID_W-1; x++)
|
|
{
|
|
for(int y=0; y<GRID_H-1; y++)
|
|
{
|
|
if (GridBoard[x][y].color==-1) break; // the cell is empty so we can jump to next column
|
|
|
|
if (GridBoard[x][y].color==GridBoard[x+1][y].color && GridBoard[x][y].color==GridBoard[x][y+1].color && GridBoard[x][y].color==GridBoard[x+1][y+1].color)
|
|
{
|
|
boxRGBA( surf, GRID_CENTER_X-GRID_W/2*CELL_SIZE+x*CELL_SIZE+1, GRID_Y-(y+1)*CELL_SIZE+1, GRID_CENTER_X-GRID_W/2*CELL_SIZE+(x+1)*CELL_SIZE-1, GRID_Y-(y)*CELL_SIZE-1, 255, 255, 0, 172 );
|
|
boxRGBA( surf, GRID_CENTER_X-GRID_W/2*CELL_SIZE+(x+1)*CELL_SIZE+1, GRID_Y-(y+1)*CELL_SIZE+1, GRID_CENTER_X-GRID_W/2*CELL_SIZE+(x+2)*CELL_SIZE-1, GRID_Y-(y)*CELL_SIZE-1, 255, 255, 0, 172 );
|
|
boxRGBA( surf, GRID_CENTER_X-GRID_W/2*CELL_SIZE+x*CELL_SIZE+1, GRID_Y-(y+2)*CELL_SIZE+1, GRID_CENTER_X-GRID_W/2*CELL_SIZE+(x+1)*CELL_SIZE-1, GRID_Y-(y+1)*CELL_SIZE-1, 255, 255, 0, 172 );
|
|
boxRGBA( surf, GRID_CENTER_X-GRID_W/2*CELL_SIZE+(x+1)*CELL_SIZE+1, GRID_Y-(y+2)*CELL_SIZE+1, GRID_CENTER_X-GRID_W/2*CELL_SIZE+(x+2)*CELL_SIZE-1, GRID_Y-(y+1)*CELL_SIZE-1, 255, 255, 0, 172 );
|
|
GridBoard[x][y].marked = true;
|
|
GridBoard[x+1][y].marked = true;
|
|
GridBoard[x][y+1].marked = true;
|
|
GridBoard[x+1][y+1].marked = true;
|
|
|
|
if (x<column+1) GridBoard[x][y].next = true;
|
|
else GridBoard[x][y].next = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void updateColumn( SDL_Surface *surf, float currentSweepX )
|
|
{
|
|
int column = 0;
|
|
if (currentSweepX<CELL_SIZE) column = GRID_W-1;
|
|
else column=(int) currentSweepX/CELL_SIZE - 1;
|
|
|
|
for(int y=0; y<GRID_H; y++)
|
|
{
|
|
if ((GridBoard[column][y].marked==true && GridBoard[column][y].next==false) || GridBoard[column][y].color==-1)
|
|
{
|
|
if (y!=GRID_H-1)
|
|
{
|
|
GridBoard[column][y].color=GridBoard[column][y+1].color;
|
|
GridBoard[column][y].marked=GridBoard[column][y+1].marked;
|
|
|
|
GridBoard[column][y+1].color=-1;
|
|
GridBoard[column][y+1].marked=false;
|
|
}
|
|
else
|
|
{
|
|
GridBoard[column][y].color=-1;
|
|
GridBoard[column][y].marked=false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool canWeAllocate3Mb = false;
|
|
|
|
void increaseRAM( void )
|
|
{
|
|
char const *osv = (char*) 0x80020020;
|
|
static kmalloc_arena_t extended_ram = { 0 };
|
|
|
|
if((!strncmp(osv, "03.", 3) && osv[3] <= '6') && gint[HWCALC] == HWCALC_FXCG50) // CG-50
|
|
{
|
|
extended_ram.name = "extram";
|
|
extended_ram.is_default = true;
|
|
extended_ram.start = (void *)0x8c200000;
|
|
extended_ram.end = (void *)0x8c500000 ;
|
|
|
|
kmalloc_init_arena(&extended_ram, true);
|
|
kmalloc_add_arena(&extended_ram );
|
|
canWeAllocate3Mb = true;
|
|
}
|
|
else if (gint[HWCALC] == HWCALC_PRIZM) // CG-10/20
|
|
{
|
|
|
|
extended_ram.name = "extram";
|
|
extended_ram.is_default = true;
|
|
|
|
uint16_t *vram1, *vram2;
|
|
dgetvram(&vram1, &vram2);
|
|
dsetvram(vram1, vram1);
|
|
|
|
extended_ram.start = vram2;
|
|
extended_ram.end = (char *)vram2 + 396*224*2;
|
|
|
|
kmalloc_init_arena(&extended_ram, true);
|
|
kmalloc_add_arena(&extended_ram );
|
|
canWeAllocate3Mb = false;
|
|
|
|
}
|
|
else if (gint[HWCALC] == HWCALC_FXCG_MANAGER) // CG-50 EMULATOR
|
|
{
|
|
|
|
extended_ram.name = "extram";
|
|
extended_ram.is_default = true;
|
|
extended_ram.start = (void *)0x88200000;
|
|
extended_ram.end = (void *)0x88500000 ;
|
|
|
|
kmalloc_init_arena(&extended_ram, true);
|
|
kmalloc_add_arena(&extended_ram );
|
|
canWeAllocate3Mb = true;
|
|
|
|
}
|
|
else abort();
|
|
}
|
|
|
|
int main ( int argc, char** argv )
|
|
{
|
|
increaseRAM();
|
|
|
|
overclock_level levelOCinit = overclock_detect( );
|
|
clock_overclock( OC_PtuneF5 );
|
|
|
|
prof_init();
|
|
prof_t perf;
|
|
|
|
if (SDL_Init(SDL_INIT_VIDEO)<0) return 1;
|
|
SDL_ShowCursor(SDL_DISABLE);
|
|
|
|
|
|
screen = SDL_SetVideoMode(396, 224, 16, SDL_SWSURFACE);
|
|
//if (!screen) return 1;
|
|
|
|
IMG_Init( IMG_INIT_PNG | IMG_INIT_JPG );
|
|
font = cSDL_LoadFont(cSDL_FONT_TINYTYPE, 255, 255, 255);
|
|
|
|
background = SDL_ConvertSurface( (SDL_Surface*) gint_world_switch( GINT_CALL( IMG_Load, "./Lumines/Backgrounds/back002.jpg" ) ),
|
|
screen->format, SDL_SWSURFACE );
|
|
//if (!background) return 1;
|
|
|
|
blocks = SDL_ConvertSurface( (SDL_Surface*) gint_world_switch( GINT_CALL( IMG_Load, "./Lumines/Blocks/test.png" ) ),
|
|
screen->format, SDL_SWSURFACE );
|
|
//if (!blocks) return 1;
|
|
|
|
initBoard( );
|
|
|
|
timerstart=0;
|
|
|
|
bool done = false;
|
|
while (!done)
|
|
{
|
|
perf = prof_make();
|
|
prof_enter(perf);
|
|
|
|
currenttimer=SDL_GetTicks();
|
|
uint32_t deltatimer = currenttimer-timerstart;
|
|
timerstart=currenttimer;
|
|
|
|
// message processing loop
|
|
SDL_Event event;
|
|
while (SDL_PollEvent(&event))
|
|
{
|
|
// check for messages
|
|
switch (event.type)
|
|
{
|
|
// exit if the window is closed
|
|
case SDL_QUIT:
|
|
done = true;
|
|
break;
|
|
|
|
// check for keypresses
|
|
case SDL_KEYDOWN:
|
|
{
|
|
// exit if ESCAPE is pressed
|
|
if (event.key.keysym.sym == SDLK_PRZ_KEY_EXIT)
|
|
done = true;
|
|
break;
|
|
}
|
|
} // end switch
|
|
} // end of message processing
|
|
|
|
//SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 127, 127, 127));
|
|
drawBackground( screen );
|
|
|
|
drawGrid( screen );
|
|
|
|
/* drawBlock( screen, 0, 0, 0 );
|
|
drawBlock( screen, 0, 1, 1 );
|
|
|
|
drawBlock( screen, 2, 0, 2 );
|
|
drawBlock( screen, 2, 1, 3 );
|
|
|
|
drawBlock( screen, 4, 0, 4 );
|
|
drawBlock( screen, 4, 1, 5 );
|
|
|
|
drawBlock( screen, 6, 0, 6 );
|
|
drawBlock( screen, 6, 1, 7 );
|
|
|
|
drawBlock( screen, 8, 0, 8 );
|
|
drawBlock( screen, 8, 1, 9 );
|
|
*/
|
|
|
|
drawBlockGrid( screen );
|
|
|
|
checkSquareGroups( screen, currentX );
|
|
|
|
updateColumn( screen, currentX );
|
|
|
|
drawSweepLine( screen, deltatimer, 1, ¤tX );
|
|
|
|
cSDL_DrawString( screen, font, 10, 10, "Delta t: %d", time_frame/1000 );
|
|
|
|
cSDL_DrawString( screen, font, 10, 20, "Hello !!" );
|
|
|
|
SDL_Flip(screen);
|
|
|
|
prof_leave(perf);
|
|
time_frame = prof_time(perf);
|
|
} // end main loop
|
|
|
|
|
|
SDL_FreeSurface( blocks );
|
|
SDL_FreeSurface( background );
|
|
cSDL_FreeFont( font );
|
|
|
|
SDL_Quit();
|
|
|
|
clock_overclock( levelOCinit );
|
|
|
|
return 0;
|
|
}
|