#include "Graphics.h" #include "swis.h" #include extern int tick; extern int lasttick; extern int screen; extern _kernel_swi_regs inreg; extern _kernel_swi_regs outreg; #define TILESX 10 #define TILESY 10 // map[0] is the 'master', [1] and [2] represents what is currently // believed to be displayed in the corresponding (+1) screen buffer // and we run a compare to see if re-drawing is needed. 0xFF is used // for a re-draw being required (so it's set on the tile under the player unsigned char map[3][TILESX][TILESY]; unsigned char fullmap[10000]; char tilenamebuffer[4]; char textbuffer[63]; struct EntityLocation_s { short signed int X,Y; }; struct TilePlayer_s { struct EntityLocation_s location; struct EntityLocation_s hitbox_bl; struct EntityLocation_s hitbox_tr; struct EntityLocation_s mapoffset; }; struct TilePlayer_s TilePlayer; void game2_loadmap(char* filename) { int length; // Attempt to get file info inreg.r[0] = 13; inreg.r[1] = (int) filename; _kernel_swi(OS_File,&inreg,&outreg); // Length will be in R4 if it exists length = outreg.r[4]; if(length > sizeof(fullmap)) { // TODO: Work out why real machine doesn't appear to read size and gives object type 19 /*screen_nobuffer(); printf("Map exceeds %d bytes (%d bytes) Object Type %d",sizeof(fullmap),length,outreg.r[0]); exit(0);*/ } // Attempt to get file info inreg.r[0] = 16; inreg.r[1] = (int) filename; inreg.r[2] = (int) fullmap; inreg.r[3] = 0; _kernel_swi(OS_File,&inreg,&outreg); } void game2_death() { int currentstart = 0; int introframe = 0; sound_voices(4); sound_set_voice(1,"WaveSynth-Beep"); sound_set_voice(2,"WaveSynth-Beep"); sound_set_voice(3,"WaveSynth-Beep"); sound_set_voice(4,"WaveSynth-Beep"); sound_composition_init(); sound_composition_load("music.cmpagrac"); tick = clock(); sound_composition_start(clock()); draw_sprite("spacebar",(DISPLAY_X/2)-106,50); draw_sprite("kia",(DISPLAY_X/2)-300,500); screen_flipbuffer(); while(sound_composition_incomplete()) { sound_composition_tick(clock()); if(clock() > (tick + 100)) { if(input_readkey(98)) sound_composition_stop(); } } } void game2_briefing() { screen_clear(); draw_spritetext( "~~~~~~~~{ chief engineers log - uss archimedes - stardate 1234567890 ==}\n\n\nyour mission is to be dead until i make mission 2. \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n~~~~~~~~{======================~~~~~~~~===========================}" , 50, 950); draw_sprite("spacebar",(DISPLAY_X/2)-106,50); screen_flipbuffer(); tick = clock(); while(1) { if(clock() > (tick + 100)) { if(input_readkey(98)) return; } } } void game2_fillmap(int xoffset, int yoffset) { memcpy(map[0][0],fullmap+yoffset+(xoffset*100),10); memcpy(map[0][1],fullmap+yoffset+(xoffset*100)+100,10); memcpy(map[0][2],fullmap+yoffset+(xoffset*100)+200,10); memcpy(map[0][3],fullmap+yoffset+(xoffset*100)+300,10); memcpy(map[0][4],fullmap+yoffset+(xoffset*100)+400,10); memcpy(map[0][5],fullmap+yoffset+(xoffset*100)+500,10); memcpy(map[0][6],fullmap+yoffset+(xoffset*100)+600,10); memcpy(map[0][7],fullmap+yoffset+(xoffset*100)+700,10); memcpy(map[0][8],fullmap+yoffset+(xoffset*100)+800,10); memcpy(map[0][9],fullmap+yoffset+(xoffset*100)+900,10); } void game2_setup() { screen_flipbuffer(); screen_clear(); screen_flipbuffer(); screen_clear(); TilePlayer.location.X = 100; TilePlayer.location.Y = 100; TilePlayer.hitbox_bl.X = 0; TilePlayer.hitbox_bl.Y = 0; TilePlayer.hitbox_tr.X = 60; TilePlayer.hitbox_tr.Y = 50; memset(map[0],0xFF,100); memset(map[1],0xFF,100); memset(map[2],0xFF,100); game2_loadmap("mission2"); game2_fillmap(TilePlayer.mapoffset.X,TilePlayer.mapoffset.Y); } void game2_tick_input() { int x,y; // Up arrow if(input_readkey(57)) { TilePlayer.location.Y += 3 * (tick - lasttick); if(TilePlayer.location.Y > (9*100)) { TilePlayer.location.Y = 100; TilePlayer.mapoffset.Y += 10; } } // Down arrow if(input_readkey(41)) { TilePlayer.location.Y -= 3 * (tick - lasttick); if(TilePlayer.location.Y < (1*100)) { TilePlayer.location.Y = 900; TilePlayer.mapoffset.Y -= 10; } } // Right arrow if(input_readkey(121)) { TilePlayer.location.X += 3 * (tick - lasttick); if(TilePlayer.location.X > (9*100)) { TilePlayer.location.X = 100; TilePlayer.mapoffset.X += 10; } } // Left arrow if(input_readkey(25)) { TilePlayer.location.X -= 3 * (tick - lasttick); if(TilePlayer.location.X < (1*100)) { TilePlayer.location.X = 900; TilePlayer.mapoffset.X -= 10; } } // Q if(input_readkey(16)) { for(x = 0; x < TILESX; x++) { for(y = 0; y < TILESY; y++) { map[0][x][y] = 1; } } } } int game2_tick() { int x; int y; int udt = 0; lasttick = tick; tick = clock(); screen_flipbuffer(); if(1) { game2_fillmap(TilePlayer.mapoffset.X,TilePlayer.mapoffset.Y); for(x = 0; x < TILESX; x++) { for(y = 0; y < TILESY; y++) { if(game_hitbox_collide( (TilePlayer.location.X + TilePlayer.hitbox_bl.X),(TilePlayer.location.Y + TilePlayer.hitbox_bl.Y), (TilePlayer.hitbox_tr.X - TilePlayer.hitbox_bl.X),(TilePlayer.hitbox_tr.Y - TilePlayer.hitbox_bl.Y), x*100,y*100, 100,100 )) { map[1][x][y] = 255; map[2][x][y] = 255; } if(map[0][x][y] ^ map[screen+1][x][y]) { map[screen+1][x][y] = map[0][x][y]; sprintf(tilenamebuffer,"%i",map[screen+1][x][y]); draw_tile(tilenamebuffer,x*100,y*100); udt++; } } //draw_sprite("lcarsblack",1000,DISPLAY_Y-164); //sprintf(textbuffer,"CPF: %i\nUDT: %i",(tick-lasttick), udt); //draw_spritetext(textbuffer, 1070, 950); } game2_tick_input(); draw_sprite("man",TilePlayer.location.X,TilePlayer.location.Y); return 0; }else{ /* screen_flipbuffer(); screen_clear(); game2_death(); return 1;*/ } }