217 lines
3.8 KiB
C
217 lines
3.8 KiB
C
#include <psx.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
unsigned char puzzle_pieces[7][7];
|
|
unsigned char piece_taken[7 * 7];
|
|
|
|
int puzzle_x = 0, puzzle_y = 0;
|
|
|
|
volatile int display_is_old = 1;
|
|
|
|
void prog_vblank_handler()
|
|
{
|
|
display_is_old=1;
|
|
}
|
|
|
|
GsImage puzzle_image;
|
|
unsigned int prim_list[0x4000];
|
|
unsigned char data_buffer[0x40000]; // 256 kilobytes
|
|
|
|
int main()
|
|
{
|
|
int x, y, ex, ey;
|
|
int wasleft=0;
|
|
int wasright=0;
|
|
int wasup=0;
|
|
int wasdown=0;
|
|
int wasexh=0;
|
|
int wasexv=0;
|
|
int dbuf=0;
|
|
unsigned char b;
|
|
unsigned short padbuf;
|
|
FILE *f;
|
|
GsSprite tile_sprite;
|
|
GsRectangle tile_rectangle;
|
|
|
|
PSX_Init();
|
|
GsInit();
|
|
GsClearMem();
|
|
GsSetList(prim_list);
|
|
GsSetVideoMode(320, 240, EXAMPLES_VMODE);
|
|
|
|
f = fopen("cdrom:\\PUZZLE.TIM;1", "rb");
|
|
fseek(f, 0, SEEK_END);
|
|
x = ftell(f);
|
|
fseek(f, 0, SEEK_SET);
|
|
|
|
fread(data_buffer, sizeof(char), x, f);
|
|
fclose(f);
|
|
|
|
GsImageFromTim(&puzzle_image, data_buffer);
|
|
|
|
GsUploadImage(&puzzle_image);
|
|
while(GsIsDrawing());
|
|
|
|
GsLoadFont(768, 0, 768, 256);
|
|
while(GsIsDrawing());
|
|
|
|
tile_sprite.tpage = 5;
|
|
tile_sprite.w = 32;
|
|
tile_sprite.h = 32;
|
|
tile_sprite.attribute = COLORMODE(COLORMODE_16BPP);
|
|
tile_sprite.r = tile_sprite.g = tile_sprite.b = NORMAL_LUMINOSITY;
|
|
|
|
SetVBlankHandler(prog_vblank_handler);
|
|
|
|
for(x=0;x<sizeof(piece_taken);x++)
|
|
piece_taken[x] = 0;
|
|
|
|
for(y = 0; y < 7; y++)
|
|
{
|
|
for(x = 0; x < 7; x++)
|
|
{
|
|
do
|
|
{
|
|
puzzle_pieces[y][x] = (rand() % 49) + 1;
|
|
}while(piece_taken[puzzle_pieces[y][x]] == 1);
|
|
|
|
piece_taken[puzzle_pieces[y][x]] = 1;
|
|
}
|
|
}
|
|
|
|
while(1)
|
|
{
|
|
if(display_is_old)
|
|
{
|
|
GsSetDispEnvSimple(0, dbuf?256:0);
|
|
GsSetDrawEnvSimple(0, dbuf?0:256, 320, 240);
|
|
dbuf=!dbuf;
|
|
|
|
PSX_ReadPad(&padbuf, NULL);
|
|
|
|
if((padbuf & PAD_LEFT) && !wasleft)
|
|
{
|
|
if(puzzle_x>0)
|
|
puzzle_x--;
|
|
|
|
wasleft=1;
|
|
}
|
|
|
|
if((padbuf & PAD_RIGHT) && !wasright)
|
|
{
|
|
if(puzzle_x<6)
|
|
puzzle_x++;
|
|
|
|
wasright=1;
|
|
}
|
|
|
|
if((padbuf & PAD_UP) && !wasup)
|
|
{
|
|
if(puzzle_y>0)
|
|
puzzle_y--;
|
|
|
|
wasup=1;
|
|
}
|
|
|
|
if((padbuf & PAD_DOWN) && !wasdown)
|
|
{
|
|
if(puzzle_y<6)
|
|
puzzle_y++;
|
|
|
|
wasdown=1;
|
|
}
|
|
|
|
if(!(padbuf & PAD_LEFT))
|
|
wasleft=0;
|
|
|
|
if(!(padbuf & PAD_RIGHT))
|
|
wasright=0;
|
|
|
|
if(!(padbuf & PAD_UP))
|
|
wasup=0;
|
|
|
|
if(!(padbuf & PAD_DOWN))
|
|
wasdown=0;
|
|
|
|
if((padbuf & PAD_CROSS) && !wasexh) // x <--> y
|
|
{
|
|
ey = puzzle_y;
|
|
if(puzzle_x < 6)
|
|
ex = puzzle_x+1;
|
|
else
|
|
ex = puzzle_x-1;
|
|
|
|
b = puzzle_pieces[puzzle_y][puzzle_x];
|
|
puzzle_pieces[puzzle_y][puzzle_x] =
|
|
puzzle_pieces[ey][ex];
|
|
puzzle_pieces[ey][ex] = b;
|
|
|
|
wasexh=1;
|
|
}
|
|
|
|
if((padbuf & PAD_CIRCLE) && !wasexv)
|
|
{
|
|
ex = puzzle_x;
|
|
if(puzzle_y < 6)
|
|
ey = puzzle_y+1;
|
|
else
|
|
ey = puzzle_y-1;
|
|
|
|
b = puzzle_pieces[puzzle_y][puzzle_x];
|
|
puzzle_pieces[puzzle_y][puzzle_x] =
|
|
puzzle_pieces[ey][ex];
|
|
puzzle_pieces[ey][ex] = b;
|
|
|
|
wasexv=1;
|
|
}
|
|
|
|
if(!(padbuf & PAD_CROSS))
|
|
wasexh=0;
|
|
|
|
if(!(padbuf & PAD_CIRCLE))
|
|
wasexv=0;
|
|
|
|
GsSortCls(0, 0, 255);
|
|
|
|
for(y = 0; y < 7; y++)
|
|
{
|
|
for(x = 0; x < 7; x++)
|
|
{
|
|
tile_sprite.x = x * 32;
|
|
tile_sprite.y = y * 32;
|
|
tile_sprite.u = ((puzzle_pieces[y][x]-1) % 7) * 32;
|
|
tile_sprite.v = ((puzzle_pieces[y][x]-1) / 7) * 32;
|
|
GsSortSimpleSprite(&tile_sprite);
|
|
|
|
if(x == puzzle_x && y == puzzle_y)
|
|
{
|
|
tile_rectangle.x = x * 32;
|
|
tile_rectangle.y = y * 32;
|
|
tile_rectangle.r = 255;
|
|
tile_rectangle.g = 0;
|
|
tile_rectangle.b = 255;
|
|
tile_rectangle.w = 32;
|
|
tile_rectangle.h = 32;
|
|
tile_rectangle.attribute = ENABLE_TRANS;
|
|
GsSortRectangle(&tile_rectangle);
|
|
}
|
|
}
|
|
}
|
|
|
|
GsPrintFont(232, 16, "Resolve\nPuzzle\n\n"
|
|
"Exchange:\n"
|
|
"\nX\nHorizontal\n"
|
|
"\nO\nVertical");
|
|
|
|
GsDrawList();
|
|
while(GsIsDrawing());
|
|
|
|
display_is_old = 0;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|