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 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; renderMenuBackground(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; renderMenuBackground(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; renderMenuBackground(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; renderMenuBackground(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; renderMenuBackground(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(amnt<ttlCst) col = 0x7F7F7FFF; renderItemIcon(rec->costs[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; renderMenuBackground(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; } }
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; } }