diff --git a/.gitignore b/.gitignore index 96374c4..655af00 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,14 @@ $RECYCLE.BIN/ Network Trash Folder Temporary Items .apdisk + +# 3DS Dev +*.3dsx +*.elf +*.smdh +build + +# Eclipse +.settings +.cproject +.project diff --git a/source/Globals.h b/source/Globals.h index 36a6cc6..706ba81 100644 --- a/source/Globals.h +++ b/source/Globals.h @@ -48,7 +48,6 @@ bool screenShot; extern char versionText[34]; Entity player; -sf2d_texture * lightScreen; sf2d_texture * minimap[5]; u8 map[5][128*128]; diff --git a/source/Item.h b/source/Item.h index 428522b..1fd86e5 100644 --- a/source/Item.h +++ b/source/Item.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "Sound.h" diff --git a/source/Menu.c b/source/Menu.c index dafc8bf..6ad08a5 100644 --- a/source/Menu.c +++ b/source/Menu.c @@ -764,7 +764,7 @@ void renderMenu(int menu,int xscr,int yscr){ sf2d_draw_rectangle(0,0,400,240, 0xDFDFDFAF); } offsetX = xscr;offsetY = yscr; - renderBackground(xscr,yscr); + renderMenuBackground(xscr,yscr); offsetX = 0;offsetY = 0; renderFrame(1,1,24,14,0xAF1010FF); drawText("Paused",164,32); @@ -797,7 +797,7 @@ void renderMenu(int menu,int xscr,int yscr){ sf2d_draw_rectangle(0,0,400,240, 0xDFDFDFAF); } offsetX = xscr;offsetY = yscr; - renderBackground(xscr,yscr); + renderMenuBackground(xscr,yscr); offsetX = 0;offsetY = 0; renderFrame(5,3,21,12,0x1010FFFF); if(!rev){ opacity+=5; if(opacity == 255) rev = true; } @@ -818,7 +818,7 @@ void renderMenu(int menu,int xscr,int yscr){ sf2d_draw_rectangle(0,0,400,240, 0xDFDFDFAF); } offsetX = xscr;offsetY = yscr; - renderBackground(xscr,yscr); + renderMenuBackground(xscr,yscr); offsetX = 0;offsetY = 0; renderFrame(5,3,21,12,0x1010FFFF); if(!rev){ opacity+=5; if(opacity == 255) rev = true; } @@ -838,7 +838,7 @@ void renderMenu(int menu,int xscr,int yscr){ sf2d_draw_rectangle(0,0,400,240, 0xDFDFDFAF); } offsetX = xscr;offsetY = yscr; - renderBackground(xscr,yscr); + renderMenuBackground(xscr,yscr); offsetX = 0;offsetY = 0; renderFrame(1,1,24,14,0x1010FFFF); renderItemList(player.p.inv, 1,1,24,14, curInvSel); @@ -851,7 +851,7 @@ void renderMenu(int menu,int xscr,int yscr){ sf2d_draw_rectangle(0,0,400,240, 0xDFDFDFAF); } offsetX = xscr;offsetY = yscr; - renderBackground(xscr,yscr); + renderMenuBackground(xscr,yscr); offsetX = 0;offsetY = 0; renderFrame(15,1,24,4,0x1010FFFF); @@ -887,7 +887,7 @@ void renderMenu(int menu,int xscr,int yscr){ sf2d_draw_rectangle(0,0,400,240, 0xDFDFDFAF); } offsetX = xscr;offsetY = yscr; - renderBackground(xscr,yscr); + renderMenuBackground(xscr,yscr); if (curChestEntity->entityFurniture.r == 1){ offsetX = 48;offsetY = 0;} else {offsetX = 0;offsetY = 0;} diff --git a/source/Render.c b/source/Render.c index 9f22301..8ceed54 100644 --- a/source/Render.c +++ b/source/Render.c @@ -1,223 +1,467 @@ #include "Render.h" -void render(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits){ - xp-=offsetX; - yp-=offsetY; +void render(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits) { + xp -= offsetX; + yp -= offsetY; int scaleX = 2, scaleY = 2; - if((bits & 1) > 0){scaleX=-2;xp+=8;} - if((bits & 2) > 0){scaleY=-2;yp+=8;} - sf2d_draw_texture_part_scale(icons,xp<<1,yp<<1,xTile,yTile,8,8,scaleX,scaleY); + if ((bits & 1) > 0) { + scaleX = -2; + xp += 8; + } + if ((bits & 2) > 0) { + scaleY = -2; + yp += 8; + } + sf2d_draw_texture_part_scale(icons, xp << 1, yp << 1, xTile, yTile, 8, 8, + scaleX, scaleY); } -void renderb(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, u32 color){ - xp-=offsetX; - yp-=offsetY; +void renderb(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, u32 color) { + xp -= offsetX; + yp -= offsetY; int scaleX = 2, scaleY = 2; - if((bits & 1) > 0){scaleX=-2;xp+=8;} - if((bits & 2) > 0){scaleY=-2;yp+=8;} - sf2d_draw_texture_part_scale_blend(icons,xp<<1,yp<<1,xTile,yTile,8,8,scaleX,scaleY,color); + if ((bits & 1) > 0) { + scaleX = -2; + xp += 8; + } + if ((bits & 2) > 0) { + scaleY = -2; + yp += 8; + } + sf2d_draw_texture_part_scale_blend(icons, xp << 1, yp << 1, xTile, yTile, 8, + 8, scaleX, scaleY, color); } -void renderr(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, float rotate){ - xp-=offsetX; - yp-=offsetY; +void renderr(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, float rotate) { + xp -= offsetX; + yp -= offsetY; int scaleX = 2, scaleY = 2; - if((bits & 1) > 0){scaleX=-2;xp+=8;} - if((bits & 2) > 0){scaleY=-2;yp+=8;} - sf2d_draw_texture_part_rotate_scale(icons,xp<<1,yp<<1,rotate,xTile,yTile,8,8,scaleX,scaleY); + if ((bits & 1) > 0) { + scaleX = -2; + xp += 8; + } + if ((bits & 2) > 0) { + scaleY = -2; + yp += 8; + } + sf2d_draw_texture_part_rotate_scale(icons, xp << 1, yp << 1, rotate, xTile, + yTile, 8, 8, scaleX, scaleY); } -void renderc(s32 xp, s32 yp, u32 xTile, u32 yTile,int sizeX, int sizeY, u8 bits){ - xp-=offsetX; - yp-=offsetY; +void renderc(s32 xp, s32 yp, u32 xTile, u32 yTile, int sizeX, int sizeY, + u8 bits) { + xp -= offsetX; + yp -= offsetY; int scaleX = 2, scaleY = 2; - if((bits & 1) > 0){scaleX=-2;xp+=sizeX;} - if((bits & 2) > 0){scaleY=-2;yp+=sizeY;} - sf2d_draw_texture_part_scale(icons,xp<<1,yp<<1,xTile,yTile,sizeX,sizeY,scaleX,scaleY); + if ((bits & 1) > 0) { + scaleX = -2; + xp += sizeX; + } + if ((bits & 2) > 0) { + scaleY = -2; + yp += sizeY; + } + sf2d_draw_texture_part_scale(icons, xp << 1, yp << 1, xTile, yTile, sizeX, + sizeY, scaleX, scaleY); } -void renderbc(s32 xp, s32 yp, u32 xTile, u32 yTile,int sizeX, int sizeY, u8 bits, u32 color){ - xp-=offsetX; - yp-=offsetY; +void renderbc(s32 xp, s32 yp, u32 xTile, u32 yTile, int sizeX, int sizeY, + u8 bits, u32 color) { + xp -= offsetX; + yp -= offsetY; int scaleX = 2, scaleY = 2; - if((bits & 1) > 0){scaleX=-2;xp+=sizeX;} - if((bits & 2) > 0){scaleY=-2;yp+=sizeY;} - sf2d_draw_texture_part_scale_blend(icons,xp<<1,yp<<1,xTile,yTile,sizeX,sizeY,scaleX,scaleY,color); + if ((bits & 1) > 0) { + scaleX = -2; + xp += sizeX; + } + if ((bits & 2) > 0) { + scaleY = -2; + yp += sizeY; + } + sf2d_draw_texture_part_scale_blend(icons, xp << 1, yp << 1, xTile, yTile, + sizeX, sizeY, scaleX, scaleY, color); } -void render16(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits){ - xp-=offsetX; - yp-=offsetY; +void render16(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits) { + xp -= offsetX; + yp -= offsetY; int scaleX = 2, scaleY = 2; - if((bits & 1) > 0){scaleX=-2;xp+=16;} - if((bits & 2) > 0){scaleY=-2;yp+=16;} - sf2d_draw_texture_part_scale(icons,xp<<1,yp<<1,xTile,yTile,16,16,scaleX,scaleY); + if ((bits & 1) > 0) { + scaleX = -2; + xp += 16; + } + if ((bits & 2) > 0) { + scaleY = -2; + yp += 16; + } + sf2d_draw_texture_part_scale(icons, xp << 1, yp << 1, xTile, yTile, 16, 16, + scaleX, scaleY); } - -void render16c(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits,float scaleX, float scaleY){ - xp-=offsetX; - yp-=offsetY; - if((bits & 1) > 0){scaleX=-scaleX;xp+=16;} - if((bits & 2) > 0){scaleY=-scaleY;yp+=16;} - sf2d_draw_texture_part_scale(icons,xp*scaleX,yp*scaleY,xTile,yTile,16,16,scaleX,scaleY); +void render16c(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, float scaleX, + float scaleY) { + xp -= offsetX; + yp -= offsetY; + if ((bits & 1) > 0) { + scaleX = -scaleX; + xp += 16; + } + if ((bits & 2) > 0) { + scaleY = -scaleY; + yp += 16; + } + sf2d_draw_texture_part_scale(icons, xp * scaleX, yp * scaleY, xTile, yTile, + 16, 16, scaleX, scaleY); } -void render16b(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits,u32 color){ - xp-=offsetX; - yp-=offsetY; +void render16b(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, u32 color) { + xp -= offsetX; + yp -= offsetY; int scaleX = 2, scaleY = 2; - if((bits & 1) > 0){scaleX=-2;xp+=16;} - if((bits & 2) > 0){scaleY=-2;yp+=16;} - sf2d_draw_texture_part_scale_blend(icons,xp<<1,yp<<1,xTile,yTile,16,16,scaleX,scaleY,color); + if ((bits & 1) > 0) { + scaleX = -2; + xp += 16; + } + if ((bits & 2) > 0) { + scaleY = -2; + yp += 16; + } + sf2d_draw_texture_part_scale_blend(icons, xp << 1, yp << 1, xTile, yTile, + 16, 16, scaleX, scaleY, color); } -void render16s(s32 xp, s32 yp, u32 tile, u8 bits,u32 color){ - xp-=offsetX; - yp-=offsetY; +void render16s(s32 xp, s32 yp, u32 tile, u8 bits, u32 color) { + xp -= offsetX; + yp -= offsetY; int xTile = tile & 255; int yTile = tile >> 8; int scaleX = 2, scaleY = 2; - if((bits & 1) > 0){scaleX=-2;xp+=16;} - if((bits & 2) > 0){scaleY=-2;yp+=16;} - sf2d_draw_texture_part_scale_blend(icons,xp<<1,yp<<1,xTile,yTile,16,16,scaleX,scaleY,color); + if ((bits & 1) > 0) { + scaleX = -2; + xp += 16; + } + if ((bits & 2) > 0) { + scaleY = -2; + yp += 16; + } + sf2d_draw_texture_part_scale_blend(icons, xp << 1, yp << 1, xTile, yTile, + 16, 16, scaleX, scaleY, color); } -void renderTitle(int x, int y){ - sf2d_draw_texture_part_scale(icons,(x-26)<<1,y<<1,0,240,104,16,2.0,2.0); // MINICRAFT - sf2d_draw_texture_part(icons,x+48,y+52,104,240,152,16); // 3DS HOMEBREW EDITION +void renderTitle(int x, int y) { + sf2d_draw_texture_part_scale(icons, (x - 26) << 1, y << 1, 0, 240, 104, 16, + 2.0, 2.0); // MINICRAFT + sf2d_draw_texture_part(icons, x + 48, y + 52, 104, 240, 152, 16); // 3DS HOMEBREW EDITION } -void renderButtonIcon(u32 keyIcon, int x, int y, float scale){ - switch(keyIcon){ - case CIRCLEPAD: render16c(x,y,96,208,0,scale,scale); break; - case KEY_CPAD_UP: render16c(x,y,112,208,0,scale,scale); break; - case KEY_CPAD_LEFT: render16c(x,y,128,208,0,scale,scale); break; - case KEY_CPAD_DOWN: render16c(x,y,144,208,0,scale,scale); break; - case KEY_CPAD_RIGHT: render16c(x,y,160,208,0,scale,scale); break; - - /* New 3DS only */ - case CSTICK: render16c(x,y,176,208,0,scale,scale); break; - case KEY_CSTICK_UP: render16c(x,y,192,208,0,scale,scale); break; - case KEY_CSTICK_LEFT: render16c(x,y,208,208,0,scale,scale); break; - case KEY_CSTICK_DOWN: render16c(x,y,224,208,0,scale,scale); break; - case KEY_CSTICK_RIGHT: render16c(x,y,240,208,0,scale,scale); break; - - case KEY_A: render16c(x,y,0,224,0,scale,scale); break; - case KEY_B: render16c(x,y,16,224,0,scale,scale); break; - case KEY_X: render16c(x,y,32,224,0,scale,scale); break; - case KEY_Y: render16c(x,y,48,224,0,scale,scale); break; - case KEY_DUP: render16c(x,y,64,224,0,scale,scale); break; - case KEY_DLEFT: render16c(x,y,80,224,0,scale,scale); break; - case KEY_DDOWN: render16c(x,y,96,224,0,scale,scale); break; - case KEY_DRIGHT: render16c(x,y,112,224,0,scale,scale); break; - case KEY_START: - render16c(x-8,y,128,224,0,scale,scale); - render16c(x+8,y,144,224,0,scale,scale); - break; - case KEY_SELECT: - render16c(x-8,y,160,224,0,scale,scale); - render16c(x+8,y,176,224,0,scale,scale); - break; - case KEY_L: render16c(x,y,192,224,0,scale,scale); break; - case KEY_R: render16c(x,y,208,224,0,scale,scale); break; - - /* New 3DS only */ - case KEY_ZL: render16c(x,y,224,224,0,scale,scale); break; - case KEY_ZR: render16c(x,y,240,224,0,scale,scale); break; - } +void renderButtonIcon(u32 keyIcon, int x, int y, float scale) { + switch (keyIcon) { + case CIRCLEPAD: + render16c(x, y, 96, 208, 0, scale, scale); + break; + case KEY_CPAD_UP: + render16c(x, y, 112, 208, 0, scale, scale); + break; + case KEY_CPAD_LEFT: + render16c(x, y, 128, 208, 0, scale, scale); + break; + case KEY_CPAD_DOWN: + render16c(x, y, 144, 208, 0, scale, scale); + break; + case KEY_CPAD_RIGHT: + render16c(x, y, 160, 208, 0, scale, scale); + break; + + /* New 3DS only */ + case CSTICK: + render16c(x, y, 176, 208, 0, scale, scale); + break; + case KEY_CSTICK_UP: + render16c(x, y, 192, 208, 0, scale, scale); + break; + case KEY_CSTICK_LEFT: + render16c(x, y, 208, 208, 0, scale, scale); + break; + case KEY_CSTICK_DOWN: + render16c(x, y, 224, 208, 0, scale, scale); + break; + case KEY_CSTICK_RIGHT: + render16c(x, y, 240, 208, 0, scale, scale); + break; + + case KEY_A: + render16c(x, y, 0, 224, 0, scale, scale); + break; + case KEY_B: + render16c(x, y, 16, 224, 0, scale, scale); + break; + case KEY_X: + render16c(x, y, 32, 224, 0, scale, scale); + break; + case KEY_Y: + render16c(x, y, 48, 224, 0, scale, scale); + break; + case KEY_DUP: + render16c(x, y, 64, 224, 0, scale, scale); + break; + case KEY_DLEFT: + render16c(x, y, 80, 224, 0, scale, scale); + break; + case KEY_DDOWN: + render16c(x, y, 96, 224, 0, scale, scale); + break; + case KEY_DRIGHT: + render16c(x, y, 112, 224, 0, scale, scale); + break; + case KEY_START: + render16c(x - 8, y, 128, 224, 0, scale, scale); + render16c(x + 8, y, 144, 224, 0, scale, scale); + break; + case KEY_SELECT: + render16c(x - 8, y, 160, 224, 0, scale, scale); + render16c(x + 8, y, 176, 224, 0, scale, scale); + break; + case KEY_L: + render16c(x, y, 192, 224, 0, scale, scale); + break; + case KEY_R: + render16c(x, y, 208, 224, 0, scale, scale); + break; + + /* New 3DS only */ + case KEY_ZL: + render16c(x, y, 224, 224, 0, scale, scale); + break; + case KEY_ZR: + render16c(x, y, 240, 224, 0, scale, scale); + break; + } } -int getFrame(int a, int b, int s){ - return (a == s) ? 0 : ((a < b-1) ? 8 : 16); +int getFrame(int a, int b, int s) { + return (a == s) ? 0 : ((a < b - 1) ? 8 : 16); } -void renderFrame(int x1, int y1, int x2, int y2, u32 bgColor){ - int startX = x1; - int startY = y1; - sf2d_draw_rectangle((x1<<4)+4-(offsetX<<1),(y1<<4)+4-(offsetY<<1),((x2-x1)<<4)-8,((y2-y1)<<4)-8, bgColor); - while(x1 < x2){ - y1 = startY; - while(y1 < y2){ - int xp=(x1<<4)-(offsetX<<1); - int yp=(y1<<4)-(offsetY<<1); - sf2d_draw_texture_part_scale(icons,xp,yp,getFrame(x1,x2,startX),200+getFrame(y1,y2,startY),8,8,2.0,2.0); - ++y1; - } - ++x1; - } +void renderFrame(int x1, int y1, int x2, int y2, u32 bgColor) { + int startX = x1; + int startY = y1; + sf2d_draw_rectangle((x1 << 4) + 4 - (offsetX << 1), + (y1 << 4) + 4 - (offsetY << 1), ((x2 - x1) << 4) - 8, + ((y2 - y1) << 4) - 8, bgColor); + while (x1 < x2) { + y1 = startY; + while (y1 < y2) { + int xp = (x1 << 4) - (offsetX << 1); + int yp = (y1 << 4) - (offsetY << 1); + sf2d_draw_texture_part_scale(icons, xp, yp, + getFrame(x1, x2, startX), 200 + getFrame(y1, y2, startY), 8, + 8, 2.0, 2.0); + ++y1; + } + ++x1; + } } -void renderDotsWithColor(int val, int x, int y,u8 bits, u32 color){ - switch(val){ - case 3: renderb(x,y,0,0,bits,color); return; - case 5: renderb(x+8,y,8,0,bits,color); return; - case 7: renderbc(x,y,0,0,16,8,bits,color); return; - case 10: renderb(x,y+8,0,8,bits,color); return; - case 11: renderbc(x,y,0,0,8,16,bits,color); return; - case 12: renderb(x+8,y+8,8,8,bits,color); return; - case 13: renderbc(x+8,y,8,0,8,16,bits,color); return; - case 14: renderbc(x,y+8,0,8,16,8,bits,color); return; - case 15: render16b(x,y,0,0,bits,color); return; - } +void renderDotsWithColor(int val, int x, int y, u8 bits, u32 color) { + switch (val) { + case 3: + renderb(x, y, 0, 0, bits, color); + return; + case 5: + renderb(x + 8, y, 8, 0, bits, color); + return; + case 7: + renderbc(x, y, 0, 0, 16, 8, bits, color); + return; + case 10: + renderb(x, y + 8, 0, 8, bits, color); + return; + case 11: + renderbc(x, y, 0, 0, 8, 16, bits, color); + return; + case 12: + renderb(x + 8, y + 8, 8, 8, bits, color); + return; + case 13: + renderbc(x + 8, y, 8, 0, 8, 16, bits, color); + return; + case 14: + renderbc(x, y + 8, 0, 8, 16, 8, bits, color); + return; + case 15: + render16b(x, y, 0, 0, bits, color); + return; + } } -void renderRockDotsWithColor(int val, int x, int y, u32 color){ - switch(val){ - case 208: render16b(x,y,0,0,0,color); return; - case 16: renderb(x+8,y+8,8,8,0,color); return; - case 32: renderb(x,y+8,0,8,0,color); return; - case 48: renderb(x,y+8,0,8,0,color); return; - case 64: renderb(x,y,0,0,0,color); return; - case 80: renderbc(x,y,0,0,8,16,0,color);return; - case 96: renderbc(x+8,y,8,0,8,16,0,color);return; - case 112: renderbc(x,y+8,0,8,16,8,0,color);return; - case 128: renderbc(x,y,0,0,16,8,0,color);return; - case 144: renderb(x,y+8,0,8,0,color);renderbc(x+8,y,8,0,8,16,0,color); return; - case 160: renderb(x,y,0,0,0,color);renderbc(x+8,y,8,0,8,16,0,color); return; - case 176: renderb(x+8,y,8,0,0,color);renderbc(x,y,0,0,8,16,0,color); return; - case 192: renderb(x+8,y+8,8,8,0,color);renderbc(x,y,0,0,8,16,0,color); return; - case 4112: renderbc(x,y,0,0,8,16,0,color);return; - case 4128: renderbc(x,y+8,0,8,8,16,0,color);return; - case 4192: renderb(x,y,0,0,0,color); return; - case 8192: renderb(x,y+8,0,8,0,color); return; - case 8208: renderb(x+8,y+8,8,8,0,color); return; - case 8224: renderb(x+8,y+8,8,8,0,color); return; - case 8240: renderb(x+8,y,8,0,0,color); return; - case 8256: renderb(x,y+8,0,8,0,color); return; - case 8272: renderb(x+8,y,8,0,0,color); return; - case 8288: renderb(x,y,0,0,0,color); return; - case 8304: renderb(x+8,y,8,0,0,color);renderb(x,y+8,0,8,0,color); return; - case 8320: renderbc(x+8,y,8,0,8,16,0,color);return; - case 8336: renderbc(x,y,0,0,8,16,0,color);return; - case 8352: renderb(x,y,0,0,0,color); renderb(x+8,y+8,8,8,0,color); return; - case 8368: renderb(x+8,y,8,0,0,color); return; - case 8384: renderb(x,y+8,0,8,0,color); return; - case 8400: renderb(x,y,0,0,0,color); return; - case 8416: renderb(x+8,y+8,8,8,0,color); return; - } +void renderRockDotsWithColor(int val, int x, int y, u32 color) { + switch (val) { + case 208: + render16b(x, y, 0, 0, 0, color); + return; + case 16: + renderb(x + 8, y + 8, 8, 8, 0, color); + return; + case 32: + renderb(x, y + 8, 0, 8, 0, color); + return; + case 48: + renderb(x, y + 8, 0, 8, 0, color); + return; + case 64: + renderb(x, y, 0, 0, 0, color); + return; + case 80: + renderbc(x, y, 0, 0, 8, 16, 0, color); + return; + case 96: + renderbc(x + 8, y, 8, 0, 8, 16, 0, color); + return; + case 112: + renderbc(x, y + 8, 0, 8, 16, 8, 0, color); + return; + case 128: + renderbc(x, y, 0, 0, 16, 8, 0, color); + return; + case 144: + renderb(x, y + 8, 0, 8, 0, color); + renderbc(x + 8, y, 8, 0, 8, 16, 0, color); + return; + case 160: + renderb(x, y, 0, 0, 0, color); + renderbc(x + 8, y, 8, 0, 8, 16, 0, color); + return; + case 176: + renderb(x + 8, y, 8, 0, 0, color); + renderbc(x, y, 0, 0, 8, 16, 0, color); + return; + case 192: + renderb(x + 8, y + 8, 8, 8, 0, color); + renderbc(x, y, 0, 0, 8, 16, 0, color); + return; + case 4112: + renderbc(x, y, 0, 0, 8, 16, 0, color); + return; + case 4128: + renderbc(x, y + 8, 0, 8, 8, 16, 0, color); + return; + case 4192: + renderb(x, y, 0, 0, 0, color); + return; + case 8192: + renderb(x, y + 8, 0, 8, 0, color); + return; + case 8208: + renderb(x + 8, y + 8, 8, 8, 0, color); + return; + case 8224: + renderb(x + 8, y + 8, 8, 8, 0, color); + return; + case 8240: + renderb(x + 8, y, 8, 0, 0, color); + return; + case 8256: + renderb(x, y + 8, 0, 8, 0, color); + return; + case 8272: + renderb(x + 8, y, 8, 0, 0, color); + return; + case 8288: + renderb(x, y, 0, 0, 0, color); + return; + case 8304: + renderb(x + 8, y, 8, 0, 0, color); + renderb(x, y + 8, 0, 8, 0, color); + return; + case 8320: + renderbc(x + 8, y, 8, 0, 8, 16, 0, color); + return; + case 8336: + renderbc(x, y, 0, 0, 8, 16, 0, color); + return; + case 8352: + renderb(x, y, 0, 0, 0, color); + renderb(x + 8, y + 8, 8, 8, 0, color); + return; + case 8368: + renderb(x + 8, y, 8, 0, 0, color); + return; + case 8384: + renderb(x, y + 8, 0, 8, 0, color); + return; + case 8400: + renderb(x, y, 0, 0, 0, color); + return; + case 8416: + renderb(x + 8, y + 8, 8, 8, 0, color); + return; + } } -void renderLights(){ - renderLight(player.x,player.y,4*8); - int i; - for(i = 0; i < eManager.lastSlot[currentLevel]; ++i){ - Entity e = eManager.entities[currentLevel][i]; - if(e.type != ENTITY_FURNITURE) continue; - if(e.x > player.x-160 && e.y > player.y-125 && e.x 1) { + GPU_SetDepthTestAndWriteMask(true, GPU_NEVER, 0); + GPU_SetStencilTest(true, GPU_NEVER, 1, 0xFF, 0xFF); + GPU_SetStencilOp(GPU_STENCIL_REPLACE, GPU_STENCIL_KEEP, + GPU_STENCIL_KEEP); + GPU_SetAlphaTest(true, GPU_GREATER, 0); + + renderLight(player.x, player.y, playerLightBake); + int i; + for (i = 0; i < eManager.lastSlot[currentLevel]; ++i) { + Entity e = eManager.entities[currentLevel][i]; + if (e.type != ENTITY_FURNITURE) + continue; + if (e.entityFurniture.itemID == ITEM_LANTERN && e.x > player.x - 160 + && e.y > player.y - 125 && e.x < player.x + 160 + && e.y < player.y + 125) + renderLight(e.x, e.y, lanternLightBake); + } + GPU_SetDepthTestAndWriteMask(true, GPU_GEQUAL, GPU_WRITE_ALL); + GPU_SetStencilTest(true, GPU_EQUAL, 1, 0xFF, 0x0); + GPU_SetAlphaTest(false, GPU_ALWAYS, 0x00); + GPU_SetStencilOp(GPU_STENCIL_KEEP, GPU_STENCIL_KEEP, + GPU_STENCIL_REPLACE); + } +} + +void resetStencilStuff() { + if (currentLevel) { + GPU_SetStencilTest(false, GPU_ALWAYS, 0x00, 0xFF, 0x00); + GPU_SetStencilOp(GPU_STENCIL_KEEP, GPU_STENCIL_KEEP, GPU_STENCIL_KEEP); + } +} + +void renderLight(int x, int y, sf2d_texture* texture) { + sf2d_draw_texture_scale(texture, (x - (texture->width / 2) - offsetX) * 2, + (y - (texture->height / 2) - offsetY) * 2, 2.f, 2.f); +} /* The original software rendered version, it's bad for the framerate :( */ -void renderLight(int x, int y, int r){ - x-=offsetX; - y-=offsetY; - int x0 = x - r; +void bakeLight(sf2d_texture* texture, int x, int y, int r) { + int x0 = x - r; int x1 = x + r; int y0 = y - r; int y1 = y + r; - // The game's resolution is actually 200x120, the textures are all scaled up by 2. - if (x0 < 0) x0 = 0; - if (y0 < 0) y0 = 0; - if (x1 > 200) x1 = 200; - if (y1 > 120) y1 = 120; - + // The game's resolution is actually 200x120, the textures are all scaled up by 2. + if (x0 < 0) + x0 = 0; + if (y0 < 0) + y0 = 0; + if (x1 > texture->width) + x1 = texture->width; + if (y1 > texture->height) + y1 = texture->height; + int xx, yy; for (yy = y0; yy < y1; yy++) { int yd = yy - y; @@ -225,602 +469,932 @@ void renderLight(int x, int y, int r){ for (xx = x0; xx < x1; xx++) { int xd = xx - x; int dist = xd * xd + yd; - if (dist <= r * r) sf2d_set_pixel(lightScreen, xx, yy, 0); // set transparent pixel + if (dist <= r * r) + if ((dist >= (r - (r / 6)) * (r - (r / 5))) ? + rand() % 3 != 0 : true) + sf2d_set_pixel(texture, xx, yy, RGBA8(0, 0, 0, 255)); // set transparent pixel } } + + sf2d_texture_tile32(texture); } -void renderLightScreen(){ - sf2d_draw_texture_scale(lightScreen,0,0,2.0,2.0); -} - -u8 checkSurrTiles8(int xt, int yt, int id){ - u8 vt = 0; - if(getTile(xt,yt-1) == id) vt |= 1; - if(getTile(xt-1,yt) == id) vt |= 2; - if(getTile(xt+1,yt) == id) vt |= 4; - if(getTile(xt,yt+1) == id) vt |= 8; - if(getTile(xt-1,yt-1) == id) vt |= 16; - if(getTile(xt+1,yt-1) == id) vt |= 32; - if(getTile(xt-1,yt+1) == id) vt |= 64; - if(getTile(xt+1,yt+1) == id) vt |= 128; +u8 checkSurrTiles8(int xt, int yt, int id) { + u8 vt = 0; + if (getTile(xt, yt - 1) == id) + vt |= 1; + if (getTile(xt - 1, yt) == id) + vt |= 2; + if (getTile(xt + 1, yt) == id) + vt |= 4; + if (getTile(xt, yt + 1) == id) + vt |= 8; + if (getTile(xt - 1, yt - 1) == id) + vt |= 16; + if (getTile(xt + 1, yt - 1) == id) + vt |= 32; + if (getTile(xt - 1, yt + 1) == id) + vt |= 64; + if (getTile(xt + 1, yt + 1) == id) + vt |= 128; return vt; } -u8 checkSurrTiles4(int xt, int yt, int id){ - u8 vt = 0; - if(getTile(xt,yt-1) == id) vt |= 1; - if(getTile(xt-1,yt) == id) vt |= 2; - if(getTile(xt+1,yt) == id) vt |= 4; - if(getTile(xt,yt+1) == id) vt |= 8; +u8 checkSurrTiles4(int xt, int yt, int id) { + u8 vt = 0; + if (getTile(xt, yt - 1) == id) + vt |= 1; + if (getTile(xt - 1, yt) == id) + vt |= 2; + if (getTile(xt + 1, yt) == id) + vt |= 4; + if (getTile(xt, yt + 1) == id) + vt |= 8; return vt; } u8 v = 0; u8 tData = 0; -void renderTile(int i, int x, int y){ - int age=0; - switch(i){ - case TILE_GRASS: - v = checkSurrTiles4(x >> 4,y >> 4, TILE_GRASS) - | checkSurrTiles4(x >> 4,y >> 4, TILE_TREE) - | checkSurrTiles4(x >> 4,y >> 4, TILE_FLOWER) - | checkSurrTiles4(x >> 4,y >> 4, TILE_SAPLING_TREE); - render16b(x,y,grassTable[v],80,0,0x69B569FF); - renderDotsWithColor(v, x, y, 0, 0x8ED38EFF); - break; - case TILE_TREE: - render16(x,y,treeTable[checkSurrTiles8(x >> 4,y >> 4, TILE_TREE)],16,0); - break; - case TILE_ROCK: - v = checkSurrTiles8(x >> 4,y >> 4, TILE_ROCK); - render16s(x,y,rockTable[v]+8192,0,0xFFFFFFFF); - renderRockDotsWithColor(rockTable[v], x, y, 0x949494FF); - break; - case TILE_HARDROCK: - v = checkSurrTiles8(x >> 4,y >> 4, TILE_HARDROCK); - render16s(x,y,rockTable[v]+8192,0,0xCFCFFFFF); - renderRockDotsWithColor(rockTable[v], x, y, 0x9494FFFF); - break; - case TILE_DIRT: - if(currentLevel>1)render16b(x,y,0,0,0,0x383838FF); - else render16b(x,y,0,0,0,0xA88F8FFF); - break; - case TILE_SAND: - v = checkSurrTiles4(x >> 4,y >> 4, TILE_SAND) - | checkSurrTiles4(x >> 4,y >> 4, TILE_CACTUS) - | checkSurrTiles4(x >> 4,y >> 4, TILE_SAPLING_CACTUS); - render16b(x,y,grassTable[v],80,0,0xF7F77BFF); - renderDotsWithColor(v, x, y, 0, 0xB7B75BFF); - break; - case TILE_WATER: - v = checkSurrTiles4(x >> 4,y >> 4, TILE_WATER)|checkSurrTiles4(x >> 4,y >> 4, TILE_HOLE); - render16b(x,y,grassTable[v],96,0,0x001DC1FF); - srand((tickCount + (x / 2 - y) * 4311)/10); - renderDotsWithColor(v, x, y, rand()&3, 0x6B6BFFFF); - break; - case TILE_LAVA: - v = checkSurrTiles4(x >> 4,y >> 4, TILE_LAVA)|checkSurrTiles4(x >> 4,y >> 4, TILE_HOLE); - render16b(x,y,grassTable[v],96,0,0xC11D00FF); - srand((tickCount + (x / 2 - y) * 4311)/10); - renderDotsWithColor(v, x, y, rand()&3, 0xFF6B6BFF); - break; - case TILE_HOLE: - render16b(x,y,grassTable[ - checkSurrTiles4(x >> 4,y >> 4, TILE_HOLE)| - checkSurrTiles4(x >> 4,y >> 4, TILE_WATER)| - checkSurrTiles4(x >> 4,y >> 4, TILE_LAVA) - ],96,0,0x383838FF); - break; - case TILE_CACTUS: - render16(x,y,48,0,0); - break; - case TILE_FLOWER: - render16(x,y,64,0,getData(x>>4,y>>4)); - break; - case TILE_STAIRS_DOWN: - if(currentLevel == 0) renderTile(TILE_CLOUD,x,y); - render16(x,y,96,0,0); - break; - case TILE_STAIRS_UP: - render16(x,y,112,0,0); - break; - case TILE_IRONORE: - render16b(x,y,80,0,0,0xDFC8C8FF); - break; - case TILE_GOLDORE: - render16b(x,y,80,0,0,0xE5E8B9FF); - break; - case TILE_GEMORE: - render16b(x,y,80,0,0,0xDF98DEFF); - break; - case TILE_CLOUD: - render16b(x,y,grassTable[checkSurrTiles4(x >> 4,y >> 4, TILE_CLOUD) - | checkSurrTiles4(x >> 4,y >> 4, TILE_STAIRS_DOWN) - | checkSurrTiles4(x >> 4,y >> 4, TILE_CLOUDCACTUS)],80,0,0xFFFFFFFF); - break; - case TILE_CLOUDCACTUS: - renderTile(TILE_CLOUD,x,y); - render16(x,y,80,0,0); - break; - case TILE_SAPLING_TREE: - renderTile(TILE_GRASS,x,y); - render16(x,y,32,0,0); - break; - case TILE_SAPLING_CACTUS: - renderTile(TILE_SAND,x,y); - render16(x,y,32,0,0); - break; - case TILE_FARM: - render16(x,y,144,0,0); - break; - case TILE_WHEAT: - age = getData(x>>4,y>>4)/20; - if(age > 5) age = 5; - render16(x,y,160+(age<<4),0,0); - break; - } - +void renderTile(int i, int x, int y) { + int age = 0; + switch (i) { + case TILE_GRASS: + v = checkSurrTiles4(x >> 4, y >> 4, TILE_GRASS) + | checkSurrTiles4(x >> 4, y >> 4, TILE_TREE) + | checkSurrTiles4(x >> 4, y >> 4, TILE_FLOWER) + | checkSurrTiles4(x >> 4, y >> 4, TILE_SAPLING_TREE); + render16b(x, y, grassTable[v], 80, 0, 0x69B569FF); + renderDotsWithColor(v, x, y, 0, 0x8ED38EFF); + break; + case TILE_TREE: + render16(x, y, treeTable[checkSurrTiles8(x >> 4, y >> 4, TILE_TREE)], + 16, 0); + break; + case TILE_ROCK: + v = checkSurrTiles8(x >> 4, y >> 4, TILE_ROCK); + render16s(x, y, rockTable[v] + 8192, 0, 0xFFFFFFFF); + renderRockDotsWithColor(rockTable[v], x, y, 0x949494FF); + break; + case TILE_HARDROCK: + v = checkSurrTiles8(x >> 4, y >> 4, TILE_HARDROCK); + render16s(x, y, rockTable[v] + 8192, 0, 0xCFCFFFFF); + renderRockDotsWithColor(rockTable[v], x, y, 0x9494FFFF); + break; + case TILE_DIRT: + if (currentLevel > 1) + render16b(x, y, 0, 0, 0, 0x383838FF); + else + render16b(x, y, 0, 0, 0, 0xA88F8FFF); + break; + case TILE_SAND: + v = checkSurrTiles4(x >> 4, y >> 4, TILE_SAND) + | checkSurrTiles4(x >> 4, y >> 4, TILE_CACTUS) + | checkSurrTiles4(x >> 4, y >> 4, TILE_SAPLING_CACTUS); + render16b(x, y, grassTable[v], 80, 0, 0xF7F77BFF); + renderDotsWithColor(v, x, y, 0, 0xB7B75BFF); + break; + case TILE_WATER: + v = checkSurrTiles4(x >> 4, y >> 4, TILE_WATER) + | checkSurrTiles4(x >> 4, y >> 4, TILE_HOLE); + render16b(x, y, grassTable[v], 96, 0, 0x001DC1FF); + srand((tickCount + (x / 2 - y) * 4311) / 10); + renderDotsWithColor(v, x, y, rand() & 3, 0x6B6BFFFF); + break; + case TILE_LAVA: + v = checkSurrTiles4(x >> 4, y >> 4, TILE_LAVA) + | checkSurrTiles4(x >> 4, y >> 4, TILE_HOLE); + render16b(x, y, grassTable[v], 96, 0, 0xC11D00FF); + srand((tickCount + (x / 2 - y) * 4311) / 10); + renderDotsWithColor(v, x, y, rand() & 3, 0xFF6B6BFF); + break; + case TILE_HOLE: + render16b(x, y, + grassTable[checkSurrTiles4(x >> 4, y >> 4, TILE_HOLE) + | checkSurrTiles4(x >> 4, y >> 4, TILE_WATER) + | checkSurrTiles4(x >> 4, y >> 4, TILE_LAVA)], 96, 0, + 0x383838FF); + break; + case TILE_CACTUS: + render16(x, y, 48, 0, 0); + break; + case TILE_FLOWER: + render16(x, y, 64, 0, getData(x >> 4, y >> 4)); + break; + case TILE_STAIRS_DOWN: + if (currentLevel == 0) + renderTile(TILE_CLOUD, x, y); + render16(x, y, 96, 0, 0); + break; + case TILE_STAIRS_UP: + render16(x, y, 112, 0, 0); + break; + case TILE_IRONORE: + render16b(x, y, 80, 0, 0, 0xDFC8C8FF); + break; + case TILE_GOLDORE: + render16b(x, y, 80, 0, 0, 0xE5E8B9FF); + break; + case TILE_GEMORE: + render16b(x, y, 80, 0, 0, 0xDF98DEFF); + break; + case TILE_CLOUD: + render16b(x, y, + grassTable[checkSurrTiles4(x >> 4, y >> 4, TILE_CLOUD) + | checkSurrTiles4(x >> 4, y >> 4, TILE_STAIRS_DOWN) + | checkSurrTiles4(x >> 4, y >> 4, TILE_CLOUDCACTUS)], + 80, 0, 0xFFFFFFFF); + break; + case TILE_CLOUDCACTUS: + renderTile(TILE_CLOUD, x, y); + render16(x, y, 80, 0, 0); + break; + case TILE_SAPLING_TREE: + renderTile(TILE_GRASS, x, y); + render16(x, y, 32, 0, 0); + break; + case TILE_SAPLING_CACTUS: + renderTile(TILE_SAND, x, y); + render16(x, y, 32, 0, 0); + break; + case TILE_FARM: + render16(x, y, 144, 0, 0); + break; + case TILE_WHEAT: + age = getData(x >> 4, y >> 4) / 20; + if (age > 5) + age = 5; + render16(x, y, 160 + (age << 4), 0, 0); + break; + } + } -void renderGui(){ - int i; - for(i=0;i<10;++i){ - if(i < player.p.health) render(i*8+1,1,168,152,0); else render(i*8+1,1,176,152,0); - if(i < player.p.stamina) render(i*8+1,10,184,152,0); else render(i*8+1,10,191,152,0); - } +void renderGui() { + int i; + for (i = 0; i < 10; ++i) { + if (i < player.p.health) + render(i * 8 + 1, 1, 168, 152, 0); + else + render(i * 8 + 1, 1, 176, 152, 0); + if (i < player.p.stamina) + render(i * 8 + 1, 10, 184, 152, 0); + else + render(i * 8 + 1, 10, 191, 152, 0); + } } -void renderPlayer(){ - if(player.p.isDead) return; - int xo = player.x - 8; +void renderPlayer() { + if (player.p.isDead) + return; + int xo = player.x - 8; int yo = player.y - 8; - - if(player.p.attackTimer > 0 && player.p.dir == 1){ - renderc(xo,yo-4,16,160,16,8,0); - renderItemIcon(player.p.activeItem->id,player.p.activeItem->countLevel,xo+4,yo-4); - } + + if (player.p.attackTimer > 0 && player.p.dir == 1) { + renderc(xo, yo - 4, 16, 160, 16, 8, 0); + renderItemIcon(player.p.activeItem->id, player.p.activeItem->countLevel, + xo + 4, yo - 4); + } u8 walk = (player.p.walkDist >> 4) & 1; bool swimming = isSwimming(); - switch(player.p.dir){ - case 0: // down - if(swimming)renderc(xo,yo+4,48,160+(((player.p.swimTimer>>4)&1)<<3),16,8,0); - else renderc(xo,yo+8,0,120+(player.p.isCarrying?16:0),16,8,walk==0?0:1); - renderc(xo,yo,0,112+(player.p.isCarrying?16:0),16,8,walk==0?0:1); - break; - case 1: // up - if(swimming)renderc(xo,yo+4,48,160+(((player.p.swimTimer>>4)&1)<<3),16,8,0); - else renderc(xo,yo+8,16,120+(player.p.isCarrying?16:0),16,8,walk==0?0:1); - renderc(xo,yo,16,112+(player.p.isCarrying?16:0),16,8,walk==0?0:1); - break; - case 2: // left - if(swimming)renderc(xo,yo+4,48,160+(((player.p.swimTimer>>4)&1)<<3),16,8,0); - else renderc(xo,yo+8,32+(walk<<4),120+(player.p.isCarrying?16:0),16,8,1); - renderc(xo,yo,32+(walk<<4),112+(player.p.isCarrying?16:0),16,8,1); - break; - case 3: // right - if(swimming)renderc(xo,yo+4,48,160+(((player.p.swimTimer>>4)&1)<<3),16,8,0); - else renderc(xo,yo+8,32+(walk<<4),120+(player.p.isCarrying?16:0),16,8,0); - renderc(xo,yo,32+(walk<<4),112+(player.p.isCarrying?16:0),16,8,0); - break; - } - - if(player.p.isCarrying){ - renderFurniture(player.p.activeItem->id, xo, yo-12); - } - - if(player.p.attackTimer > 0){ - switch(player.p.dir){ - case 0: - renderc(xo-player.p.ax,yo-player.p.ay+12,16,168,16,8,0); - renderItemIcon(player.p.activeItem->id,player.p.activeItem->countLevel, xo+4,yo+12); - break; - case 2: - renderc(xo-player.p.ax-4,yo-player.p.ay,32,160,8,16,0); - renderItemIcon(player.p.activeItem->id,player.p.activeItem->countLevel, xo-4,yo+4); - break; - case 3: - renderc(xo-player.p.ax+12,yo-player.p.ay,40,160,8,16,0); - renderItemIcon(player.p.activeItem->id,player.p.activeItem->countLevel, xo+12,yo+4); - break; - } - } + switch (player.p.dir) { + case 0: // down + if (swimming) + renderc(xo, yo + 4, 48, + 160 + (((player.p.swimTimer >> 4) & 1) << 3), 16, 8, 0); + else + renderc(xo, yo + 8, 0, 120 + (player.p.isCarrying ? 16 : 0), 16, 8, + walk == 0 ? 0 : 1); + renderc(xo, yo, 0, 112 + (player.p.isCarrying ? 16 : 0), 16, 8, + walk == 0 ? 0 : 1); + break; + case 1: // up + if (swimming) + renderc(xo, yo + 4, 48, + 160 + (((player.p.swimTimer >> 4) & 1) << 3), 16, 8, 0); + else + renderc(xo, yo + 8, 16, 120 + (player.p.isCarrying ? 16 : 0), 16, 8, + walk == 0 ? 0 : 1); + renderc(xo, yo, 16, 112 + (player.p.isCarrying ? 16 : 0), 16, 8, + walk == 0 ? 0 : 1); + break; + case 2: // left + if (swimming) + renderc(xo, yo + 4, 48, + 160 + (((player.p.swimTimer >> 4) & 1) << 3), 16, 8, 0); + else + renderc(xo, yo + 8, 32 + (walk << 4), + 120 + (player.p.isCarrying ? 16 : 0), 16, 8, 1); + renderc(xo, yo, 32 + (walk << 4), 112 + (player.p.isCarrying ? 16 : 0), + 16, 8, 1); + break; + case 3: // right + if (swimming) + renderc(xo, yo + 4, 48, + 160 + (((player.p.swimTimer >> 4) & 1) << 3), 16, 8, 0); + else + renderc(xo, yo + 8, 32 + (walk << 4), + 120 + (player.p.isCarrying ? 16 : 0), 16, 8, 0); + renderc(xo, yo, 32 + (walk << 4), 112 + (player.p.isCarrying ? 16 : 0), + 16, 8, 0); + break; + } + + if (player.p.isCarrying) { + renderFurniture(player.p.activeItem->id, xo, yo - 12); + } + + if (player.p.attackTimer > 0) { + switch (player.p.dir) { + case 0: + renderc(xo - player.p.ax, yo - player.p.ay + 12, 16, 168, 16, 8, 0); + renderItemIcon(player.p.activeItem->id, + player.p.activeItem->countLevel, xo + 4, yo + 12); + break; + case 2: + renderc(xo - player.p.ax - 4, yo - player.p.ay, 32, 160, 8, 16, 0); + renderItemIcon(player.p.activeItem->id, + player.p.activeItem->countLevel, xo - 4, yo + 4); + break; + case 3: + renderc(xo - player.p.ax + 12, yo - player.p.ay, 40, 160, 8, 16, 0); + renderItemIcon(player.p.activeItem->id, + player.p.activeItem->countLevel, xo + 12, yo + 4); + break; + } + } } -void renderBackground(int xScroll, int yScroll){ - int xo = xScroll >> 4; +void renderMenuBackground(int xScroll, int yScroll) { + sf2d_draw_rectangle(0, 0, 400, 240, RGBA8(12, 12, 12, 255)); //You might think "real" black would be better, but it actually looks better that way + renderLightsToStencil(); + renderBackground(xScroll, yScroll); + resetStencilStuff(); +} + +void renderBackground(int xScroll, int yScroll) { + int xo = xScroll >> 4; int yo = yScroll >> 4; - int x,y; - for (x = xo;x <= 13 + xo; ++x) { - for (y = yo;y <= 8 + yo; ++y)renderTile(getTile(x,y),x << 4,y << 4); + int x, y; + for (x = xo; x <= 13 + xo; ++x) { + for (y = yo; y <= 8 + yo; ++y) + renderTile(getTile(x, y), x << 4, y << 4); } } -char * fontChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789.,!?'\"-+=/\\%()<>:; "; +char * fontChars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789.,!?'\"-+=/\\%()<>:; "; -void drawText(char * msg, u32 x, u32 y){ - int i = 0; - x-=offsetX<<1; - y-=offsetY<<1; - for(i = 0; i> 5; if (ix >= 0) { - sf2d_draw_texture_part(font,x + i * 12,y,(ix&31)*12,16+(iy*12),12,12); + sf2d_draw_texture_part(font, x + i * 12, y, (ix & 31) * 12, + 16 + (iy * 12), 12, 12); } } } -void drawSizedText(char * msg, u32 x, u32 y, float size){ - int i = 0; - for(i = 0; i> 5; if (ix >= 0) { - sf2d_draw_texture_part_scale(font,(x + i * 8) * size,y,(ix&31)<<3,iy<<3,8,8,size,size); + sf2d_draw_texture_part_scale(font, (x + i * 8) * size, y, + (ix & 31) << 3, iy << 3, 8, 8, size, size); } } } -void drawTextColor(char * msg, u32 x, u32 y, u32 color){ - int i = 0; - x-=offsetX<<1; - y-=offsetY<<1; - for(i = 0; i> 5; if (ix >= 0) { - sf2d_draw_texture_part_blend(font,x + i * 12,y,(ix&31)*12,16+(iy*12),12,12, color); + sf2d_draw_texture_part_blend(font, x + i * 12, y, (ix & 31) * 12, + 16 + (iy * 12), 12, 12, color); } } } // Changes text color after the first space. -void drawTextColorSpecial(char * msg, u32 x, u32 y, u32 color, u32 color2){ - int i = 0; - x-=offsetX<<1; - y-=offsetY<<1; - bool sOver = false; - for(i = 0; i> 5; if (ix >= 0) { - if(sOver)sf2d_draw_texture_part_blend(font,x + i * 12,y,(ix&31)*12,16+(iy*12),12,12, color2); - else sf2d_draw_texture_part_blend(font,x + i * 12,y,(ix&31)*12,16+(iy*12),12,12, color); + if (sOver) + sf2d_draw_texture_part_blend(font, x + i * 12, y, + (ix & 31) * 12, 16 + (iy * 12), 12, 12, color2); + else + sf2d_draw_texture_part_blend(font, x + i * 12, y, + (ix & 31) * 12, 16 + (iy * 12), 12, 12, color); } } } - -void drawSizedTextColor(char * msg, int x, int y, float size, u32 color){ - int i; - for(i = 0; i> 5; - if (ix >= 0) sf2d_draw_texture_part_scale_blend(font,(x + i * 8) * size,y*size,(ix&31)<<3,iy<<3,8,8,size,size,color); + if (ix >= 0) + sf2d_draw_texture_part_scale_blend(font, (x + i * 8) * size, + y * size, (ix & 31) << 3, iy << 3, 8, 8, size, size, color); } } -void renderFurniture(int itemID, int x, int y){ - switch(itemID){ - case ITEM_ANVIL: render16(x,y,64,128,0); break; - case ITEM_CHEST: render16(x,y,80,128,0); break; - case ITEM_OVEN: render16(x,y,96,128,0); break; - case ITEM_FURNACE: render16(x,y,112,128,0); break; - case ITEM_WORKBENCH: render16(x,y,128,128,0); break; - case ITEM_LANTERN: render16(x,y,144,128,0); break; - } +void renderFurniture(int itemID, int x, int y) { + switch (itemID) { + case ITEM_ANVIL: + render16(x, y, 64, 128, 0); + break; + case ITEM_CHEST: + render16(x, y, 80, 128, 0); + break; + case ITEM_OVEN: + render16(x, y, 96, 128, 0); + break; + case ITEM_FURNACE: + render16(x, y, 112, 128, 0); + break; + case ITEM_WORKBENCH: + render16(x, y, 128, 128, 0); + break; + case ITEM_LANTERN: + render16(x, y, 144, 128, 0); + break; + } } - + char ertxt[20]; -void renderEntity(Entity* e, int x, int y){ - switch(e->type){ - case ENTITY_ITEM: - if (e->entityItem.age >= 520) if (e->entityItem.age / 6 % 2 == 0) return; - renderItemIcon2(e->entityItem.item.id,e->entityItem.item.countLevel, x-4, y-4, (int)e->entityItem.zz); - break; - case ENTITY_FURNITURE: renderFurniture(e->entityFurniture.itemID, x-8, y-8); break; - case ENTITY_ZOMBIE: - switch(e->zombie.dir){ - case 0: // down - render16b(x-8,y-8,64,112,((e->zombie.walkDist>>4)&1)==0?0:1,e->zombie.color); - break; - case 1: // up - render16b(x-8,y-8,80,112,((e->zombie.walkDist>>4)&1)==0?0:1,e->zombie.color); - break; - case 2: // left - render16b(x-8,y-8,96+(((e->zombie.walkDist>>4)&1)<<4),112,1,e->zombie.color); - break; - case 3: // right - render16b(x-8,y-8,96+(((e->zombie.walkDist>>4)&1)<<4),112,0,e->zombie.color); - break; - } - break; - case ENTITY_SLIME: - render16b(x-8,y-8-(e->slime.jumpTime>0?4:0),128+(e->slime.jumpTime>0?16:0),112,0,e->slime.color); - break; - case ENTITY_AIRWIZARD: - e->wizard.spriteAdjust = 0; - if(e->wizard.health < 200){ if (tickCount / 4 % 3 < 2) e->wizard.spriteAdjust = 16; } - else if(e->wizard.health < 1000){ if (tickCount / 5 % 4 < 2) e->wizard.spriteAdjust = 16; } - switch(e->wizard.dir){ - case 0: // down - render16(x-8,y-8,160,112+e->wizard.spriteAdjust,((e->wizard.walkDist>>4)&1)==0?0:1); - break; - case 1: // up - render16(x-8,y-8,176,112+e->wizard.spriteAdjust,((e->wizard.walkDist>>4)&1)==0?0:1); - break; - case 2: // left - render16(x-8,y-8,192+(((e->wizard.walkDist>>4)&1)<<4),112+e->wizard.spriteAdjust,1); - break; - case 3: // right - render16(x-8,y-8,192+(((e->wizard.walkDist>>4)&1)<<4),112+e->wizard.spriteAdjust,0); - break; - } - break; - case ENTITY_TEXTPARTICLE: - x-=offsetX; - y-=offsetY; - drawSizedTextColor(e->textParticle.text,x+1,y-(int)e->textParticle.zz+1,2,0xFF); - drawSizedTextColor(e->textParticle.text,x,y-(int)e->textParticle.zz,2,e->textParticle.color); - break; - case ENTITY_SMASHPARTICLE: render16(x,y,0,160,0); break; - case ENTITY_SPARK: - if (e->spark.age >= 200) if (e->spark.age / 6 % 2 == 0) return; - renderr(x,y,200,152,0,e->spark.age*0.0349); - break; - } +void renderEntity(Entity* e, int x, int y) { + switch (e->type) { + case ENTITY_ITEM: + if (e->entityItem.age >= 520) + if (e->entityItem.age / 6 % 2 == 0) + return; + renderItemIcon2(e->entityItem.item.id, e->entityItem.item.countLevel, + x - 4, y - 4, (int) e->entityItem.zz); + break; + case ENTITY_FURNITURE: + renderFurniture(e->entityFurniture.itemID, x - 8, y - 8); + break; + case ENTITY_ZOMBIE: + switch (e->zombie.dir) { + case 0: // down + render16b(x - 8, y - 8, 64, 112, + ((e->zombie.walkDist >> 4) & 1) == 0 ? 0 : 1, + e->zombie.color); + break; + case 1: // up + render16b(x - 8, y - 8, 80, 112, + ((e->zombie.walkDist >> 4) & 1) == 0 ? 0 : 1, + e->zombie.color); + break; + case 2: // left + render16b(x - 8, y - 8, 96 + (((e->zombie.walkDist >> 4) & 1) << 4), + 112, 1, e->zombie.color); + break; + case 3: // right + render16b(x - 8, y - 8, 96 + (((e->zombie.walkDist >> 4) & 1) << 4), + 112, 0, e->zombie.color); + break; + } + break; + case ENTITY_SLIME: + render16b(x - 8, y - 8 - (e->slime.jumpTime > 0 ? 4 : 0), + 128 + (e->slime.jumpTime > 0 ? 16 : 0), 112, 0, e->slime.color); + break; + case ENTITY_AIRWIZARD: + e->wizard.spriteAdjust = 0; + if (e->wizard.health < 200) { + if (tickCount / 4 % 3 < 2) + e->wizard.spriteAdjust = 16; + } else if (e->wizard.health < 1000) { + if (tickCount / 5 % 4 < 2) + e->wizard.spriteAdjust = 16; + } + switch (e->wizard.dir) { + case 0: // down + render16(x - 8, y - 8, 160, 112 + e->wizard.spriteAdjust, + ((e->wizard.walkDist >> 4) & 1) == 0 ? 0 : 1); + break; + case 1: // up + render16(x - 8, y - 8, 176, 112 + e->wizard.spriteAdjust, + ((e->wizard.walkDist >> 4) & 1) == 0 ? 0 : 1); + break; + case 2: // left + render16(x - 8, y - 8, 192 + (((e->wizard.walkDist >> 4) & 1) << 4), + 112 + e->wizard.spriteAdjust, 1); + break; + case 3: // right + render16(x - 8, y - 8, 192 + (((e->wizard.walkDist >> 4) & 1) << 4), + 112 + e->wizard.spriteAdjust, 0); + break; + } + break; + case ENTITY_TEXTPARTICLE: + x -= offsetX; + y -= offsetY; + drawSizedTextColor(e->textParticle.text, x + 1, + y - (int) e->textParticle.zz + 1, 2, 0xFF); + drawSizedTextColor(e->textParticle.text, x, + y - (int) e->textParticle.zz, 2, e->textParticle.color); + break; + case ENTITY_SMASHPARTICLE: + render16(x, y, 0, 160, 0); + break; + case ENTITY_SPARK: + if (e->spark.age >= 200) + if (e->spark.age / 6 % 2 == 0) + return; + renderr(x, y, 200, 152, 0, e->spark.age * 0.0349); + break; + } } -void renderEntities(int x, int y, EntityManager* em){ - int i; - for(i = 0; i < em->lastSlot[currentLevel]; ++i){ - Entity e = em->entities[currentLevel][i]; - if(e.x > x-200 && e.y > y-125 && e.xlastSlot[currentLevel]; ++i) { + Entity e = em->entities[currentLevel][i]; + if (e.x > x - 200 && e.y > y - 125 && e.x < x + 200 && e.y < y + 125) + renderEntity(&e, e.x, e.y); + } } -void renderItemList(Inventory * inv,int xo, int yo, int x1, int y1, int selected){ - // If lastSlot is 0, then there are no items are in the inventory. - bool drawCursor = true; - if(selected < 0){ - drawCursor = false; - selected = 0; - } +void renderItemList(Inventory * inv, int xo, int yo, int x1, int y1, + int selected) { + // If lastSlot is 0, then there are no items are in the inventory. + bool drawCursor = true; + if (selected < 0) { + drawCursor = false; + selected = 0; + } int w = x1 - xo; int h = y1 - yo - 2; int i1 = inv->lastSlot; - if (i1 > h) i1 = h; + if (i1 > h) + i1 = h; int io = selected - h / 2; - if (io > inv->lastSlot - h) io = inv->lastSlot - h; - if (io < 0) io = 0; + if (io > inv->lastSlot - h) + io = inv->lastSlot - h; + if (io < 0) + io = 0; - int i; - for(i = 0; i < i1; ++i) renderItemWithText(&inv->items[i+io], (1 + xo) << 4, (i + 1 + yo) << 4); - - if(drawCursor){ - int yy = selected + 1 - io + yo; - sf2d_draw_rectangle((xo<<4)-(offsetX<<1),(yy<<4)-(offsetY<<1),12,12,0xFF); - drawText(">", (xo << 4), yy << 4); - sf2d_draw_rectangle(((xo+w)<<4)-12-(offsetX<<1),(yy<<4)-(offsetY<<1),12,12,0xFF); - drawText("<", ((xo+w)<<4)-12, yy<<4); - } + int i; + for (i = 0; i < i1; ++i) + renderItemWithText(&inv->items[i + io], (1 + xo) << 4, + (i + 1 + yo) << 4); + + if (drawCursor) { + int yy = selected + 1 - io + yo; + sf2d_draw_rectangle((xo << 4) - (offsetX << 1), + (yy << 4) - (offsetY << 1), 12, 12, 0xFF); + drawText(">", (xo << 4), yy << 4); + sf2d_draw_rectangle(((xo + w) << 4) - 12 - (offsetX << 1), + (yy << 4) - (offsetY << 1), 12, 12, 0xFF); + drawText("<", ((xo + w) << 4) - 12, yy << 4); + } } -void renderRecipes(RecipeManager * r,int xo, int yo, int x1, int y1, int selected){ - int size = r->size; - if(size < 1) return; - if(selected < 0) selected = 0; +void renderRecipes(RecipeManager * r, int xo, int yo, int x1, int y1, + int selected) { + int size = r->size; + if (size < 1) + return; + if (selected < 0) + selected = 0; int w = x1 - xo; int h = y1 - yo - 2; int i1 = size; - if (i1 > h) i1 = h; + if (i1 > h) + i1 = h; int io = selected - h / 2; - if (io > size - h) io = size - h; - if (io < 0) io = 0; + if (io > size - h) + io = size - h; + if (io < 0) + io = 0; + + int i, col; + for (i = 0; i < i1; ++i) { + int x = (1 + xo) << 4, y = (i + 1 + yo) << 4; + renderItemIcon(r->recipes[i + io].itemResult, + r->recipes[i + io].itemAmountLevel, x >> 1, y >> 1); + if (r->recipes[i + io].canCraft) + col = 0xFFFFFFFF; + else + col = 0x7F7F7FFF; + drawTextColor( + getBasicItemName(r->recipes[i + io].itemResult, + r->recipes[i + io].itemAmountLevel), x + 18, y + 2, + col); + } - int i, col; - for(i = 0; i < i1; ++i){ - int x = (1 + xo) << 4, y = (i + 1 + yo) << 4; - renderItemIcon(r->recipes[i+io].itemResult,r->recipes[i+io].itemAmountLevel,x>>1,y>>1); - if(r->recipes[i+io].canCraft) col = 0xFFFFFFFF; - else col = 0x7F7F7FFF; - drawTextColor(getBasicItemName(r->recipes[i+io].itemResult,r->recipes[i+io].itemAmountLevel),x+18,y+2,col); - } - int yy = selected + 1 - io + yo; - sf2d_draw_rectangle(xo<<4,yy<<4,12,12,0xFF); + sf2d_draw_rectangle(xo << 4, yy << 4, 12, 12, 0xFF); drawText(">", xo << 4, yy << 4); - sf2d_draw_rectangle(((xo+w)<<4)-12,yy<<4,12,12,0xFF); - drawText("<", ((xo+w)<<4)-12, yy<<4); + sf2d_draw_rectangle(((xo + w) << 4) - 12, yy << 4, 12, 12, 0xFF); + drawText("<", ((xo + w) << 4) - 12, yy << 4); } -void renderItemWithText(Item* item, int x, int y){ - renderItemIcon(item->id,item->countLevel,x>>1,y>>1); - if(item->onlyOne) drawText(getItemName(item->id,item->countLevel),x+18,y+2); - else drawTextColorSpecial(getItemName(item->id,item->countLevel),x+18,y+2,0xD2D2D2FF,0xFFFFFFFF); +void renderItemWithText(Item* item, int x, int y) { + renderItemIcon(item->id, item->countLevel, x >> 1, y >> 1); + if (item->onlyOne) + drawText(getItemName(item->id, item->countLevel), x + 18, y + 2); + else + drawTextColorSpecial(getItemName(item->id, item->countLevel), x + 18, + y + 2, 0xD2D2D2FF, 0xFFFFFFFF); } -void renderItemIcon2(int itemID, int countLevel, int x, int y, int z){ - switch(itemID){ - case ITEM_NULL: return; - case TOOL_SHOVEL: renderb(x,y,countLevel*8,144,0,0xFF); break; - case TOOL_HOE: renderb(x,y,40+countLevel*8,144,0,0xFF); break; - case TOOL_SWORD: renderb(x,y,80+countLevel*8,144,0,0xFF); break; - case TOOL_PICKAXE: renderb(x,y,120+countLevel*8,144,0,0xFF); break; - case TOOL_AXE: renderb(x,y,160+countLevel*8,144,0,0xFF); break; - case ITEM_ANVIL: renderb(x,y,120,152,0,0xFF); break; - case ITEM_CHEST: renderb(x,y,128,152,0,0xFF); break; - case ITEM_OVEN: renderb(x,y,136,152,0,0xFF); break; - case ITEM_FURNACE: renderb(x,y,144,152,0,0xFF); break; - case ITEM_WORKBENCH: renderb(x,y,152,152,0,0xFF); break; - case ITEM_LANTERN: renderb(x,y,160,152,0,0xFF); break; - case ITEM_POWGLOVE: renderb(x,y,56,152,0,0xFF); break; - case ITEM_FLOWER: renderb(x,y,0,152,0,0xFF); break; - case ITEM_WOOD: renderb(x,y,8,152,0,0xFF); break; - case ITEM_STONE: renderb(x,y,16,152,0,0xFF); break; - case ITEM_SAND: renderb(x,y,16,152,0,0xFF); break; - case ITEM_DIRT: renderb(x,y,16,152,0,0xFF); break; - case ITEM_CLOUD: renderb(x,y,16,152,0,0xFF); break; - case ITEM_ACORN: renderb(x,y,24,152,0,0xFF); break; - case ITEM_CACTUS: renderb(x,y,32,152,0,0xFF); break; - case ITEM_SEEDS: renderb(x,y,40,152,0,0xFF); break; - case ITEM_WHEAT: renderb(x,y,48,152,0,0xFF); break; - case ITEM_FLESH: renderb(x,y,64,152,0,0xFF); break; - case ITEM_BREAD: renderb(x,y,72,152,0,0xFF); break; - case ITEM_APPLE: renderb(x,y,80,152,0,0xFF); break; - case ITEM_SLIME: renderb(x,y,88,152,0,0xFF); break; - case ITEM_COAL: renderb(x,y,88,152,0,0xFF); break; - case ITEM_IRONORE: renderb(x,y,88,152,0,0xFF); break; - case ITEM_GOLDORE: renderb(x,y,88,152,0,0xFF); break; - case ITEM_IRONINGOT: renderb(x,y,96,152,0,0xFF); break; - case ITEM_GOLDINGOT: renderb(x,y,96,152,0,0xFF); break; - case ITEM_GLASS: renderb(x,y,104,152,0,0xFF); break; - case ITEM_GEM: renderb(x,y,112,152,0,0xFF); break; - } - y-=z; - renderItemIcon(itemID, countLevel, x, y); +void renderItemIcon2(int itemID, int countLevel, int x, int y, int z) { + switch (itemID) { + case ITEM_NULL: + return; + case TOOL_SHOVEL: + renderb(x, y, countLevel * 8, 144, 0, 0xFF); + break; + case TOOL_HOE: + renderb(x, y, 40 + countLevel * 8, 144, 0, 0xFF); + break; + case TOOL_SWORD: + renderb(x, y, 80 + countLevel * 8, 144, 0, 0xFF); + break; + case TOOL_PICKAXE: + renderb(x, y, 120 + countLevel * 8, 144, 0, 0xFF); + break; + case TOOL_AXE: + renderb(x, y, 160 + countLevel * 8, 144, 0, 0xFF); + break; + case ITEM_ANVIL: + renderb(x, y, 120, 152, 0, 0xFF); + break; + case ITEM_CHEST: + renderb(x, y, 128, 152, 0, 0xFF); + break; + case ITEM_OVEN: + renderb(x, y, 136, 152, 0, 0xFF); + break; + case ITEM_FURNACE: + renderb(x, y, 144, 152, 0, 0xFF); + break; + case ITEM_WORKBENCH: + renderb(x, y, 152, 152, 0, 0xFF); + break; + case ITEM_LANTERN: + renderb(x, y, 160, 152, 0, 0xFF); + break; + case ITEM_POWGLOVE: + renderb(x, y, 56, 152, 0, 0xFF); + break; + case ITEM_FLOWER: + renderb(x, y, 0, 152, 0, 0xFF); + break; + case ITEM_WOOD: + renderb(x, y, 8, 152, 0, 0xFF); + break; + case ITEM_STONE: + renderb(x, y, 16, 152, 0, 0xFF); + break; + case ITEM_SAND: + renderb(x, y, 16, 152, 0, 0xFF); + break; + case ITEM_DIRT: + renderb(x, y, 16, 152, 0, 0xFF); + break; + case ITEM_CLOUD: + renderb(x, y, 16, 152, 0, 0xFF); + break; + case ITEM_ACORN: + renderb(x, y, 24, 152, 0, 0xFF); + break; + case ITEM_CACTUS: + renderb(x, y, 32, 152, 0, 0xFF); + break; + case ITEM_SEEDS: + renderb(x, y, 40, 152, 0, 0xFF); + break; + case ITEM_WHEAT: + renderb(x, y, 48, 152, 0, 0xFF); + break; + case ITEM_FLESH: + renderb(x, y, 64, 152, 0, 0xFF); + break; + case ITEM_BREAD: + renderb(x, y, 72, 152, 0, 0xFF); + break; + case ITEM_APPLE: + renderb(x, y, 80, 152, 0, 0xFF); + break; + case ITEM_SLIME: + renderb(x, y, 88, 152, 0, 0xFF); + break; + case ITEM_COAL: + renderb(x, y, 88, 152, 0, 0xFF); + break; + case ITEM_IRONORE: + renderb(x, y, 88, 152, 0, 0xFF); + break; + case ITEM_GOLDORE: + renderb(x, y, 88, 152, 0, 0xFF); + break; + case ITEM_IRONINGOT: + renderb(x, y, 96, 152, 0, 0xFF); + break; + case ITEM_GOLDINGOT: + renderb(x, y, 96, 152, 0, 0xFF); + break; + case ITEM_GLASS: + renderb(x, y, 104, 152, 0, 0xFF); + break; + case ITEM_GEM: + renderb(x, y, 112, 152, 0, 0xFF); + break; + } + y -= z; + renderItemIcon(itemID, countLevel, x, y); } -void renderItemIcon(int itemID,int countLevel, int x, int y){ - switch(itemID){ - case ITEM_NULL: return; - case TOOL_SHOVEL: render(x,y,countLevel*8,144,0); break; - case TOOL_HOE: render(x,y,40+countLevel*8,144,0); break; - case TOOL_SWORD: render(x,y,80+countLevel*8,144,0); break; - case TOOL_PICKAXE: render(x,y,120+countLevel*8,144,0); break; - case TOOL_AXE: render(x,y,160+countLevel*8,144,0); break; - case ITEM_ANVIL: render(x,y,120,152,0); break; - case ITEM_CHEST: render(x,y,128,152,0); break; - case ITEM_OVEN: render(x,y,136,152,0); break; - case ITEM_FURNACE: render(x,y,144,152,0); break; - case ITEM_WORKBENCH: render(x,y,152,152,0); break; - case ITEM_LANTERN: render(x,y,160,152,0); break; - case ITEM_POWGLOVE: render(x,y,56,152,0); break; - case ITEM_FLOWER: render(x,y,0,152,0); break; - case ITEM_WOOD: render(x,y,8,152,0); break; - case ITEM_STONE: renderb(x,y,16,152,0,0xCFCFCFFF); break; - case ITEM_SAND: renderb(x,y,16,152,0,0xF7F77BFF); break; - case ITEM_DIRT: renderb(x,y,16,152,0,0xAF9781FF); break; - case ITEM_CLOUD: renderb(x,y,16,152,0,0xFFFFFFFF); break; - case ITEM_ACORN: render(x,y,24,152,0); break; - case ITEM_CACTUS: render(x,y,32,152,0); break; - case ITEM_SEEDS: render(x,y,40,152,0); break; - case ITEM_WHEAT: render(x,y,48,152,0); break; - case ITEM_FLESH: render(x,y,64,152,0); break; - case ITEM_BREAD: render(x,y,72,152,0); break; - case ITEM_APPLE: render(x,y,80,152,0); break; - case ITEM_SLIME: renderb(x,y,88,152,0,0x4DC04DFF); break; - case ITEM_COAL: renderb(x,y,88,152,0,0x383838FF); break; - case ITEM_IRONORE: renderb(x,y,88,152,0,0xBC9999FF); break; - case ITEM_GOLDORE: renderb(x,y,88,152,0,0xCECE77FF); break; - case ITEM_IRONINGOT: renderb(x,y,96,152,0,0xDFC8C8FF); break; - case ITEM_GOLDINGOT: renderb(x,y,96,152,0,0xEAEABCFF); break; - case ITEM_GLASS: render(x,y,104,152,0); break; - case ITEM_GEM: render(x,y,112,152,0); break; - } +void renderItemIcon(int itemID, int countLevel, int x, int y) { + switch (itemID) { + case ITEM_NULL: + return; + case TOOL_SHOVEL: + render(x, y, countLevel * 8, 144, 0); + break; + case TOOL_HOE: + render(x, y, 40 + countLevel * 8, 144, 0); + break; + case TOOL_SWORD: + render(x, y, 80 + countLevel * 8, 144, 0); + break; + case TOOL_PICKAXE: + render(x, y, 120 + countLevel * 8, 144, 0); + break; + case TOOL_AXE: + render(x, y, 160 + countLevel * 8, 144, 0); + break; + case ITEM_ANVIL: + render(x, y, 120, 152, 0); + break; + case ITEM_CHEST: + render(x, y, 128, 152, 0); + break; + case ITEM_OVEN: + render(x, y, 136, 152, 0); + break; + case ITEM_FURNACE: + render(x, y, 144, 152, 0); + break; + case ITEM_WORKBENCH: + render(x, y, 152, 152, 0); + break; + case ITEM_LANTERN: + render(x, y, 160, 152, 0); + break; + case ITEM_POWGLOVE: + render(x, y, 56, 152, 0); + break; + case ITEM_FLOWER: + render(x, y, 0, 152, 0); + break; + case ITEM_WOOD: + render(x, y, 8, 152, 0); + break; + case ITEM_STONE: + renderb(x, y, 16, 152, 0, 0xCFCFCFFF); + break; + case ITEM_SAND: + renderb(x, y, 16, 152, 0, 0xF7F77BFF); + break; + case ITEM_DIRT: + renderb(x, y, 16, 152, 0, 0xAF9781FF); + break; + case ITEM_CLOUD: + renderb(x, y, 16, 152, 0, 0xFFFFFFFF); + break; + case ITEM_ACORN: + render(x, y, 24, 152, 0); + break; + case ITEM_CACTUS: + render(x, y, 32, 152, 0); + break; + case ITEM_SEEDS: + render(x, y, 40, 152, 0); + break; + case ITEM_WHEAT: + render(x, y, 48, 152, 0); + break; + case ITEM_FLESH: + render(x, y, 64, 152, 0); + break; + case ITEM_BREAD: + render(x, y, 72, 152, 0); + break; + case ITEM_APPLE: + render(x, y, 80, 152, 0); + break; + case ITEM_SLIME: + renderb(x, y, 88, 152, 0, 0x4DC04DFF); + break; + case ITEM_COAL: + renderb(x, y, 88, 152, 0, 0x383838FF); + break; + case ITEM_IRONORE: + renderb(x, y, 88, 152, 0, 0xBC9999FF); + break; + case ITEM_GOLDORE: + renderb(x, y, 88, 152, 0, 0xCECE77FF); + break; + case ITEM_IRONINGOT: + renderb(x, y, 96, 152, 0, 0xDFC8C8FF); + break; + case ITEM_GOLDINGOT: + renderb(x, y, 96, 152, 0, 0xEAEABCFF); + break; + case ITEM_GLASS: + render(x, y, 104, 152, 0); + break; + case ITEM_GEM: + render(x, y, 112, 152, 0); + break; + } } -void defineTables(){ - - int i = 0; - for(i = 256;i > 0;--i){ - // Creates the lookup table for the tree tile. - if((i&255)==255) treeTable[i] = 208; - else if((i&239)==239) treeTable[i] = 144; - else if((i&191)==191) treeTable[i] = 160; - else if((i&127)==127) treeTable[i] = 176; - else if((i&223)==223) treeTable[i] = 192; - else if((i&206)==206) treeTable[i] = 112; - else if((i&55)==55) treeTable[i] = 128; - else if((i&173)==173) treeTable[i] = 96; - else if((i&91)==91) treeTable[i] = 80; - - else if((i&159)==159) treeTable[i] = 224; - else if((i&111)==111) treeTable[i] = 240; - - else if((i&19)==19) treeTable[i] = 64; - else if((i&37)==37) treeTable[i] = 48; - else if((i&74)==74) treeTable[i] = 32; - else if((i&140)==140) treeTable[i] = 16; - } - - /* - boolean up = i & 1 - boolean left = i & 2 - boolean right = i & 4 - boolean down = i & 8 - boolean up-left = i & 16 - boolean up-right = i & 32 - boolean down-left = i & 64 - boolean down-right = i & 128 - */ - - for(i = 256;i > 0;--i){ - // Creates the lookup table for the rock tile. - if((i&255)==255) rockTable[i] = 208; - else if((i&239)==239) rockTable[i] = 144; - else if((i&191)==191) rockTable[i] = 160; - else if((i&127)==127) rockTable[i] = 176; - else if((i&223)==223) rockTable[i] = 192; - else if((i&207)==207) rockTable[i] = 256*16+32; - else if((i&63)==63) rockTable[i] = 256*16+16; - else if((i&206)==206) rockTable[i] = 112; - else if((i&95)==95) rockTable[i] = 256*32+144; - else if((i&159)==159) rockTable[i] = 256*32+160; - else if((i&31)==31) rockTable[i] = 256*32+208; - else if((i&55)==55) rockTable[i] = 128; - else if((i&175)==175) rockTable[i] = 256*32+128; - else if((i&143)==143) rockTable[i] = 256*32+224; - else if((i&173)==173) rockTable[i] = 96; - else if((i&111)==111) rockTable[i] = 256*32+112; - else if((i&47)==47) rockTable[i] = 256*32+48; - else if((i&45)==45) rockTable[i] = 256*32+176; - else if((i&79)==79) rockTable[i] = 256*32+192; - else if((i&23)==23) rockTable[i] = 256*32+96; - else if((i&91)==91) rockTable[i] = 80; - else if((i&27)==27) rockTable[i] = 256*16+96; - else if((i&19)==19) rockTable[i] = 64; - else if((i&75)==75) rockTable[i] = 256*32; - else if((i&141)==141) rockTable[i] = 256*32+16; - else if((i&142)==142) rockTable[i] = 256*32+32; - else if((i&78)==78) rockTable[i] = 256*32+64; - else if((i&39)==39) rockTable[i] = 256*32+80; - else if((i&37)==37) rockTable[i] = 48; - else if((i&74)==74) rockTable[i] = 32; - else if((i&140)==140) rockTable[i] = 16; - else if((i&15)==15) rockTable[i] = 256*16+112; - else if((i&11)==11) rockTable[i] = 256*16+192; - else if((i&13)==13) rockTable[i] = 256*16+208; - else if((i&14)==14) rockTable[i] = 256*16+224; - else if((i&7)==7) rockTable[i] = 256*16+240; - else if((i&12)==12) rockTable[i] = 256*16+128; - else if((i&10)==10) rockTable[i] = 256*16+144; - else if((i&5)==5) rockTable[i] = 256*16+160; - else if((i&3)==3) rockTable[i] = 256*16+176; - else if((i&9)==9) rockTable[i] = 256*16; - else if((i&6)==6) rockTable[i] = 256*16+48; - else if((i&8)==8) rockTable[i] = 224; - else if((i&4)==4) rockTable[i] = 256*16+64; - else if((i&2)==2) rockTable[i] = 256*16+80; - else if((i&1)==1) rockTable[i] = 240; - - } - - // Lookup table for the grass/sand tile. - grassTable[1] = 192; - grassTable[2] = 160; - grassTable[3] = 64; - grassTable[4] = 144; - grassTable[5] = 48; - grassTable[6] = 224; - grassTable[7] = 128; - grassTable[8] = 176; - grassTable[9] = 240; - grassTable[10] = 32; - grassTable[11] = 80; - grassTable[12] = 16; - grassTable[13] = 96; - grassTable[14] = 112; - grassTable[15] = 208; - +void defineTables() { + + int i = 0; + for (i = 256; i > 0; --i) { + // Creates the lookup table for the tree tile. + if ((i & 255) == 255) + treeTable[i] = 208; + else if ((i & 239) == 239) + treeTable[i] = 144; + else if ((i & 191) == 191) + treeTable[i] = 160; + else if ((i & 127) == 127) + treeTable[i] = 176; + else if ((i & 223) == 223) + treeTable[i] = 192; + else if ((i & 206) == 206) + treeTable[i] = 112; + else if ((i & 55) == 55) + treeTable[i] = 128; + else if ((i & 173) == 173) + treeTable[i] = 96; + else if ((i & 91) == 91) + treeTable[i] = 80; + + else if ((i & 159) == 159) + treeTable[i] = 224; + else if ((i & 111) == 111) + treeTable[i] = 240; + + else if ((i & 19) == 19) + treeTable[i] = 64; + else if ((i & 37) == 37) + treeTable[i] = 48; + else if ((i & 74) == 74) + treeTable[i] = 32; + else if ((i & 140) == 140) + treeTable[i] = 16; + } + + /* + boolean up = i & 1 + boolean left = i & 2 + boolean right = i & 4 + boolean down = i & 8 + boolean up-left = i & 16 + boolean up-right = i & 32 + boolean down-left = i & 64 + boolean down-right = i & 128 + */ + + for (i = 256; i > 0; --i) { + // Creates the lookup table for the rock tile. + if ((i & 255) == 255) + rockTable[i] = 208; + else if ((i & 239) == 239) + rockTable[i] = 144; + else if ((i & 191) == 191) + rockTable[i] = 160; + else if ((i & 127) == 127) + rockTable[i] = 176; + else if ((i & 223) == 223) + rockTable[i] = 192; + else if ((i & 207) == 207) + rockTable[i] = 256 * 16 + 32; + else if ((i & 63) == 63) + rockTable[i] = 256 * 16 + 16; + else if ((i & 206) == 206) + rockTable[i] = 112; + else if ((i & 95) == 95) + rockTable[i] = 256 * 32 + 144; + else if ((i & 159) == 159) + rockTable[i] = 256 * 32 + 160; + else if ((i & 31) == 31) + rockTable[i] = 256 * 32 + 208; + else if ((i & 55) == 55) + rockTable[i] = 128; + else if ((i & 175) == 175) + rockTable[i] = 256 * 32 + 128; + else if ((i & 143) == 143) + rockTable[i] = 256 * 32 + 224; + else if ((i & 173) == 173) + rockTable[i] = 96; + else if ((i & 111) == 111) + rockTable[i] = 256 * 32 + 112; + else if ((i & 47) == 47) + rockTable[i] = 256 * 32 + 48; + else if ((i & 45) == 45) + rockTable[i] = 256 * 32 + 176; + else if ((i & 79) == 79) + rockTable[i] = 256 * 32 + 192; + else if ((i & 23) == 23) + rockTable[i] = 256 * 32 + 96; + else if ((i & 91) == 91) + rockTable[i] = 80; + else if ((i & 27) == 27) + rockTable[i] = 256 * 16 + 96; + else if ((i & 19) == 19) + rockTable[i] = 64; + else if ((i & 75) == 75) + rockTable[i] = 256 * 32; + else if ((i & 141) == 141) + rockTable[i] = 256 * 32 + 16; + else if ((i & 142) == 142) + rockTable[i] = 256 * 32 + 32; + else if ((i & 78) == 78) + rockTable[i] = 256 * 32 + 64; + else if ((i & 39) == 39) + rockTable[i] = 256 * 32 + 80; + else if ((i & 37) == 37) + rockTable[i] = 48; + else if ((i & 74) == 74) + rockTable[i] = 32; + else if ((i & 140) == 140) + rockTable[i] = 16; + else if ((i & 15) == 15) + rockTable[i] = 256 * 16 + 112; + else if ((i & 11) == 11) + rockTable[i] = 256 * 16 + 192; + else if ((i & 13) == 13) + rockTable[i] = 256 * 16 + 208; + else if ((i & 14) == 14) + rockTable[i] = 256 * 16 + 224; + else if ((i & 7) == 7) + rockTable[i] = 256 * 16 + 240; + else if ((i & 12) == 12) + rockTable[i] = 256 * 16 + 128; + else if ((i & 10) == 10) + rockTable[i] = 256 * 16 + 144; + else if ((i & 5) == 5) + rockTable[i] = 256 * 16 + 160; + else if ((i & 3) == 3) + rockTable[i] = 256 * 16 + 176; + else if ((i & 9) == 9) + rockTable[i] = 256 * 16; + else if ((i & 6) == 6) + rockTable[i] = 256 * 16 + 48; + else if ((i & 8) == 8) + rockTable[i] = 224; + else if ((i & 4) == 4) + rockTable[i] = 256 * 16 + 64; + else if ((i & 2) == 2) + rockTable[i] = 256 * 16 + 80; + else if ((i & 1) == 1) + rockTable[i] = 240; + + } + + // Lookup table for the grass/sand tile. + grassTable[1] = 192; + grassTable[2] = 160; + grassTable[3] = 64; + grassTable[4] = 144; + grassTable[5] = 48; + grassTable[6] = 224; + grassTable[7] = 128; + grassTable[8] = 176; + grassTable[9] = 240; + grassTable[10] = 32; + grassTable[11] = 80; + grassTable[12] = 16; + grassTable[13] = 96; + grassTable[14] = 112; + grassTable[15] = 208; + } diff --git a/source/Render.h b/source/Render.h index e4a5f78..f26b3b2 100644 --- a/source/Render.h +++ b/source/Render.h @@ -9,28 +9,36 @@ sf2d_texture *icons; sf2d_texture *font; -sf2d_texture *lightScreen; +sf2d_texture *playerLightBake; +sf2d_texture *lanternLightBake; int offsetX, offsetY; void render(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits); void renderb(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, u32 color); -void renderr(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits,float rotate); -void renderc(s32 xp, s32 yp, u32 xTile, u32 yTile,int sizeX, int sizeY, u8 bits); -void renderbc(s32 xp, s32 yp, u32 xTile, u32 yTile,int sizeX, int sizeY, u8 bits, u32 color); +void renderr(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, float rotate); +void renderc(s32 xp, s32 yp, u32 xTile, u32 yTile, int sizeX, int sizeY, + u8 bits); +void renderbc(s32 xp, s32 yp, u32 xTile, u32 yTile, int sizeX, int sizeY, + u8 bits, u32 color); void render16(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits); -void render16c(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits,float scaleX,float scaleY); -void render16b(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits,u32 color); -void render16s(s32 xp, s32 yp, u32 tile, u8 bits,u32 color); +void render16c(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, float scaleX, + float scaleY); +void render16b(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, u32 color); +void render16s(s32 xp, s32 yp, u32 tile, u8 bits, u32 color); void renderTitle(int x, int y); void renderFrame(int x1, int y1, int x2, int y2, u32 bgColor); void renderTile(int i, int x, int y); void renderBackground(int xScroll, int yScroll); +void renderMenuBackground(int xScroll, int yScroll); //Renders the darkness void renderButtonIcon(u32 icon, int x, int y, float scale); -void renderLights(); -void renderLight(int x, int y, int r); -void renderLightScreen(); +void bakeLights(); +void freeLightBakes(); +void renderLightsToStencil(); +void resetStencilStuff(); +void bakeLight(sf2d_texture* texture, int x, int y, int r); +void renderLight(int x, int y, sf2d_texture* texture); void renderGui(); void renderPlayer(); @@ -45,8 +53,10 @@ void renderFurniture(int itemID, int x, int y); void renderEntity(Entity* e, int x, int y); void renderEntities(int x, int y, EntityManager* em); -void renderRecipes(RecipeManager * r,int xo, int yo, int x1, int y1, int selected); -void renderItemList(Inventory * inv,int xo, int yo, int x1, int y1, int selected); +void renderRecipes(RecipeManager * r, int xo, int yo, int x1, int y1, + int selected); +void renderItemList(Inventory * inv, int xo, int yo, int x1, int y1, + int selected); void renderItemWithText(Item* item, int x, int y); void renderItemIcon(int itemID, int countLevel, int x, int y); void renderItemIcon2(int itemID, int countLevel, int x, int y, int z); diff --git a/source/main.c b/source/main.c index f25251f..ace61c1 100644 --- a/source/main.c +++ b/source/main.c @@ -15,158 +15,200 @@ #include "MapGen.h" #include "Menu.h" +void initMiniMap(bool loadUpWorld) { + int i, x, y; + for (i = 0; i < 5; ++i) { + for (x = 0; x < 128; ++x) { + for (y = 0; y < 128; ++y) { -void initMiniMap(bool loadUpWorld){ - int i,x,y; - for(i=0;i<5;++i){ - for(x=0;x < 128;++x){ - for(y=0;y < 128;++y){ - - if(!loadUpWorld){ // generate stairs up when making a new world. - switch(map[i][x+y*128]){ - case TILE_STAIRS_DOWN: - map[i+1][x+y*128] = TILE_STAIRS_UP; - if(i == 0){ - map[i+1][(x+1)+y*128] = TILE_HARDROCK; - map[i+1][x+(y+1)*128] = TILE_HARDROCK; - map[i+1][(x-1)+y*128] = TILE_HARDROCK; - map[i+1][x+(y-1)*128] = TILE_HARDROCK; - map[i+1][(x+1)+(y+1)*128] = TILE_HARDROCK; - map[i+1][(x-1)+(y-1)*128] = TILE_HARDROCK; - map[i+1][(x-1)+(y+1)*128] = TILE_HARDROCK; - map[i+1][(x+1)+(y-1)*128] = TILE_HARDROCK; - } else { - map[i+1][(x+1)+y*128] = TILE_DIRT; - map[i+1][x+(y+1)*128] = TILE_DIRT; - map[i+1][(x-1)+y*128] = TILE_DIRT; - map[i+1][x+(y-1)*128] = TILE_DIRT; - map[i+1][(x+1)+(y+1)*128] = TILE_DIRT; - map[i+1][(x-1)+(y-1)*128] = TILE_DIRT; - map[i+1][(x-1)+(y+1)*128] = TILE_DIRT; - map[i+1][(x+1)+(y-1)*128] = TILE_DIRT; - } - } - } - - /* Minimaps */ - switch(map[i][x+y*128]){ - case TILE_WATER: sf2d_set_pixel (minimap[i], x, y, 0xFFFF0000); break; - case TILE_LAVA: sf2d_set_pixel (minimap[i], x, y, 0xFF0000FF); break; - case TILE_DIRT: sf2d_set_pixel (minimap[i], x, y, 0xFF6C6D82); break; - case TILE_ROCK: sf2d_set_pixel (minimap[i], x, y, 0xFF7F7F7F); break; - case TILE_HARDROCK: sf2d_set_pixel (minimap[i], x, y, 0xFF7F5F5F); break; - case TILE_GRASS: sf2d_set_pixel (minimap[i], x, y, 0xFF00FF00); break; - case TILE_TREE: sf2d_set_pixel (minimap[i], x, y, 0xFF007F00); break; - case TILE_SAND: sf2d_set_pixel (minimap[i], x, y, 0xFF00FFFF); break; - case TILE_CACTUS: sf2d_set_pixel (minimap[i], x, y, 0xFF009F00); break; - case TILE_FLOWER: sf2d_set_pixel (minimap[i], x, y, 0xFF00FF3F); break; - case TILE_IRONORE: sf2d_set_pixel (minimap[i], x, y, 0xFF9696DC); break; - case TILE_GOLDORE: sf2d_set_pixel (minimap[i], x, y, 0xFF9AE8E5); break; - case TILE_GEMORE: sf2d_set_pixel (minimap[i], x, y, 0xFFDE98DF); break; - case TILE_CLOUD: sf2d_set_pixel (minimap[i], x, y, 0xFFFFFFFF); break; - case TILE_CLOUDCACTUS: sf2d_set_pixel (minimap[i], x, y, 0xFFAFAFAF); break; - case TILE_STAIRS_DOWN: sf2d_set_pixel (minimap[i], x, y, 0xFF9F9F9F); break; - case TILE_STAIRS_UP: sf2d_set_pixel (minimap[i], x, y, 0xFF9F9F9F); break; - default: sf2d_set_pixel (minimap[i], x, y, 0xFF111111); break; - } - } - } - } + if (!loadUpWorld) { // generate stairs up when making a new world. + switch (map[i][x + y * 128]) { + case TILE_STAIRS_DOWN: + map[i + 1][x + y * 128] = TILE_STAIRS_UP; + if (i == 0) { + map[i + 1][(x + 1) + y * 128] = TILE_HARDROCK; + map[i + 1][x + (y + 1) * 128] = TILE_HARDROCK; + map[i + 1][(x - 1) + y * 128] = TILE_HARDROCK; + map[i + 1][x + (y - 1) * 128] = TILE_HARDROCK; + map[i + 1][(x + 1) + (y + 1) * 128] = TILE_HARDROCK; + map[i + 1][(x - 1) + (y - 1) * 128] = TILE_HARDROCK; + map[i + 1][(x - 1) + (y + 1) * 128] = TILE_HARDROCK; + map[i + 1][(x + 1) + (y - 1) * 128] = TILE_HARDROCK; + } else { + map[i + 1][(x + 1) + y * 128] = TILE_DIRT; + map[i + 1][x + (y + 1) * 128] = TILE_DIRT; + map[i + 1][(x - 1) + y * 128] = TILE_DIRT; + map[i + 1][x + (y - 1) * 128] = TILE_DIRT; + map[i + 1][(x + 1) + (y + 1) * 128] = TILE_DIRT; + map[i + 1][(x - 1) + (y - 1) * 128] = TILE_DIRT; + map[i + 1][(x - 1) + (y + 1) * 128] = TILE_DIRT; + map[i + 1][(x + 1) + (y - 1) * 128] = TILE_DIRT; + } + } + } + + /* Minimaps */ + switch (map[i][x + y * 128]) { + case TILE_WATER: + sf2d_set_pixel(minimap[i], x, y, 0xFFFF0000); + break; + case TILE_LAVA: + sf2d_set_pixel(minimap[i], x, y, 0xFF0000FF); + break; + case TILE_DIRT: + sf2d_set_pixel(minimap[i], x, y, 0xFF6C6D82); + break; + case TILE_ROCK: + sf2d_set_pixel(minimap[i], x, y, 0xFF7F7F7F); + break; + case TILE_HARDROCK: + sf2d_set_pixel(minimap[i], x, y, 0xFF7F5F5F); + break; + case TILE_GRASS: + sf2d_set_pixel(minimap[i], x, y, 0xFF00FF00); + break; + case TILE_TREE: + sf2d_set_pixel(minimap[i], x, y, 0xFF007F00); + break; + case TILE_SAND: + sf2d_set_pixel(minimap[i], x, y, 0xFF00FFFF); + break; + case TILE_CACTUS: + sf2d_set_pixel(minimap[i], x, y, 0xFF009F00); + break; + case TILE_FLOWER: + sf2d_set_pixel(minimap[i], x, y, 0xFF00FF3F); + break; + case TILE_IRONORE: + sf2d_set_pixel(minimap[i], x, y, 0xFF9696DC); + break; + case TILE_GOLDORE: + sf2d_set_pixel(minimap[i], x, y, 0xFF9AE8E5); + break; + case TILE_GEMORE: + sf2d_set_pixel(minimap[i], x, y, 0xFFDE98DF); + break; + case TILE_CLOUD: + sf2d_set_pixel(minimap[i], x, y, 0xFFFFFFFF); + break; + case TILE_CLOUDCACTUS: + sf2d_set_pixel(minimap[i], x, y, 0xFFAFAFAF); + break; + case TILE_STAIRS_DOWN: + sf2d_set_pixel(minimap[i], x, y, 0xFF9F9F9F); + break; + case TILE_STAIRS_UP: + sf2d_set_pixel(minimap[i], x, y, 0xFF9F9F9F); + break; + default: + sf2d_set_pixel(minimap[i], x, y, 0xFF111111); + break; + } + } + } + } } -void initNewMap(){ - newSeed(); - createAndValidateSkyMap(128,128,map[0],data[0]); - createAndValidateTopMap(128,128,map[1],data[1]); - createAndValidateUndergroundMap(128,128,1,map[2],data[2]); - createAndValidateUndergroundMap(128,128,2,map[3],data[3]); - createAndValidateUndergroundMap(128,128,3,map[4],data[4]); +void initNewMap() { + newSeed(); + createAndValidateSkyMap(128, 128, map[0], data[0]); + createAndValidateTopMap(128, 128, map[1], data[1]); + createAndValidateUndergroundMap(128, 128, 1, map[2], data[2]); + createAndValidateUndergroundMap(128, 128, 2, map[3], data[3]); + createAndValidateUndergroundMap(128, 128, 3, map[4], data[4]); } -void setupGame(bool loadUpWorld){ - currentLevel = 1; - - // Reset entity manager. - memset(&eManager, 0, sizeof(eManager)); - sf2d_set_clear_color(RGBA8(0x82, 0x6D, 0x6C, 0xFF)); - - if(!loadUpWorld){ - initNewMap(); - initPlayer(); - airWizardHealthDisplay = 2000; - int i; - for(i=0;i<5;++i){ - trySpawn(500, i); - } - addEntityToList(newAirWizardEntity(630,820,0), &eManager); - } else { - initPlayer(); - loadWorld(currentFileName, &eManager, &player, (u8*)map, (u8*)data); - } - - initMiniMap(loadUpWorld); - initGame = 0; +void setupGame(bool loadUpWorld) { + currentLevel = 1; + + // Reset entity manager. + memset(&eManager, 0, sizeof(eManager)); + sf2d_set_clear_color(RGBA8(0x82, 0x6D, 0x6C, 0xFF)); + + if (!loadUpWorld) { + initNewMap(); + initPlayer(); + airWizardHealthDisplay = 2000; + int i; + for (i = 0; i < 5; ++i) { + trySpawn(500, i); + } + addEntityToList(newAirWizardEntity(630, 820, 0), &eManager); + } else { + initPlayer(); + loadWorld(currentFileName, &eManager, &player, (u8*) map, (u8*) data); + } + + initMiniMap(loadUpWorld); + initGame = 0; } +int xscr = 0, yscr = 0; +void tick() { + if (player.p.isDead) { + if (player.p.endTimer < 1) { + currentMenu = MENU_LOSE; + } + --player.p.endTimer; + return; + } else if (player.p.hasWon) { + if (player.p.endTimer < 1) { + currentMenu = MENU_WIN; + } + --player.p.endTimer; + return; + } -int xscr=0, yscr=0; -void tick(){ - if(player.p.isDead){ - if(player.p.endTimer < 1){ - currentMenu = MENU_LOSE; - } - --player.p.endTimer; - return; - } else if(player.p.hasWon){ - if(player.p.endTimer < 1){ - currentMenu = MENU_WIN; - } - --player.p.endTimer; - return; - } - - int i; - for(i = 0;i < 324;++i){ + int i; + for (i = 0; i < 324; ++i) { int xx = rand() & 127; int yy = rand() & 127; - tickTile(xx,yy); - } + tickTile(xx, yy); + } tickPlayer(); - xscr = player.x - 100; + xscr = player.x - 100; yscr = player.y - 56; - if (xscr < 16) xscr = 16; else if (xscr > 1832) xscr = 1832; - if (yscr < 16) yscr = 16; else if (yscr > 1912) yscr = 1912; - - for(i = 0; i < eManager.lastSlot[currentLevel]; ++i){ - Entity * e = &eManager.entities[currentLevel][i]; - if((e->type != ENTITY_ZOMBIE && e->type != ENTITY_SLIME) || (e->x > player.x-160 && e->y > player.y-125 && e->xy 1832) + xscr = 1832; + if (yscr < 16) + yscr = 16; + else if (yscr > 1912) + yscr = 1912; + + for (i = 0; i < eManager.lastSlot[currentLevel]; ++i) { + Entity * e = &eManager.entities[currentLevel][i]; + if ((e->type != ENTITY_ZOMBIE && e->type != ENTITY_SLIME) + || (e->x > player.x - 160 && e->y > player.y - 125 + && e->x < player.x + 160 && e->y < player.y + 125)) + tickEntity(e); + } + } -void clearScreen(int* data, u8 fill, int size){ - int i; - for (i=0; i < size/4; ++i) data[i] = 0x000000FF; +void clearScreen(int* data, u8 fill, int size) { + int i; + for (i = 0; i < size / 4; ++i) + data[i] = 0x000000FF; } - char debugText[34]; char bossHealthText[34]; -int main() -{ +int main() { sf2d_init(); csndInit(); - noItem = newItem(ITEM_NULL,0); - + noItem = newItem(ITEM_NULL, 0); + currentMenu = MENU_TITLE; - currentSelection = 0; + currentSelection = 0; quitGame = false; - icons = sfil_load_PNG_buffer(icons2_png, SF2D_PLACE_RAM); - font = sfil_load_PNG_buffer(Font_png, SF2D_PLACE_RAM); - + icons = sfil_load_PNG_buffer(icons2_png, SF2D_PLACE_RAM); + font = sfil_load_PNG_buffer(Font_png, SF2D_PLACE_RAM); + //consoleInit(GFX_BOTTOM, NULL); - // printf("Press 'Start' to exit.\n"); + // printf("Press 'Start' to exit.\n"); loadSound(&snd_playerHurt, "resources/playerhurt.raw"); loadSound(&snd_playerDeath, "resources/playerdeath.raw"); @@ -175,17 +217,20 @@ int main() loadSound(&snd_pickup, "resources/pickup.raw"); loadSound(&snd_bossdeath, "resources/bossdeath.raw"); loadSound(&snd_craft, "resources/craft.raw"); - - int i; - for(i = 0;i < 5;++i){ - minimap[i] = sf2d_create_texture(128,128,TEXFMT_RGBA8,SF2D_PLACE_RAM); - sf2d_texture_tile32(minimap[i]); - } - - sf2d_set_vblank_wait(true); - + + bakeLights(); + + int i; + for (i = 0; i < 5; ++i) { + minimap[i] = sf2d_create_texture(128, 128, TEXFMT_RGBA8, + SF2D_PLACE_RAM); + sf2d_texture_tile32(minimap[i]); + } + + sf2d_set_vblank_wait(true); + sf2d_set_clear_color(0xFF); - + /* Default inputs */ k_up.input = KEY_DUP | KEY_CPAD_UP | KEY_CSTICK_UP; k_down.input = KEY_DDOWN | KEY_CPAD_DOWN | KEY_CSTICK_DOWN; @@ -194,86 +239,102 @@ int main() k_attack.input = KEY_A | KEY_B | KEY_L | KEY_ZR; k_menu.input = KEY_X | KEY_Y | KEY_R | KEY_ZL; k_pause.input = KEY_START; - k_accept.input = KEY_A; - k_decline.input = KEY_B; - k_delete.input = KEY_X; - FILE * file; - - /* If btnSave exists, then use that. */ - if ((file = fopen("btnSave.bin", "rb"))){ - fread(&k_up.input, sizeof(int), 1, file); - fread(&k_down.input, sizeof(int), 1, file); - fread(&k_left.input, sizeof(int), 1, file); - fread(&k_right.input, sizeof(int), 1, file); - fread(&k_attack.input, sizeof(int), 1, file); - fread(&k_menu.input, sizeof(int), 1, file); - fread(&k_pause.input, sizeof(int), 1, file); - fread(&k_accept.input, sizeof(int), 1, file); - fread(&k_decline.input, sizeof(int), 1, file); - fread(&k_delete.input, sizeof(int), 1, file); - fclose(file); - } - + k_accept.input = KEY_A; + k_decline.input = KEY_B; + k_delete.input = KEY_X; + FILE * file; + + /* If btnSave exists, then use that. */ + if ((file = fopen("btnSave.bin", "rb"))) { + fread(&k_up.input, sizeof(int), 1, file); + fread(&k_down.input, sizeof(int), 1, file); + fread(&k_left.input, sizeof(int), 1, file); + fread(&k_right.input, sizeof(int), 1, file); + fread(&k_attack.input, sizeof(int), 1, file); + fread(&k_menu.input, sizeof(int), 1, file); + fread(&k_pause.input, sizeof(int), 1, file); + fread(&k_accept.input, sizeof(int), 1, file); + fread(&k_decline.input, sizeof(int), 1, file); + fread(&k_delete.input, sizeof(int), 1, file); + fclose(file); + } + //screenShot = false; - - tickCount=0; - initRecipes(); - defineTables(); + + tickCount = 0; + initRecipes(); + defineTables(); while (aptMainLoop()) { ++tickCount; hidScanInput(); - tickKeys(hidKeysHeld(),hidKeysDown()); + tickKeys(hidKeysHeld(), hidKeysDown()); //if (quitGame || hidKeysHeld() & KEY_SELECT) break; - if (quitGame) break; + if (quitGame) + break; //if (hidKeysDown() & (KEY_L | KEY_R)) screenShot = true; - // else screenShot = false; - - if(initGame > 0) setupGame(initGame == 1 ? true : false); - - if(currentMenu == 0){ - tick(); - sprintf(fpsstr, " FPS: %.0f, X:%d, Y:%d, E:%d", sf2d_get_fps(),player.x, player.y,eManager.lastSlot[currentLevel]); - sf2d_start_frame(GFX_TOP, GFX_LEFT); - if(currentLevel == 0){ - sf2d_draw_texture_part_scale(minimap[1],(-xscr/3)-256,(-yscr/3)-32,0,0,128,128,12.5,7.5); - sf2d_draw_rectangle(0,0,400,240, 0xDFDFDFAF); - } - offsetX = xscr;offsetY = yscr; - renderBackground(xscr,yscr); - renderEntities(player.x, player.y, &eManager); - renderPlayer(); - offsetX = 0;offsetY = 0; - renderItemWithText(player.p.activeItem, 10, 205); - // drawText(debugText,2,208); - drawText(fpsstr,2,225); - sf2d_end_frame(); - - sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); - if(currentLevel == 0 && airWizardHealthDisplay > 0){ - sprintf(bossHealthText, "BOSS: %.0f%%", ((float)airWizardHealthDisplay/2000.0)*100); - drawText(bossHealthText,2,225); - } - renderGui(); - sf2d_draw_texture(minimap[currentLevel], 192, 112);//y:56 - sf2d_end_frame(); - } else{ - tickMenu(currentMenu); - renderMenu(currentMenu,xscr,yscr); - } - + // else screenShot = false; + + if (initGame > 0) + setupGame(initGame == 1 ? true : false); + + if (currentMenu == 0) { + tick(); + sprintf(fpsstr, " FPS: %.0f, X:%d, Y:%d, E:%d", sf2d_get_fps(), + player.x, player.y, eManager.lastSlot[currentLevel]); + sf2d_start_frame(GFX_TOP, GFX_LEFT); + if (currentLevel == 0) { + sf2d_draw_texture_part_scale(minimap[1], (-xscr / 3) - 256, + (-yscr / 3) - 32, 0, 0, 128, 128, 12.5, 7.5); + //sf2d_draw_rectangle(0, 0, 400, 240, 0xDFDFDFAF); + } + + offsetX = xscr; + offsetY = yscr; + //if(currentLevel) + sf2d_draw_rectangle(0, 0, 400, 240, RGBA8(12, 12, 12, 255)); //You might think "real" black would be better, but it actually looks better that way + renderLightsToStencil(); + + renderBackground(xscr, yscr); + renderEntities(player.x, player.y, &eManager); + renderPlayer(); + + resetStencilStuff(); + offsetX = 0; + offsetY = 0; + renderItemWithText(player.p.activeItem, 10, 205); + // drawText(debugText,2,208); + drawText(fpsstr, 2, 225); + sf2d_end_frame(); + + sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); + if (currentLevel == 0 && airWizardHealthDisplay > 0) { + sprintf(bossHealthText, "BOSS: %.0f%%", + ((float) airWizardHealthDisplay / 2000.0) * 100); + drawText(bossHealthText, 2, 225); + } + renderGui(); + sf2d_draw_texture(minimap[currentLevel], 192, 112); //y:56 + sf2d_end_frame(); + } else { + tickMenu(currentMenu); + renderMenu(currentMenu, xscr, yscr); + } + sf2d_swapbuffers(); } - - freeRecipes(); + + freeRecipes(); + + freeLightBakes(); sf2d_free_texture(icons); sf2d_free_texture(minimap[0]); sf2d_free_texture(minimap[1]); sf2d_free_texture(minimap[2]); sf2d_free_texture(minimap[3]); sf2d_free_texture(minimap[4]); - freeSounds(); - csndExit(); + freeSounds(); + csndExit(); sf2d_fini(); return 0; }