From 68ceaf60d47a3a8ee12286f55879945749057576 Mon Sep 17 00:00:00 2001 From: RSDuck Date: Thu, 22 Oct 2015 01:52:17 +0200 Subject: [PATCH] Darkness! Added darkness for deeper levels, at the moment only tested with Citra --- .gitignore | 10 + Menu.c | 1006 ++++++++++++++++++++++++ source/Globals.h | 1 - source/Item.h | 1 + source/Menu.c | 12 +- source/Render.c | 1962 ++++++++++++++++++++++++++++++---------------- source/Render.h | 34 +- source/main.c | 467 ++++++----- 8 files changed, 2577 insertions(+), 916 deletions(-) create mode 100644 Menu.c diff --git a/.gitignore b/.gitignore index 96374c4..fcc45a9 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,13 @@ $RECYCLE.BIN/ Network Trash Folder Temporary Items .apdisk + +# 3DS Dev +*.3dsx +*.elf +*.smdh + +# Eclipse +.settings +.cproject +.project diff --git a/Menu.c b/Menu.c new file mode 100644 index 0000000..dafc8bf --- /dev/null +++ b/Menu.c @@ -0,0 +1,1006 @@ +#include "Menu.h" + +char options[][12] = {"Start Game", "How To Play","Settings", "About", "Exit"}; +char pOptions[][24] = {"Return to game", "Save Progress", "Exit to title"}; +char keybOptions[][24] = {"Exit and Save", "Exit and Don't save","Reset to default"}; + +// Rebind buttons menu (Settings) +int keys[] = { + KEY_A,KEY_B,KEY_X,KEY_Y, + KEY_CPAD_UP,KEY_CPAD_DOWN,KEY_CPAD_LEFT,KEY_CPAD_RIGHT, + KEY_DUP, KEY_DDOWN, KEY_DLEFT, KEY_DRIGHT, + KEY_CSTICK_UP,KEY_CSTICK_DOWN,KEY_CSTICK_LEFT,KEY_CSTICK_RIGHT, + KEY_L,KEY_R,KEY_ZL,KEY_ZR, + KEY_START,KEY_SELECT +}; +int keyProp[10] = {[0 ... 9] = 0}; +bool areYouSure = false; +bool areYouSureSave = false; +bool bindOpt = false; +bool left = false; +bool selBut = false; +s8 errorBut = -1; +s8 curSaveSel = 0; + +// Load Game Menu (Start Game) +char fileNames[1000][256]; +int fileScore[1000]; +bool fileWin[1000]; +s16 worldFileCount = 0; +bool enteringName = false; +s8 touchDelay = 0; +bool isTouching = false; +int touchX = 0, touchY = 0, touchW = 0, touchH = 0; +s8 errorFileName = 0; + +s16 pauseSaveDisplayTimer = 0; + +void readFiles(){ + memset(&fileNames, 0, 256000); // reset fileNames + worldFileCount = 0; + DIR * d; + struct dirent * dir; + d = opendir("."); + if (d){ + while ((dir = readdir(d)) != NULL) { + if (strstr(dir->d_name, ".wld") != NULL) { // Check if filename contains ".wld" + strncpy(fileNames[worldFileCount], dir->d_name, strlen(dir->d_name)-4); + FILE * file = fopen(dir->d_name, "rb"); + fread(&fileScore[worldFileCount],sizeof(int), 1, file); + fread(&fileWin[worldFileCount],sizeof(bool), 1, file); + fclose(file); + ++worldFileCount; + } + } + closedir(d); + } +} + +s8 checkFileNameForErrors(){ + int length = strlen(fileNames[worldFileCount]); + if(length < 1)return 1; // Error: Length cannot be 0. + int i; + bool isGood = false; + for(i=0; i < length; ++i){ if(isalnum((int)fileNames[worldFileCount][i])) isGood = true; } + if(!isGood) return 2; // Error: Filename must contain atleast one letter or number. + + DIR * d; + struct dirent * dir; + d = opendir("."); + if (d){ + while ((dir = readdir(d)) != NULL) { + if (strstr(dir->d_name, ".wld") != NULL) { // Check if filename contains ".wld" + char cmprFile[256]; + strncpy(cmprFile, dir->d_name, strlen(dir->d_name)-4); + if(strncmp(fileNames[worldFileCount],cmprFile,strlen(fileNames[worldFileCount])) == 0) return 3; // Error: Filename cannot already exist. + } + } + closedir(d); + } + + return 0; // No errors found! +} + +void addToFileName(char * c){ + strncat(fileNames[worldFileCount], c, 1); +} + +/* Keypad */ +void doTouchButton(touchPosition touch){ + int xVal = touch.px, yVal = touch.py; + int strLength = strlen(fileNames[worldFileCount]); + if(yVal >= 60 && yVal < 80){ // 0 to 9 + if(xVal >= 4 && xVal < 4+16){ touchX = 4; if(strLength < 24)addToFileName("1");} + else if(xVal >= 36 && xVal < 4+32+16){ touchX = 36; if(strLength < 24)addToFileName("2");} + else if(xVal >= 68 && xVal < 4+64+16){ touchX = 68; if(strLength < 24)addToFileName("3");} + else if(xVal >= 100 && xVal < 4+96+16){ touchX = 100; if(strLength < 24)addToFileName("4");} + else if(xVal >= 132 && xVal < 4+128+16){ touchX = 132; if(strLength < 24)addToFileName("5");} + else if(xVal >= 164 && xVal < 4+160+16){ touchX = 164; if(strLength < 24)addToFileName("6");} + else if(xVal >= 196 && xVal < 4+192+16){ touchX = 196; if(strLength < 24)addToFileName("7");} + else if(xVal >= 228 && xVal < 4+224+16){ touchX = 228; if(strLength < 24)addToFileName("8");} + else if(xVal >= 260 && xVal < 4+256+16){ touchX = 260; if(strLength < 24)addToFileName("9");} + else if(xVal >= 292 && xVal < 4+288+16){ touchX = 292; if(strLength < 24)addToFileName("0");} + else return; + touchY = 56; + touchW = 22; + touchH = 22; + touchDelay = 6; + isTouching = true; + } else if(yVal >= 80 && yVal < 100){ // Q to P + if(xVal >= 4 && xVal < 4+16){ touchX = 4; if(strLength < 24)addToFileName("Q");} + else if(xVal >= 36 && xVal < 4+32+16){ touchX = 36; if(strLength < 24)addToFileName("W");} + else if(xVal >= 68 && xVal < 4+64+16){ touchX = 68; if(strLength < 24)addToFileName("E");} + else if(xVal >= 100 && xVal < 4+96+16){ touchX = 100; if(strLength < 24)addToFileName("R");} + else if(xVal >= 132 && xVal < 4+128+16){ touchX = 132; if(strLength < 24)addToFileName("T");} + else if(xVal >= 164 && xVal < 4+160+16){ touchX = 164; if(strLength < 24)addToFileName("Y");} + else if(xVal >= 196 && xVal < 4+192+16){ touchX = 196; if(strLength < 24)addToFileName("U");} + else if(xVal >= 228 && xVal < 4+224+16){ touchX = 228; if(strLength < 24)addToFileName("I");} + else if(xVal >= 260 && xVal < 4+256+16){ touchX = 260; if(strLength < 24)addToFileName("O");} + else if(xVal >= 292 && xVal < 4+288+16){ touchX = 292; if(strLength < 24)addToFileName("P");} + else return; + touchY = 76; + touchW = 22; + touchH = 22; + touchDelay = 6; + isTouching = true; + } else if(yVal >= 100 && yVal < 120){ // A to L + if(xVal >= 20 && xVal < 36){ touchX = 20; if(strLength < 24)addToFileName("A");} + else if(xVal >= 52 && xVal < 68){ touchX = 52; if(strLength < 24)addToFileName("S");} + else if(xVal >= 84 && xVal < 100){ touchX = 84; if(strLength < 24)addToFileName("D");} + else if(xVal >= 116 && xVal < 132){ touchX = 116; if(strLength < 24)addToFileName("F");} + else if(xVal >= 148 && xVal < 164){ touchX = 148; if(strLength < 24)addToFileName("G");} + else if(xVal >= 180 && xVal < 196){ touchX = 180; if(strLength < 24)addToFileName("H");} + else if(xVal >= 212 && xVal < 230){ touchX = 212; if(strLength < 24)addToFileName("J");} + else if(xVal >= 244 && xVal < 262){ touchX = 244; if(strLength < 24)addToFileName("K");} + else if(xVal >= 276 && xVal < 294){ touchX = 276; if(strLength < 24)addToFileName("L");} + else return; + touchY = 96; + touchW = 22; + touchH = 22; + touchDelay = 6; + isTouching = true; + } else if(yVal >= 120 && yVal < 140){ // Z to M + if(xVal >= 52 && xVal < 68){ touchX = 52; if(strLength < 24)addToFileName("Z");} + else if(xVal >= 84 && xVal < 100){ touchX = 84; if(strLength < 24)addToFileName("X");} + else if(xVal >= 116 && xVal < 132){ touchX = 116; if(strLength < 24)addToFileName("C");} + else if(xVal >= 148 && xVal < 164){ touchX = 148; if(strLength < 24)addToFileName("V");} + else if(xVal >= 180 && xVal < 196){ touchX = 180; if(strLength < 24)addToFileName("B");} + else if(xVal >= 212 && xVal < 230){ touchX = 212; if(strLength < 24)addToFileName("N");} + else if(xVal >= 244 && xVal < 262){ touchX = 244; if(strLength < 24)addToFileName("M");} + else return; + touchY = 116; + touchW = 22; + touchH = 22; + touchDelay = 6; + isTouching = true; + } else if(yVal >= 140 && yVal < 160){ // SPACE and BACKSPACE + if(xVal >= 32 && xVal < 112){ + touchX = 32; + touchW = 16*5+14; + if(strLength < 24)addToFileName("_"); // Underscores don't appear in the game. + } + else if(xVal >= 148 && xVal < 262){ + if(strLength <= 0) return; + touchX = 148; + touchW = 16*9+8; + fileNames[worldFileCount][strLength-1] = '\0'; + } + else return; + touchY = 136; + touchH = 22; + touchDelay = 6; + isTouching = true; + } + errorFileName = 0; +} + +void switchGameBut(bool left, int buttonID){ + int id; + for(id = 0; id < 7; ++id){ + if(keyProp[id] & buttonID){ + keyProp[id] ^= buttonID; // Toggle buttonID bit + if(left){ + int id2 = id -1; + if (id2 < 0) return; + keyProp[id2] ^= buttonID; + } else { + int id2 = id+1; + if (id2 > 6) return; + keyProp[id2] ^= buttonID; + } + return; + } + } + if(left) keyProp[6] ^= buttonID; + else keyProp[0] ^= buttonID; + +} +void switchMenuBut(bool left, int buttonID){ + int id; + for(id = 0; id < 10; ++id){ + if(id > 3 && id < 7) continue; + if(keyProp[id] & buttonID){ + keyProp[id] ^= buttonID; // Toggle buttonID bit + if(left){ + int id2 = id - 1; + if (id2 == 6) id2 = 3; + if (id2 < 0) return; + keyProp[id2] ^= buttonID; + } else { + int id2 = id+1; + if (id2 == 4) id2 = 7; + if (id2 > 9) return; + keyProp[id2] ^= buttonID; + } + return; + } + } + if(left) keyProp[9] ^= buttonID; + else keyProp[0] ^= buttonID; +} + +s8 checkPropButtons(){ + if(keyProp[0] == 0) return 0; + if(keyProp[1] == 0) return 1; + if(keyProp[2] == 0) return 2; + if(keyProp[3] == 0) return 3; + if(keyProp[4] == 0) return 4; + if(keyProp[5] == 0) return 5; + if(keyProp[6] == 0) return 6; + if(keyProp[7] == 0) return 7; + if(keyProp[8] == 0) return 8; + if(keyProp[9] == 0) return 9; + return -1; +} + +Item median; +void tickMenu(int menu){ + switch(menu){ + case MENU_SETTINGS: + if(!bindOpt){ + if(!selBut){ + if (k_up.clicked){ --currentSelection; if(currentSelection < 0)currentSelection=21;} + if (k_down.clicked){ ++currentSelection; if(currentSelection > 21)currentSelection=0;} + if (k_left.clicked){ left = true;} + if (k_right.clicked){ left = false;} + } else { + if (k_left.clicked){ + if(left)switchGameBut(true,keys[currentSelection]); + else switchMenuBut(true,keys[currentSelection]); + } else if (k_right.clicked) { + if(left)switchGameBut(false,keys[currentSelection]); + else switchMenuBut(false,keys[currentSelection]); + } + } + + if (k_accept.clicked) selBut = !selBut; + if (k_decline.clicked){ + bindOpt = true; + curSaveSel = 0; + } + } else { + if (k_up.clicked){ --curSaveSel; if(curSaveSel < 0)curSaveSel=2;} + if (k_down.clicked){ ++curSaveSel; if(curSaveSel > 2)curSaveSel=0;} + if (k_decline.clicked){ + bindOpt = false; + errorBut = -1; + } + if (k_accept.clicked){ + switch(curSaveSel){ + case 0: // Exit and save + if(checkPropButtons() == -1){ + k_up.input = keyProp[0]; + k_down.input = keyProp[1]; + k_left.input = keyProp[2]; + k_right.input = keyProp[3]; + k_attack.input = keyProp[4]; + k_menu.input = keyProp[5]; + k_pause.input = keyProp[6]; + k_accept.input = keyProp[7]; + k_decline.input = keyProp[8]; + k_delete.input = keyProp[9]; + + FILE *fs=fopen("btnSave.bin","wb"); + fwrite(keyProp,sizeof(int),9,fs); + fclose(fs); + + currentSelection = 2; + currentMenu = MENU_TITLE; + errorBut = -1; + } else errorBut = checkPropButtons(); + break; + case 1: // Exit and DON'T save + currentSelection = 2; + currentMenu = MENU_TITLE; + errorBut = -1; + break; + case 2: // reset defaults + keyProp[0] = KEY_DUP | KEY_CPAD_UP | KEY_CSTICK_UP; + keyProp[1] = KEY_DDOWN | KEY_CPAD_DOWN | KEY_CSTICK_DOWN; + keyProp[2] = KEY_DLEFT | KEY_CPAD_LEFT | KEY_CSTICK_LEFT; + keyProp[3] = KEY_DRIGHT | KEY_CPAD_RIGHT | KEY_CSTICK_RIGHT; + keyProp[4] = KEY_A | KEY_B | KEY_L | KEY_ZR; + keyProp[5] = KEY_X | KEY_Y | KEY_R | KEY_ZL; + keyProp[6] = KEY_START; + keyProp[7] = KEY_A; + keyProp[8] = KEY_B; + keyProp[9] = KEY_X; + bindOpt = false; + errorBut = -1; + break; + } + } + } + break; + case MENU_PAUSED: + if(!areYouSure && !areYouSureSave){ + if(pauseSaveDisplayTimer > 0) --pauseSaveDisplayTimer; + if (k_pause.clicked) currentMenu = MENU_NONE; + if (k_up.clicked){ --currentSelection; if(currentSelection < 0)currentSelection=2;} + if (k_down.clicked){ ++currentSelection; if(currentSelection > 2)currentSelection=0;} + if (k_accept.clicked){ + switch(currentSelection){ + case 0: + currentMenu = MENU_NONE; + break; + case 1: + areYouSureSave = true; + break; + case 2: + areYouSure = true; + break; + } + } + } else if(areYouSureSave) { + if (k_accept.clicked){ + pauseSaveDisplayTimer = 60; + saveCurrentWorld(currentFileName, &eManager, &player, (u8*)map, (u8*)data); + areYouSureSave = false; + areYouSure = false; + } else if (k_decline.clicked){ + areYouSureSave = false; + areYouSure = false; + } + } else { + if (k_accept.clicked){ + areYouSure = false; + areYouSureSave = false; + sf2d_set_clear_color(0xFF); + currentSelection = 0; + currentMenu = MENU_TITLE; + } else if (k_decline.clicked){ + areYouSure = false; + areYouSureSave = false; + } + } + break; + case MENU_INVENTORY: + if (k_menu.clicked || k_decline.clicked){ + currentMenu = MENU_NONE; + player.p.activeItem = &noItem; + player.p.isCarrying = false; + } + if (k_accept.clicked){ // Select item from inventory + if(player.p.inv->lastSlot!=0){ + median = player.p.inv->items[curInvSel]; // create copy of item. + removeItemFromInventory(curInvSel, player.p.inv); // remove original + pushItemToInventoryFront(median, player.p.inv); // add copy to front + player.p.activeItem = &player.p.inv->items[0]; // active item = copy. + if(player.p.activeItem->id > 27) player.p.isCarrying = true; + else player.p.isCarrying = false; + } + currentMenu = MENU_NONE; + } + if (k_up.clicked){ --curInvSel; if(curInvSel < 0)curInvSel=player.p.inv->lastSlot-1;} + if (k_down.clicked){ ++curInvSel; if(curInvSel > player.p.inv->lastSlot-1)curInvSel=0;} + break; + + case MENU_CRAFTING: + if (k_menu.clicked || k_decline.clicked) currentMenu = MENU_NONE; + if (k_accept.clicked){ + int newslot = player.p.activeItem->slotNum + 1; + if(craftItem(currentRecipes, ¤tRecipes->recipes[curInvSel], player.p.inv)){ + playSound(snd_craft); + if(player.p.activeItem != &noItem)player.p.activeItem = &player.p.inv->items[newslot]; + } + } + if (k_up.clicked){ --curInvSel; if(curInvSel < 0)curInvSel=currentRecipes->size-1;} + if (k_down.clicked){ ++curInvSel; if(curInvSel > currentRecipes->size-1)curInvSel=0;} + break; + + case MENU_WIN: + if (k_accept.clicked){ + sf2d_set_clear_color(0xFF); + currentMenu = MENU_TITLE; + saveCurrentWorld(currentFileName, &eManager, &player, (u8*)map, (u8*)data); + } + break; + case MENU_LOSE: + if (k_accept.clicked){ + sf2d_set_clear_color(0xFF); + currentMenu = MENU_TITLE; + } + break; + case MENU_ABOUT: + if (k_decline.clicked) currentMenu = MENU_TITLE; + break; + + case MENU_CONTAINER: + if (k_menu.clicked || k_decline.clicked)currentMenu = MENU_NONE; + + if (k_left.clicked) { + curChestEntity->entityFurniture.r = 0; + int tmp = curInvSel; + curInvSel = curChestEntity->entityFurniture.oSel; + curChestEntity->entityFurniture.oSel = tmp; + } + if (k_right.clicked) { + curChestEntity->entityFurniture.r = 1; + int tmp = curInvSel; + curInvSel = curChestEntity->entityFurniture.oSel; + curChestEntity->entityFurniture.oSel = tmp; + } + + Inventory* i1 = curChestEntity->entityFurniture.r == 1 ? player.p.inv : curChestEntity->entityFurniture.inv; + Inventory* i2 = curChestEntity->entityFurniture.r == 0 ? player.p.inv : curChestEntity->entityFurniture.inv; + int len = i1->lastSlot; + if (curInvSel < 0) curInvSel = 0; + if (curInvSel >= len) curInvSel = len - 1; + if (k_up.clicked) --curInvSel; + if (k_down.clicked) ++curInvSel; + if (len == 0) curInvSel = 0; + if (curInvSel < 0) curInvSel += len; + if (curInvSel >= len) curInvSel -= len; + + if(k_accept.clicked && len > 0){ + Item* pullItem = &i1->items[curInvSel]; + Item pushItem = newItem(pullItem->id,pullItem->countLevel); + pushItem.chestPtr = pullItem->chestPtr; + pushItemToInventoryFront(pushItem, i2); + if(i2 == player.p.inv){ + int newslot = player.p.activeItem->slotNum + 1; + player.p.activeItem = &player.p.inv->items[newslot]; + } else if(pullItem == player.p.activeItem){ + player.p.activeItem = &noItem; + } + removeItemFromCurrentInv(pullItem); + if (curInvSel >= i1->lastSlot) curInvSel = i1->lastSlot - 1; + } + + break; + + case MENU_LOADGAME: + if(!enteringName && !areYouSure){ // World select + if (k_decline.clicked){ + currentMenu = MENU_TITLE; + currentSelection = 0; + } + if (k_up.clicked){ --currentSelection; if(currentSelection < 0)currentSelection = worldFileCount;} + if (k_down.clicked){ ++currentSelection; if(currentSelection > worldFileCount)currentSelection=0;} + + if(k_delete.clicked){ + if(currentSelection < worldFileCount) areYouSure = true; + } + + if(k_accept.clicked){ + if(currentSelection == worldFileCount){ + + enteringName = true; + } else { + memset(¤tFileName, 0, 255); // reset currentFileName + sprintf(currentFileName,"%s.wld",fileNames[currentSelection]); + playSound(snd_test); + initGame = 1; + currentMenu = MENU_NONE; + } + } + } else if (areYouSure){ + if (k_decline.clicked || k_delete.clicked) areYouSure = false; + if (k_accept.clicked){ + sprintf(currentFileName,"%s.wld",fileNames[currentSelection]); + remove(currentFileName); + readFiles(); + enteringName = false; + areYouSure = false; + memset(¤tFileName, 0, 255); // reset currentFileName + } + }else { // Enter new world name. + if(k_decline.clicked) enteringName = false; + if(k_accept.clicked && errorFileName == 0){ + errorFileName = checkFileNameForErrors(); + if(errorFileName == 0){ // If no errors are found with the filename, then start a new game! + memset(¤tFileName, 0, 255); // reset currentFileName + sprintf(currentFileName,"%s.wld",fileNames[worldFileCount]); + currentMenu = MENU_NONE; + playSound(snd_test); + initGame = 2; + ++worldFileCount; + } + } + touchPosition touch; + hidTouchRead(&touch); + if((touch.px != 0 || touch.py != 0) && touchDelay == 0){ + if(!isTouching)doTouchButton(touch); + } + else if(touch.px == 0 || touch.py == 0) isTouching = false; + if(touchDelay > 0) --touchDelay; + } + break; + + case MENU_TITLE: + if (k_up.clicked){ --currentSelection; if(currentSelection < 0)currentSelection=4;} + if (k_down.clicked){ ++currentSelection; if(currentSelection > 4)currentSelection=0;} + + if(k_accept.clicked){ + switch(currentSelection){ + case 0: + currentMenu = MENU_LOADGAME; + readFiles(); + currentSelection = 0; + enteringName = false; + areYouSure = false; + break; + case 2: + keyProp[0] = k_up.input; + keyProp[1] = k_down.input; + keyProp[2] = k_left.input; + keyProp[3] = k_right.input; + keyProp[4] = k_attack.input; + keyProp[5] = k_menu.input; + keyProp[6] = k_pause.input; + keyProp[7] = k_accept.input; + keyProp[8] = k_decline.input; + keyProp[9] = k_delete.input; + left = true; + selBut = false; + bindOpt = false; + currentSelection = 0; + currentMenu = MENU_SETTINGS; + break; + case 3: + currentMenu = MENU_ABOUT; + break; + case 4: + quitGame = true; + break; + } + + } + break; + } + +} + +u8 opacity = 255; +bool rev = true; +char scoreText[15]; + +char * getButtonFunctionGame(int key){ + if(keyProp[0] & key) return "Move up"; + if(keyProp[1] & key) return "Move down"; + if(keyProp[2] & key) return "Move left"; + if(keyProp[3] & key) return "Move right"; + if(keyProp[4] & key) return "Attack"; + if(keyProp[5] & key) return "Toggle Menu"; + if(keyProp[6] & key) return "Pause"; + return "Nothing"; +} +char * getButtonFunctionMenu(int key){ + if(keyProp[0] & key) return "Up"; + if(keyProp[1] & key) return "Down"; + if(keyProp[2] & key) return "Left"; + if(keyProp[3] & key) return "Right"; + if(keyProp[7] & key) return "Accept"; + if(keyProp[8] & key) return "Decline"; + if(keyProp[9] & key) return "Delete"; + return "Nothing"; +} + + +char guiText0[] = "1 2 3 4 5 6 7 8 9 0"; +char guiText1[] = "Q W E R T Y U I O P"; +char guiText2[] = "A S D F G H J K L"; +char guiText3[] = "Z X C V B N M"; +char guiText4[] = " SPACE BACKSPACE"; + +void renderMenu(int menu,int xscr,int yscr){ + int i = 0; + switch(menu){ + case MENU_LOADGAME: + sf2d_start_frame(GFX_TOP, GFX_LEFT); + if(!enteringName){ // World select + offsetX = 0;offsetY = (currentSelection * 32) - 48; + drawText("Select a file",122,-16); + for(i = 0; i < worldFileCount + 1; ++i){ + int color = 0x201092FF; + char * text = fileNames[i]; + if(i == worldFileCount){ + text = "Generate New World"; + color = 0x109220FF; + } + if(i != currentSelection) color &= 0x7F7F7FFF; // Darken color. + else { + if(areYouSure)color = 0xDF1010FF; + } + + char scoreText[24]; + sprintf(scoreText,"Score: %d",fileScore[i]); + + renderFrame(1,i*4,24,(i*4)+4,color); + if(i != worldFileCount){ + drawText(text,(400-(strlen(text)*12))/2,i*64+12); + drawText(scoreText,(400-(strlen(scoreText)*12))/2,i*64+32); + } else { + drawText(text,(400-(strlen(text)*12))/2,i*64+24); + } + if(fileWin[i] && i != worldFileCount) render16(18,i*32+8,24,208,0); // Render crown + } + offsetX = 0;offsetY = 0; + } else { // Enter new world name. + drawText("Enter a name",128,16); + drawText(fileNames[worldFileCount],(400-(strlen(fileNames[worldFileCount])*12))/2, 48); + + if(errorFileName > 0){ + switch(errorFileName){// Error: Filename cannot already exist. + case 1: drawTextColor("ERROR: Length cannot be 0!",(400-26*12)/2,200,0xAF1010FF); break; + case 2: drawTextColor("ERROR: You need Letters/Numbers!",(400-32*12)/2,200,0xAF1010FF); break; + case 3: drawTextColor("ERROR: Filename already exists!",(400-31*12)/2,200,0xAF1010FF); break; + } + } + } + sf2d_end_frame(); + sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); + if(!enteringName){ // World select + if(!areYouSure){ + drawTextColor("Load World",100,12,0xFFFF3FFF); + drawText("Press or to scroll", 28, 50); + renderButtonIcon(k_up.input & -k_up.input, 98, 48, 1); + renderButtonIcon(k_down.input & -k_down.input, 160, 48, 1); + drawText("Press to load world", (320-21*12)/2, 100); + renderButtonIcon(k_accept.input & -k_accept.input, 104, 98, 1); + drawText("Press to return", 58, 150); + renderButtonIcon(k_decline.input & -k_decline.input, 128, 148, 1); + if(currentSelection != worldFileCount){ + drawText("Press to delete",(320-17*12)/2, 200); + renderButtonIcon(k_delete.input & -k_delete.input, 128, 198, 1); + } + } else { + drawTextColor("Delete File?",88,12,0xFF3F3FFF); + drawText("Press to confirm", (320-18*12)/2, 100); + renderButtonIcon(k_accept.input & -k_accept.input, 122, 98, 1); + drawText("Press to return", 58, 150); + renderButtonIcon(k_decline.input & -k_decline.input, 128, 148, 1); + } + + } else { // Draw the "keyboard" + drawTextColor("Touch the keypad below",(320-22*12)/2,12,0xFFFF33FF); + + sf2d_draw_rectangle(0, 50, 320, 110, 0xBF7F7FFF); + drawSizedText(guiText0,4, 60, 2); + drawSizedText(guiText1,4, 80, 2); + drawSizedText(guiText2,12, 100, 2); + drawSizedText(guiText3,28, 120, 2); + drawSizedText(guiText4,12, 140, 2); + + if(touchDelay > 0){ + sf2d_draw_rectangle(touchX, touchY, touchW, touchH, 0xAF); + } + + drawText("Press to confirm", (320-18*12)/2, 180); + renderButtonIcon(k_accept.input & -k_accept.input, 122, 178, 1); + drawText("Press to return", 58, 210); + renderButtonIcon(k_decline.input & -k_decline.input, 128, 208, 1); + } + + sf2d_end_frame(); + break; + case MENU_SETTINGS: + sf2d_start_frame(GFX_TOP, GFX_LEFT); + drawTextColor("Rebind Buttons",116,12,0xAFAF00FF); + drawText("Button",16,32); + drawText("Game",140,32); + drawText("Menus",280,32); + + char gameButText[34]; + char menuButText[34]; + + for(i = 0; i < 5; ++i){ + if((currentSelection-2) + i > 21 || (currentSelection-2) + i < 0) continue; + renderButtonIcon(keys[(currentSelection-2) + i], 16, (i * 18) + 30, 2); + int ccol = 0x7F7F7FFF; + + sprintf(gameButText,"%s",getButtonFunctionGame(keys[(currentSelection-2) + i])); + sprintf(menuButText,"%s",getButtonFunctionMenu(keys[(currentSelection-2) + i])); + + if(i == 2){ + if(!selBut)ccol = 0xFFFFFFFF; + else{ + ccol = 0x00FF00FF; + if(left)sprintf(gameButText,"<%s>",getButtonFunctionGame(keys[(currentSelection-2) + i])); + else sprintf(menuButText,"<%s>",getButtonFunctionMenu(keys[(currentSelection-2) + i])); + } + } + if(left){ + drawTextColor(gameButText, 112, (i * 33) + 80, ccol); + drawTextColor(menuButText, 280, (i * 33) + 80, 0x7F7F7FFF); + } else { + drawTextColor(gameButText, 112, (i * 33) + 80, 0x7F7F7FFF); + drawTextColor(menuButText, 280, (i * 33) + 80, ccol); + } + } + if(bindOpt){ + renderFrame(1,1,24,14,0x1010BFFF); + drawTextColor("Save changes?",122,32,0xAFAF00FF); + for(i = 2; i >= 0; --i){ + char* msg = keybOptions[i]; + u32 color = 0x4F4F4FFF; + if(i == curSaveSel) color = 0xFFFFFFFF; + drawTextColor(msg,(400 - (strlen(msg) * 12))/2, (i * 24) + 92, color); + } + drawText("Press to return", 98, 190); + renderButtonIcon(k_decline.input & -k_decline.input, 168, 188, 1); + + if(errorBut >= 0 && errorBut < 9){ + char errorText[30]; + switch(errorBut){ + case 0: sprintf(errorText, "Error: Missing 'Move up'"); break; + case 1: sprintf(errorText, "Error: Missing 'Move down'"); break; + case 2: sprintf(errorText, "Error: Missing 'Move right'"); break; + case 3: sprintf(errorText, "Error: Missing 'Move left'"); break; + case 4: sprintf(errorText, "Error: Missing 'Attack'"); break; + case 5: sprintf(errorText, "Error: Missing 'Toggle Menu'"); break; + case 6: sprintf(errorText, "Error: Missing 'Pause'"); break; + case 7: sprintf(errorText, "Error: Missing 'Accept'"); break; + case 8: sprintf(errorText, "Error: Missing 'Decline'"); break; + case 9: sprintf(errorText, "Error: Missing 'Delete'"); break; + } + drawTextColor(errorText,(400 - (strlen(errorText) * 12))/2,50,0xFF0000FF); + } + + } + sf2d_end_frame(); + sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); + if(!selBut){ + drawText("Press to select", 58, 80); + renderButtonIcon(k_accept.input & -k_accept.input, 128, 78, 1); + drawText("Press to return", 58, 130); + renderButtonIcon(k_decline.input & -k_decline.input, 128, 128, 1); + } else { + drawText("Press or to scroll", 28, 50); + renderButtonIcon(k_left.input & -k_left.input, 98, 48, 1); + renderButtonIcon(k_right.input & -k_right.input, 160, 48, 1); + drawText("Press to unselect", 46, 100); + renderButtonIcon(k_accept.input & -k_accept.input, 118, 98, 1); + drawText("Press to return", 58, 150); + renderButtonIcon(k_decline.input & -k_decline.input, 128, 148, 1); + } + sf2d_end_frame(); + break; + + case MENU_PAUSED: + 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); + offsetX = 0;offsetY = 0; + renderFrame(1,1,24,14,0xAF1010FF); + drawText("Paused",164,32); + for(i = 2; i >= 0; --i){ + char* msg = pOptions[i]; + u32 color = 0x7F7F7FFF; + if(i == currentSelection) color = 0xFFFFFFFF; + drawTextColor(msg,(400 - (strlen(msg) * 12))/2, (i * 24) + 100, color); + } + + if(pauseSaveDisplayTimer > 0) drawTextColor("Game Saved!", (400-(11*12))/2, 64,0x20FF20FF); + + if(areYouSure || areYouSureSave){ + if(areYouSure)renderFrame(6,5,19,10,0x8F1010FF); + else renderFrame(6,5,19,10,0x108F10FF); + + drawText("Are you sure?",122,96); + drawText(" Yes", 164, 117); + renderButtonIcon(k_accept.input & -k_accept.input, 166, 114, 1); + drawText(" No", 170, 133); + renderButtonIcon(k_decline.input & -k_decline.input, 166, 130, 1); + } + + sf2d_end_frame(); + break; + case MENU_WIN: + 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); + offsetX = 0;offsetY = 0; + renderFrame(5,3,21,12,0x1010FFFF); + if(!rev){ opacity+=5; if(opacity == 255) rev = true; } + else { opacity-=5; if(opacity == 100) rev = false; } + sprintf(scoreText,"Score: %d", player.p.score); + drawTextColor("You Win!",158,76,0xAFAF0000 + opacity); + drawText(scoreText, 200-((strlen(scoreText)-1)*6), 100); + drawText("Press to continue", 96, 150); + renderButtonIcon(k_attack.input & -k_attack.input, 166, 148, 1); + + //printf("0x%08X",k_attack.input & -k_attack.input); + sf2d_end_frame(); + break; + case MENU_LOSE: + 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); + offsetX = 0;offsetY = 0; + renderFrame(5,3,21,12,0x1010FFFF); + if(!rev){ opacity+=5; if(opacity == 255) rev = true; } + else { opacity-=5; if(opacity == 100) rev = false; } + sprintf(scoreText,"Score: %d", player.p.score); + drawTextColor("You DIED!",158,76,0xAF000000 + opacity); + drawText(scoreText, 200-((strlen(scoreText)-1)*6), 100); + drawText("Press to continue", 96, 150); + renderButtonIcon(k_attack.input & -k_attack.input, 166, 148, 1); + //printf("0x%08X",k_attack.input & -k_attack.input); + sf2d_end_frame(); + break; + case MENU_INVENTORY: + 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); + offsetX = 0;offsetY = 0; + renderFrame(1,1,24,14,0x1010FFFF); + renderItemList(player.p.inv, 1,1,24,14, curInvSel); + sf2d_end_frame(); + break; + case MENU_CRAFTING: + 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); + offsetX = 0;offsetY = 0; + + renderFrame(15,1,24,4,0x1010FFFF); + renderFrame(15,5,24,14,0x1010FFFF); + renderFrame(1,1,14,14,0x1010FFFF); + renderRecipes(currentRecipes, 1, 1, 14, 14, curInvSel); + + Recipe* rec = ¤tRecipes->recipes[curInvSel]; + renderItemIcon(rec->itemResult,rec->itemAmountLevel,128,16); + char craftText[12]; + sprintf(craftText,"%d",countItemInv(rec->itemResult,rec->itemAmountLevel, player.p.inv)); + drawText(craftText,274,34); + + if(rec->numOfCosts > 0){ + int i; + for(i = 0; i < rec->numOfCosts; i++){ + int amnt = countItemInv(rec->costs[i].costItem,0, player.p.inv); + int ttlCst = rec->costs[i].costAmount; + int col = 0xFFFFFFFF; if(amntcosts[i].costItem,1,128,48+(i*8)); + sprintf(craftText,"%d/%d",amnt,ttlCst); + drawTextColor(craftText,274,96+(i*18),col); + } + } + + sf2d_end_frame(); + break; + + case MENU_CONTAINER: + 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); + if (curChestEntity->entityFurniture.r == 1){ offsetX = 48;offsetY = 0;} + else {offsetX = 0;offsetY = 0;} + + renderFrame(1,1,14,14,0x1010FFFF); + renderItemList(curChestEntity->entityFurniture.inv,1,1,14,14, + curChestEntity->entityFurniture.r == 0 ? curInvSel : -curChestEntity->entityFurniture.oSel - 1); + renderFrame(15,1,28,14,0x1010FFFF); + renderItemList(player.p.inv,15,1,28,14, + curChestEntity->entityFurniture.r == 1 ? curInvSel : -curChestEntity->entityFurniture.oSel - 1); + offsetX = 0;offsetY = 0; + sf2d_end_frame(); + break; + case MENU_ABOUT: + sf2d_start_frame(GFX_TOP, GFX_LEFT); + drawText("About Minicraft",110,12); + drawSizedText("Minicraft was made by Markus Persson for the",24,36,1.0); + drawSizedText("22'nd ludum dare competition in december 2011.",16,48,1.0); + drawSizedText("it is dedicated to my father. <3",72,60,1.0); + drawSizedText("- Markus \"Notch\" Persson",104,76,1.0); + + drawTextColor("3DS Homebrew Edition",74,120,0x00FF00FF); + drawSizedTextColor("This port was made by David Benepe (Davideesk)",16,144,1.0,0x00FF00FF); + drawSizedTextColor("just for fun in September/October 2015.",44,156,1.0,0x00FF00FF); + drawSizedTextColor("TY Notch for creating a fun game to remake!",28,180,1.0,0x00FF00FF); + sf2d_end_frame(); + sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); + drawTextColor("Special Thanks to:",52,12,0xFF7F7FFF); + drawTextColor("Smea",136,60,0xFF2020FF); + drawSizedTextColor("for ctrulib",116,80,1.0,0xFF2020FF); + drawTextColor("Xerpi",130,120,0x2020FFFF); + drawSizedTextColor("for sf2dlib",116,140,1.0,0x2020FFFF); + drawText("Press to return", 58, 220); + renderButtonIcon(k_decline.input & -k_decline.input, 128, 218, 1); + sf2d_end_frame(); + break; + case MENU_TITLE: + /* Top Screen */ + sf2d_start_frame(GFX_TOP, GFX_LEFT); + renderTitle(76,16); + + for(i = 4; i >= 0; --i){ + char* msg = options[i]; + u32 color = 0x7F7F7FFF; + if(i == currentSelection) color = 0xFFFFFFFF; + drawSizedTextColor(msg,(200 - (strlen(msg) * 8))/2, ((8 + i) * 20 - 50) >> 1,2.0, color); + } + + drawText(versionText,2,225); + sf2d_end_frame(); + + /* Bottom Screen */ + sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); + int startX = 0, startY = 0;// relative coordinates ftw + switch(currentSelection){ + case 0: // "Start Game" + startX = 20;startY = 50; + render16(startX,startY+12,0,128,0);//Player(Carrying) + render16(startX,startY,128,128,0);//Workbench + startX = 120;startY = 20; + render16b(startX,startY,16,96,0,0x001DC1FF);// water pit + render16b(startX+16,startY,32,96,0,0x001DC1FF); + render16b(startX,startY+16,48,96,0,0x001DC1FF); + render16b(startX+16,startY+16,64,96,0,0x001DC1FF); + renderc (startX+8,startY+12,48,160,16,8,0);//Waves + renderc (startX+8,startY+8,0,112,16,8,0);//Player (Top-Half) + startX = 110;startY = 76; + render16 (startX,startY,48,112,0);//Player + renderc (startX+12,startY,40,160,8,16,0);//Slash + render (startX+14,startY+4,152,144,0);//Pickaxe + render16b(startX+18,startY,80,0,0,0xDCC6AEFF);//Iron ore + startX = 40;startY = 90; + render16b (startX,startY,128,112,0,0xADFFADFF);//Slime + render16 (startX+18,startY,48,112,1);//Player (Mirrored) + renderc (startX+14,startY,32,160,8,16,0);//Slash + render (startX+12,startY+4,104,144,1);//Sword + startX = 64;startY = 40; + render16b(startX,startY,16,80,0,0x69B569FF);// grass pit + render16b(startX+16,startY,32,80,0,0x69B569FF); + render16b(startX,startY+16,48,80,0,0x69B569FF); + render16b(startX+16,startY+16,64,80,0,0x69B569FF); + render16 (startX+8,startY+4,0,16,0);//Tree + render (startX+1,startY+14,80,152,0);// Apple + render16 (startX+9,startY+18,16,112,0);//Player + renderc (startX+9,startY+14,16,160,16,8,0);//Slash + drawTextColor("Play minicraft",24,24,0xFFFF7FFF); + break; + case 1: // "How To Play" + startX = 72;startY = 54; + render16(startX,startY,96,208,0);//C-PAD + startX = 72;startY = 37; + render16(startX,startY-16,16,112,0);//Player + render16(startX,startY,112,208,0);//C-PAD up + startX = 72;startY = 71; + render16(startX,startY+16,0,112,0);//Player + render16(startX,startY,144,208,0);//C-PAD down + startX = 39;startY = 54; + render16(startX,startY,48,112,1);//Player + render16(startX+16,startY,128,208,0);//C-PAD left + startX = 89;startY = 54; + render16(startX+16,startY,48,112,0);//Player + render16(startX,startY,160,208,0);//C-PAD right + + drawTextColor("Learn the basics",64,24,0xFFFF7FFF); + break; + case 2: // "Settings" + break; + case 3: // "About" + break; + } + sf2d_end_frame(); + break; + + + } + +} 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..21bb7ce 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 + && e.entityFurniture.itemID == ITEM_LANTERN) + continue; + if (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; }