Refer to tiles and font characters by pointer (once cached). Fixed missing colon from font. Minor map changes (and more obvious tile zero). Misc map tweaks.

This commit is contained in:
stevenhowes
2021-08-31 16:50:11 +01:00
parent 9b50486e24
commit b5ae8623c9
9 changed files with 95 additions and 49 deletions
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -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
+70 -15
View File
@@ -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 '\'':
+20 -25
View File
@@ -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[])
+3 -7
View File
@@ -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);
}
}
}
Binary file not shown.