diff --git a/!TheEsc/!MapEdit,ff8 b/!TheEsc/!MapEdit,ff8 index 8594123..65a99e0 100644 Binary files a/!TheEsc/!MapEdit,ff8 and b/!TheEsc/!MapEdit,ff8 differ diff --git a/!TheEsc/!RunImage,ff8 b/!TheEsc/!RunImage,ff8 index e23ab96..c007e3e 100644 Binary files a/!TheEsc/!RunImage,ff8 and b/!TheEsc/!RunImage,ff8 differ diff --git a/!TheEsc/Font,ff9 b/!TheEsc/Font,ff9 index 799a5c8..45dc522 100644 Binary files a/!TheEsc/Font,ff9 and b/!TheEsc/Font,ff9 differ diff --git a/!TheEsc/Tiles,ff9 b/!TheEsc/Tiles,ff9 index b664c70..b36485b 100644 Binary files a/!TheEsc/Tiles,ff9 and b/!TheEsc/Tiles,ff9 differ diff --git a/!TheEsc/c/CTheEscape b/!TheEsc/c/CTheEscape index 4c4e426..7aa507b 100644 --- a/!TheEsc/c/CTheEscape +++ b/!TheEsc/c/CTheEscape @@ -5,8 +5,8 @@ #include "Sound.h" #include "Graphics.h" -#define SKIP_INTRO -#define SKIP_MISSION1 +//#define SKIP_INTRO +//#define SKIP_MISSION1 //#define SKIP_MISSION2 // SWI Registers diff --git a/!TheEsc/c/Graphics b/!TheEsc/c/Graphics index f9a496f..6aee785 100644 --- a/!TheEsc/c/Graphics +++ b/!TheEsc/c/Graphics @@ -10,7 +10,12 @@ extern unsigned char *buffer; extern unsigned char *fontbuffer; extern unsigned char *tilebuffer; +char tilenamebuffer[4]; +char letternamebuffer[2]; + int screen = 1; +int tilecache[256]; +int lettercache[256]; extern void screen_nobuffer(); // Loads sprite file into buffer @@ -205,35 +210,86 @@ void draw_sprite_flippedv(char* spritename,int x, int y) } -void draw_letter(char* spritename,int x, int y) +int get_letter_address(int letternumber) { - // SpriteOp 34 to put sprite at a location - inreg.r[0] = 256+34; + if(lettercache[letternumber] > 0) + return lettercache[letternumber]; + + sprintf(letternamebuffer,"%c",letternumber); + inreg.r[0] = 256+24; inreg.r[1] = (int) fontbuffer; - inreg.r[2] = (int) spritename; + inreg.r[2] = (int) letternamebuffer; + _kernel_swi(OS_SpriteOp,&inreg,&outreg); + + // For now, if we get an invalid character just display an X + // to make it really obvious + if(outreg.r[2] == inreg.r[2]) + get_letter_address((int)'X'); + + lettercache[letternumber] = outreg.r[2]; + + return lettercache[letternumber]; +} + +void draw_letter(int letter,int x, int y) +{ + int address = get_letter_address(letter); + // SpriteOp 34 to put sprite at a location + inreg.r[0] = 512+34; + inreg.r[1] = (int) fontbuffer; + inreg.r[2] = address; inreg.r[3] = x; inreg.r[4] = y; inreg.r[5] = 8; _kernel_swi(OS_SpriteOp,&inreg,&outreg); } -void draw_tile(char* spritename,int x, int y) +int get_tile_address(int tilenumber) { - // SpriteOp 34 to put sprite at a location - inreg.r[0] = 256+34; + if(tilecache[tilenumber] > 0) + return tilecache[tilenumber]; + + sprintf(tilenamebuffer,"%i",tilenumber); + inreg.r[0] = 256+24; inreg.r[1] = (int) tilebuffer; - inreg.r[2] = (int) spritename; + inreg.r[2] = (int)tilenamebuffer; + _kernel_swi(OS_SpriteOp,&inreg,&outreg); + + // Show default tile if not found + if(outreg.r[2] == inreg.r[2]) + { + get_tile_address(0); + } + + // Caching 0 seems to make it shit itself? + if(tilenumber > 0) + tilecache[tilenumber] = outreg.r[2]; + + return outreg.r[2]; +} + +void draw_tile(int tilenumber,int x, int y) +{ + int address = get_tile_address(tilenumber); + + // SpriteOp 34 to put sprite at a location + inreg.r[0] = 512+34; + inreg.r[1] = (int) tilebuffer; // unused because pointers are in use now + inreg.r[2] = address; inreg.r[3] = x; inreg.r[4] = y; inreg.r[5] = 0; _kernel_swi(OS_SpriteOp,&inreg,&outreg); } -void draw_tile_trans(char* spritename,int x, int y) + +void draw_tile_trans(int tilenumber,int x, int y) { + int address = get_tile_address(tilenumber); + // SpriteOp 34 to put sprite at a location - inreg.r[0] = 256+34; + inreg.r[0] = 512+34; inreg.r[1] = (int) tilebuffer; - inreg.r[2] = (int) spritename; + inreg.r[2] = address; inreg.r[3] = x; inreg.r[4] = y; inreg.r[5] = 8; @@ -245,15 +301,13 @@ void draw_spritetext(char* text, int x, int y) int currentx; int currenty; int i; - char str[2] = "\0"; + currentx = x; currenty = y; for(i = 0; i < strlen(text); i++) { - str[0] = text[i]; - if((text[i] != ' ') && (text[i] != '\n') && (text[i] != '~')) - draw_letter(str,currentx,currenty); + draw_letter(text[i],currentx,currenty); switch (text[i]) { @@ -262,6 +316,7 @@ void draw_spritetext(char* text, int x, int y) case '.': case ',': case 'y': + case ':': currentx += 12 + 4; break; case '\'': diff --git a/!TheEsc/c/MapEdit b/!TheEsc/c/MapEdit index c10234b..d1c7d73 100644 --- a/!TheEsc/c/MapEdit +++ b/!TheEsc/c/MapEdit @@ -46,8 +46,7 @@ unsigned char map_overlay[3][TILESX][TILESY]; unsigned char fullmap[10000*2]; -char tilenamebuffer[4]; -char textbuffer[63]; +char textbuffer[128]; struct EntityLocation_s { short signed int X,Y; @@ -595,8 +594,8 @@ int game2_tick() lasttick = tick; tick = clock(); - screen_flipbuffer(); - + //screen_flipbuffer(); +screen_nobuffer(); if(1) { screen_clear(); @@ -608,8 +607,7 @@ int game2_tick() if(1/*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] & 127); - draw_tile(tilenamebuffer,x*100,y*100); + draw_tile(map[screen+1][x][y] & 127,x*100,y*100); if(((map[screen+1][x][y] >> 7) & 0x01)) { draw_sprite("solid",x*100,y*100); @@ -618,8 +616,7 @@ int game2_tick() map_overlay[screen+1][x][y] = map_overlay[0][x][y]; if(map_overlay[screen+1][x][y] > 0) { - sprintf(tilenamebuffer,"%i",map_overlay[screen+1][x][y]); - draw_tile_trans(tilenamebuffer,x*100,y*100); + draw_tile_trans(map_overlay[screen+1][x][y],x*100,y*100); } udt++; @@ -701,7 +698,7 @@ int game2_tick() } } - sprintf(textbuffer,"Tile:%i\nSprite:%i\nSolid: %i", + sprintf(textbuffer,"Tile:%i\nSprite:%i\nSolid: %i\n", TilePlayer.rawtile, fullmap[TilePlayer.rawtile], ((fullmap[TilePlayer.rawtile] >> 7) & 0x01) @@ -719,11 +716,11 @@ int game2_tick() if((i >=0) && (i <= 255)) { if(i > 127) - sprintf(tilenamebuffer,"%i",i - 128); + draw_tile(i - 128,x,y); else - sprintf(tilenamebuffer,"%i",i); + draw_tile(i,x,y); + - draw_tile(tilenamebuffer,x,y); if(i > 127) sprintf(textbuffer,"%i",i - 128); @@ -745,8 +742,7 @@ int game2_tick() { if((i >=0) && (i <= 255)) { - sprintf(tilenamebuffer,"%i",i); - draw_tile(tilenamebuffer,x,y); + draw_tile(i,x,y); sprintf(textbuffer,"%i",i); draw_spritetext(textbuffer, x+20, y+30); @@ -756,26 +752,25 @@ int game2_tick() } y = y - 100; } - +/* x = 1180; y = 750; if(clipboard > 127) - sprintf(tilenamebuffer,"%i",clipboard - 128); + draw_tile(clipboard - 128,x,y); else - sprintf(tilenamebuffer,"%i",clipboard); - draw_tile(tilenamebuffer,x,y); + draw_tile(clipboard,x,y); + if(clipboard_overlay > 0) { - sprintf(tilenamebuffer,"%i",clipboard_overlay); - draw_tile_trans(tilenamebuffer,x,y); + draw_tile_trans(clipboard_overlay,x,y); } draw_sprite("select1",x,y); - sprintf(tilenamebuffer,"%i",clipboard_tileid); - draw_spritetext(tilenamebuffer, x+10, y+30); + sprintf(textbuffer,"%i",clipboard_tileid); + draw_spritetext(textbuffer, x+10, y+30); draw_spritetext("Clipboard", x-174, y+30); - + */ return 0; }else{ @@ -798,14 +793,14 @@ int game_hitbox_collide(int x1, int y1, int w1, int h1, int x2, int y2, int w2, } void exitfunc () { - screen_flipbuffer(); +/* screen_flipbuffer(); screen_clear(); screen_flipbuffer(); screen_clear(); screen_nobuffer(); free(buffer); free(fontbuffer); - free(tilebuffer); + free(tilebuffer);*/ } int main(int argc, char *argv[]) diff --git a/!TheEsc/c/Mission2 b/!TheEsc/c/Mission2 index e159669..bda1e09 100644 --- a/!TheEsc/c/Mission2 +++ b/!TheEsc/c/Mission2 @@ -30,7 +30,6 @@ unsigned char fullmap[10000*2]; unsigned char areaname[13]; -char tilenamebuffer[4]; char textbuffer[63]; struct EntityLocation_s { @@ -750,17 +749,14 @@ int game2_tick() { map[screen+1][x][y] = map[0][x][y]; if(map[screen+1][x][y] < 128) - sprintf(tilenamebuffer,"%i",map[screen+1][x][y]); + draw_tile(map[screen+1][x][y],x*100,y*100); else - sprintf(tilenamebuffer,"%i",(map[screen+1][x][y]-128)); - - draw_tile(tilenamebuffer,x*100,y*100); + draw_tile((map[screen+1][x][y]-128),x*100,y*100); map_overlay[screen+1][x][y] = map_overlay[0][x][y]; if(map_overlay[screen+1][x][y] > 0) { - sprintf(tilenamebuffer,"%i",map_overlay[screen+1][x][y]); - draw_tile_trans(tilenamebuffer,x*100,y*100); + draw_tile_trans(map_overlay[screen+1][x][y],x*100,y*100); } } } diff --git a/!TheEsc/m2_map,ffd b/!TheEsc/m2_map,ffd index 529c369..ad52567 100644 Binary files a/!TheEsc/m2_map,ffd and b/!TheEsc/m2_map,ffd differ