From 93674e3fa27089f71a7f3db6a66315eb23caadff Mon Sep 17 00:00:00 2001 From: DavidSM64 Date: Sun, 15 Nov 2015 20:15:08 -0600 Subject: [PATCH] Beta Build 5! --- data/icons2.png | Bin 16552 -> 16853 bytes source/Globals.c | 90 ++++++++++++++- source/Globals.h | 10 ++ source/Input.c | 3 + source/Input.h | 5 +- source/Menu.c | 148 +++++++++++++++++++----- source/Menu.h | 8 +- source/MenuTutorial.c | 256 ++++++++++++++++++++++++++++++++++++++++++ source/MenuTutorial.h | 16 +++ source/Render.c | 63 +++++++++-- source/Render.h | 2 + source/main.c | 50 ++++++--- 12 files changed, 583 insertions(+), 68 deletions(-) create mode 100644 source/MenuTutorial.c create mode 100644 source/MenuTutorial.h diff --git a/data/icons2.png b/data/icons2.png index e6d42ae34025f805a16f8cb7f6df59182e5c787f..1fdf1334b0c09faa8a5ca2733595963f76c85de9 100644 GIT binary patch literal 16853 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 literal 16552 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 0 || k_touch.py > 0){ + // Plus/Minus zoom button + if(k_touch.py > 204 && k_touch.py < 232){ + if(k_touch.px > 284 && k_touch.px < 312){ + if(zoomLevel > 4) return; + if(!isChangingSize && !isDraggingMap){ + zoomLevel += 2; + mScrollX -= (50 * (zoomLevel/2)); + mScrollY -= (40 * (zoomLevel/2)); + isChangingSize = true; + sprintf(mapText,"x%d",zoomLevel); + } + if(mScrollX < 320-(128*zoomLevel)) mScrollX = 320-(128*zoomLevel); + else if(mScrollX > 0) mScrollX = 0; + if(mScrollY < 240-(128*zoomLevel)) mScrollY = 240-(128*zoomLevel); + else if(mScrollY > 0) mScrollY = 0; + return; + } else if(k_touch.px > 256 && k_touch.px < 284){ + if(zoomLevel < 4) return; + if(!isChangingSize && !isDraggingMap){ + mScrollX += (50 * (zoomLevel/2)); + mScrollY += (40 * (zoomLevel/2)); + zoomLevel -= 2; + isChangingSize = true; + sprintf(mapText,"x%d",zoomLevel); + } + if(mScrollX < 320-(128*zoomLevel)) mScrollX = 320-(128*zoomLevel); + else if(mScrollX > 0) mScrollX = 0; + if(mScrollY < 240-(128*zoomLevel)) mScrollY = 240-(128*zoomLevel); + else if(mScrollY > 0) mScrollY = 0; + return; + } + } else if(k_touch.py > 8 && k_touch.py < 40 && k_touch.px > 284 && k_touch.px < 312){ + // Exit Button + if(!isChangingSize && !isDraggingMap){ + shouldRenderMap = false; + return; + } + } + + if(!isDraggingMap){ + lastTouchX = k_touch.px; + lastTouchY = k_touch.py; + } + if(zoomLevel > 2){ + int dx = lastTouchX - k_touch.px; + if(dx > 1 || dx < -1){ + mScrollX -= dx; + if(mScrollX < 320-(128*zoomLevel)) mScrollX = 320-(128*zoomLevel); + else if(mScrollX > 0) mScrollX = 0; + } + lastTouchX = k_touch.px; + } + + int dy = lastTouchY - k_touch.py; + if(dy > 1 || dy < -1){ + mScrollY -= dy; + if(mScrollY < 240-(128*zoomLevel)) mScrollY = 240-(128*zoomLevel); + else if(mScrollY > 0) mScrollY = 0; + } + lastTouchY = k_touch.py; + isDraggingMap = true; + } else { + isDraggingMap = false; + isChangingSize = false; + } + } else { + // touch minimap to bring up zoomed map. + if(k_touch.py > 100 && k_touch.py < 228 && k_touch.px > 96 && k_touch.px < 228){ + shouldRenderMap = true; + } + } +} + void hurtEntity(Entity* e, int damage, int dir, u32 hurtColor){ if (e->hurtTime > 0) return; int xd = player.x - e->x; @@ -761,7 +841,11 @@ void tickEntity(Entity* e){ e->wizard.ya = ((rand()%3) - 1) * (rand()%2); } - if(e->wizard.xa != 0 || e->wizard.ya != 0) e->wizard.walkDist++; + if(e->wizard.xa != 0 || e->wizard.ya != 0){ + e->wizard.walkDist++; + awX = e->x; + awY = e->y; + } if(e->wizard.xa < 0) e->wizard.dir = 2; else if(e->wizard.xa > 0) e->wizard.dir = 3; @@ -1104,7 +1188,7 @@ void switchLevel(s8 change){ if(currentLevel > 4) currentLevel = 0; else if(currentLevel < 0) currentLevel = 4; if(currentLevel == 1) sf2d_set_clear_color(RGBA8(0x82, 0x6D, 0x6C, 0xFF)); else if(currentLevel > 1) sf2d_set_clear_color(RGBA8(0x66, 0x66, 0x66, 0xFF)); - else sf2d_set_clear_color(RGBA8(0x00, 0x1D, 0xC1, 0xFF)); + else sf2d_set_clear_color(RGBA8(0x00, 0x7F, 0x00, 0xFF)); } bool playerIntersectsEntity(Entity* e){ diff --git a/source/Globals.h b/source/Globals.h index a29a050..e2d83ab 100644 --- a/source/Globals.h +++ b/source/Globals.h @@ -54,11 +54,18 @@ bool screenShot; int loadedtp; +u8 MODEL_3DS; + extern char versionText[34]; Entity player; bool shouldRenderDebug; +bool shouldSpeedup; +bool shouldRenderMap; +u8 zoomLevel; +char mapText[32]; +s16 mScrollX, mScrollY; sf2d_texture *icons; sf2d_texture *font; @@ -76,6 +83,7 @@ extern char fpsstr[]; u8 initGame; Item noItem; int airWizardHealthDisplay; +s16 awX, awY; u32 tickCount; RecipeManager* currentRecipes; Entity* curChestEntity; @@ -90,6 +98,8 @@ s8 itemTileInteract(int tile, Item* item, int x, int y, int px, int py, int dir) void tickEntity(Entity* e); +void tickTouchMap(); + void trySpawn(int count, int level); int getTile(int x, int y); diff --git a/source/Input.c b/source/Input.c index 0b4387f..662cb69 100644 --- a/source/Input.c +++ b/source/Input.c @@ -6,6 +6,7 @@ void toggleKey(Key* key, bool held, bool down){ } void tickKeys(u32 held, u32 down){ + hidTouchRead(&k_touch); // Update touch position toggleKey(&k_up, held & k_up.input, down & k_up.input); toggleKey(&k_down, held & k_down.input, down & k_down.input); toggleKey(&k_left, held & k_left.input, down & k_left.input); @@ -16,5 +17,7 @@ void tickKeys(u32 held, u32 down){ toggleKey(&k_accept, held & k_accept.input, down & k_accept.input); toggleKey(&k_decline, held & k_decline.input, down & k_decline.input); toggleKey(&k_delete, held & k_delete.input, down & k_delete.input); + toggleKey(&k_menuNext, held & k_menuNext.input, down & k_menuNext.input); + toggleKey(&k_menuPrev, held & k_menuPrev.input, down & k_menuPrev.input); } diff --git a/source/Input.h b/source/Input.h index 3bd6270..761a315 100644 --- a/source/Input.h +++ b/source/Input.h @@ -16,6 +16,9 @@ Key k_pause; Key k_accept; Key k_decline; Key k_delete; +Key k_menuNext; +Key k_menuPrev; +touchPosition k_touch; -void tickKeys(u32 held,u32 down); +void tickKeys(u32 held, u32 down); bool clicked(Key key); diff --git a/source/Menu.c b/source/Menu.c index 9d9a313..38d1296 100644 --- a/source/Menu.c +++ b/source/Menu.c @@ -3,7 +3,7 @@ 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"}; -char setOptions[][24] = {"Rebind Buttons", "Texture packs", "Debug Text: ", "Return to title"}; +char setOptions[][24] = {"Rebind Buttons", "Texture packs", "Debug Text: ", "N3DS Speedup: ", "Return to title"}; // Rebind buttons menu (Settings) int keys[] = { @@ -14,7 +14,7 @@ int keys[] = { KEY_L,KEY_R,KEY_ZL,KEY_ZR, KEY_START,KEY_SELECT }; -int keyProp[10] = {[0 ... 9] = 0}; +int keyProp[12] = {[0 ... 11] = 0}; bool areYouSure = false; bool areYouSureSave = false; bool bindOpt = false; @@ -122,8 +122,8 @@ void addToFileName(char * c){ } /* Keypad */ -void doTouchButton(touchPosition touch){ - int xVal = touch.px, yVal = touch.py; +void doTouchButton(){ + int xVal = k_touch.px, yVal = k_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");} @@ -233,7 +233,7 @@ void switchGameBut(bool left, int buttonID){ } void switchMenuBut(bool left, int buttonID){ int id; - for(id = 0; id < 10; ++id){ + for(id = 0; id < 12; ++id){ if(id > 3 && id < 7) continue; if(keyProp[id] & buttonID){ keyProp[id] ^= buttonID; // Toggle buttonID bit @@ -245,13 +245,13 @@ void switchMenuBut(bool left, int buttonID){ } else { int id2 = id+1; if (id2 == 4) id2 = 7; - if (id2 > 9) return; + if (id2 > 11) return; keyProp[id2] ^= buttonID; } return; } } - if(left) keyProp[9] ^= buttonID; + if(left) keyProp[11] ^= buttonID; else keyProp[0] ^= buttonID; } @@ -266,6 +266,8 @@ s8 checkPropButtons(){ if(keyProp[7] == 0) return 7; if(keyProp[8] == 0) return 8; if(keyProp[9] == 0) return 9; + if(keyProp[10] == 0) return 10; + if(keyProp[11] == 0) return 11; return -1; } @@ -315,9 +317,11 @@ void tickMenu(int menu){ k_accept.input = keyProp[7]; k_decline.input = keyProp[8]; k_delete.input = keyProp[9]; + k_menuNext.input = keyProp[10]; + k_menuPrev.input = keyProp[11]; FILE *fs=fopen("btnSave.bin","wb"); - fwrite(keyProp,sizeof(int),10,fs); + fwrite(keyProp,sizeof(int),12,fs); fclose(fs); currentSelection = 0; @@ -341,6 +345,8 @@ void tickMenu(int menu){ keyProp[7] = KEY_A; keyProp[8] = KEY_B; keyProp[9] = KEY_X; + keyProp[10] = KEY_R; + keyProp[11] = KEY_L; bindOpt = false; errorBut = -1; break; @@ -535,12 +541,10 @@ void tickMenu(int menu){ ++worldFileCount; } } - touchPosition touch; - hidTouchRead(&touch); - if((touch.px != 0 || touch.py != 0) && touchDelay == 0){ - if(!isTouching)doTouchButton(touch); + if((k_touch.px != 0 || k_touch.py != 0) && touchDelay == 0){ + if(!isTouching)doTouchButton(); } - else if(touch.px == 0 || touch.py == 0) isTouching = false; + else if(k_touch.px == 0 || k_touch.py == 0) isTouching = false; if(touchDelay > 0) --touchDelay; } break; @@ -575,8 +579,16 @@ void tickMenu(int menu){ break; case MENU_SETTINGS: - if (k_up.clicked){ --currentSelection; if(currentSelection < 0)currentSelection=3;} - if (k_down.clicked){ ++currentSelection; if(currentSelection > 3)currentSelection=0;} + if (k_up.clicked){ + --currentSelection; + if(currentSelection == 3 && !(MODEL_3DS & 6)) --currentSelection; + if(currentSelection < 0)currentSelection=4; + } + if (k_down.clicked){ + ++currentSelection; + if(currentSelection == 3 && !(MODEL_3DS & 6)) ++currentSelection; + if(currentSelection > 4)currentSelection=0; + } if(k_decline.clicked){ currentMenu = MENU_TITLE; currentSelection = 2; @@ -594,6 +606,8 @@ void tickMenu(int menu){ keyProp[7] = k_accept.input; keyProp[8] = k_decline.input; keyProp[9] = k_delete.input; + keyProp[10] = k_menuNext.input; + keyProp[11] = k_menuPrev.input; left = true; selBut = false; bindOpt = false; @@ -609,10 +623,17 @@ void tickMenu(int menu){ shouldRenderDebug = !shouldRenderDebug; // toggle option break; case 3: + if(MODEL_3DS & 6){ // detect if user is using a New 3DS + shouldSpeedup = !shouldSpeedup; // toggle option + osSetSpeedupEnable(shouldSpeedup); + } + break; + case 4: if(true){ - FILE * fset = fopen("settings.bin","wb"); - fwrite(&shouldRenderDebug,sizeof(bool),1,fset); - fclose(fset); + FILE * fset = fopen("settings.bin","wb"); + fwrite(&shouldRenderDebug,sizeof(bool),1,fset); + fwrite(&shouldSpeedup,sizeof(bool),1,fset); + fclose(fset); } currentMenu = MENU_TITLE; currentSelection = 2; @@ -633,6 +654,10 @@ void tickMenu(int menu){ enteringName = false; areYouSure = false; break; + case 1: + sprintf(pageText,"Page: %d/%d",pageNum+1,maxPageNum+1); + currentMenu = MENU_TUTORIAL; + break; case 2: currentSelection = 0; currentMenu = MENU_SETTINGS; @@ -647,6 +672,25 @@ void tickMenu(int menu){ } break; + case MENU_TUTORIAL: + if(k_decline.clicked){ + currentSelection = 1; + currentMenu = MENU_TITLE; + } + if(k_menuNext.clicked){ + if(pageNum < maxPageNum){ + ++pageNum; + sprintf(pageText,"Page: %d/%d",pageNum+1,maxPageNum+1); + } + } + if(k_menuPrev.clicked){ + if(pageNum > 0){ + --pageNum; + sprintf(pageText,"Page: %d/%d",pageNum+1,maxPageNum+1); + } + } + + break; } } @@ -673,6 +717,8 @@ char * getButtonFunctionMenu(int key){ if(keyProp[7] & key) return "Accept"; if(keyProp[8] & key) return "Decline"; if(keyProp[9] & key) return "Delete"; + if(keyProp[10] & key) return "Next"; + if(keyProp[11] & key) return "Previous"; return "Nothing"; } @@ -686,6 +732,14 @@ char guiText4[] = " SPACE BACKSPACE"; void renderMenu(int menu,int xscr,int yscr){ int i = 0; switch(menu){ + case MENU_TUTORIAL: + sf2d_start_frame(GFX_TOP, GFX_LEFT); + renderTutorialPage(true); + sf2d_end_frame(); + sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); + renderTutorialPage(false); + sf2d_end_frame(); + break; case MENU_SETTINGS_TP: offsetX = 0;offsetY = (currentSelection * 40) - 48; sf2d_start_frame(GFX_TOP, GFX_LEFT); @@ -875,7 +929,7 @@ void renderMenu(int menu,int xscr,int yscr){ drawText("Press to return", 98, 190); renderButtonIcon(k_decline.input & -k_decline.input, 168, 188, 1); - if(errorBut >= 0 && errorBut < 9){ + if(errorBut >= 0 && errorBut < 12){ char errorText[30]; switch(errorBut){ case 0: sprintf(errorText, "Error: Missing 'Move up'"); break; @@ -888,6 +942,8 @@ void renderMenu(int menu,int xscr,int yscr){ case 7: sprintf(errorText, "Error: Missing 'Accept'"); break; case 8: sprintf(errorText, "Error: Missing 'Decline'"); break; case 9: sprintf(errorText, "Error: Missing 'Delete'"); break; + case 10: sprintf(errorText, "Error: Missing 'Next'"); break; + case 11: sprintf(errorText, "Error: Missing 'Previous'"); break; } drawTextColor(errorText,(400 - (strlen(errorText) * 12))/2,50,0xFF0000FF); } @@ -1080,16 +1136,25 @@ void renderMenu(int menu,int xscr,int yscr){ break; case MENU_SETTINGS: sf2d_start_frame(GFX_TOP, GFX_LEFT); - drawText("Settings",(400-(8*12))/2,40); - for(i = 3; i >= 0; --i){ + drawText("Settings",(400-(8*12))/2,30); + for(i = 4; i >= 0; --i){ char* msg = setOptions[i]; u32 color = 0x7F7F7FFF; if(i == currentSelection) color = 0xFFFFFFFF; if(i == 2){ - if(shouldRenderDebug) drawSizedTextColor("On",142, ((8 + i) * 32 - 170) >> 1,2.0, 0x00DF00FF); - else drawSizedTextColor("Off",142, ((8 + i) * 32 - 170) >> 1,2.0, 0xDF0000FF); + if(shouldRenderDebug) drawSizedTextColor("On",142, ((8 + i) * 32 - 190) >> 1,2.0, 0x00DF00FF); + else drawSizedTextColor("Off",142, ((8 + i) * 32 - 190) >> 1,2.0, 0xDF0000FF); + } else if(i == 3){ + + if(MODEL_3DS & 6){ // detect if user is using a New 3DS + if(shouldSpeedup) drawSizedTextColor("On",142, ((8 + i) * 32 - 190) >> 1,2.0, 0x00DF00FF); + else drawSizedTextColor("Off",142, ((8 + i) * 32 - 190) >> 1,2.0, 0xDF0000FF); + } else { + color = 0x3F3F3FFF; + drawSizedTextColor("Off",142, ((8 + i) * 32 - 190) >> 1,2.0, 0x3F3F3FFF); + } } - drawSizedTextColor(msg,(200 - (strlen(msg) * 8))/2, ((8 + i) * 32 - 170) >> 1,2.0, color); + drawSizedTextColor(msg,(200 - (strlen(msg) * 8))/2, ((8 + i) * 32 - 190) >> 1,2.0, color); } sf2d_end_frame(); sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); @@ -1104,6 +1169,9 @@ void renderMenu(int menu,int xscr,int yscr){ drawTextColor("Show FPS/Pos/Entities",(320 - (22 * 12))/2,24,0xFFFF7FFF); break; case 3: + drawTextColor("Use the N3DS 804mhz mode",(320 - (24 * 12))/2,24,0xFFFF7FFF); + break; + case 4: drawTextColor("Back to the titlescreen",(320 - (23 * 12))/2,24,0xFFFF7FFF); break; } @@ -1163,7 +1231,7 @@ void renderMenu(int menu,int xscr,int yscr){ 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; + break; case 1: // "How To Play" startX = 72;startY = 54; render16(startX,startY,96,208,0);//C-PAD @@ -1181,16 +1249,34 @@ void renderMenu(int menu,int xscr,int yscr){ render16(startX,startY,160,208,0);//C-PAD right drawTextColor("Learn the basics",64,24,0xFFFF7FFF); - break; + break; case 2: // "Settings" - break; + drawTextColor("Modify the game's feel",(320 - (22 * 12))/2,24,0xFFFF7FFF); + renderc(48,48,0,112,64,32,0); + break; case 3: // "About" - break; + drawTextColor("Who made this game?",(320 - (19 * 12))/2,24,0xFFFF7FFF); + + // Secret code ;) + drawSizedText("497420776173206e6f746368",(320 - (24 * 8))/2,80,1); + drawSizedText("506f727465642062792044617669646565736b",(320 - (38 * 8))/2,88,1); + drawSizedText("576879207265616420746869733f",(320 - (28 * 8))/2,96,1); + drawSizedText("596f75207761737465642074696d65",(320 - (30 * 8))/2,104,1); + drawSizedText("4861204861204861204861204861",(320 - (28 * 8))/2,112,1); + drawSizedText("5468652063616b652069732061206c6965",(320 - (34 * 8))/2,120,1); + drawSizedText("4044617669646565736b2074776974746572",(320 - (36 * 8))/2,128,1); + drawSizedText("3533363536333732363537343231",(320 - (28 * 8))/2,136,1); + drawSizedText("4c69617220746578742062656c6f77",(320 - (30 * 8))/2,144,1); + drawSizedText("(Totally not a secret code or anything)",4,160,1); + + break; + case 4: // "Exit" + drawTextColor("Exit to the homebrew menu",(320 - (25 * 12))/2,24,0xFFFF7FFF); + drawTextColor("(bye-bye)",(320 - (9 * 12))/2,100,0xFFFF7FFF); + break; } sf2d_end_frame(); break; - - } - + } diff --git a/source/Menu.h b/source/Menu.h index e86c898..61c20f9 100644 --- a/source/Menu.h +++ b/source/Menu.h @@ -1,12 +1,6 @@ #pragma once -#include <3ds.h> -#include -#include -#include -#include - -#include "Render.h" +#include "MenuTutorial.h" #include "texturepack.h" void renderMenu(int menu,int xscr,int yscr); diff --git a/source/MenuTutorial.c b/source/MenuTutorial.c new file mode 100644 index 0000000..dfb026d --- /dev/null +++ b/source/MenuTutorial.c @@ -0,0 +1,256 @@ +#include "MenuTutorial.h" + +u8 pageNum = 0; +u8 maxPageNum = 6; + +u32 biasedCirclePad(u32 in){ + if(in & KEY_CPAD_UP) return KEY_CPAD_UP; + else if(in & KEY_CPAD_DOWN) return KEY_CPAD_DOWN; + else if(in & KEY_CPAD_LEFT) return KEY_CPAD_LEFT; + else if(in & KEY_CPAD_RIGHT) return KEY_CPAD_RIGHT; + else return (in & -in); +} + +u32 biasedMenuXY(u32 in){ + if(in & KEY_X) return KEY_X; + else if(in & KEY_Y) return KEY_Y; + else return (in & -in); +} + +/** Oh my god, this was so damn tedious to make. */ +void renderTutorialPage(bool topScreen){ + if(topScreen){ + drawTextColor("How to Play",(400-11*12)/2,12,0xAFAF00FF); + switch(pageNum){ + case 0: // Moving the character + drawTextColor("Movement",(400-8*12)/2,40,0xBF7F00FF); + drawText("Press to move up",92,90); + renderButtonIcon(biasedCirclePad(k_up.input), 164, 88, 1); + drawText("Press to move down",80,120); + renderButtonIcon(biasedCirclePad(k_down.input), 152, 118, 1); + drawText("Press to move left",80,150); + renderButtonIcon(biasedCirclePad(k_left.input), 152, 148, 1); + drawText("Press to move right",74,180); + renderButtonIcon(biasedCirclePad(k_right.input), 146, 178, 1); + break; + case 1: // Attacking + drawTextColor("Attacking",(400-9*12)/2,40,0xBF7F00FF); + drawText("Press to Attack",98,80); + renderButtonIcon(k_attack.input & -k_attack.input, 168, 78, 1); + drawText("Attack with an item to use it",26,120); + drawText("Use the axe to cut down trees",26,140); + drawText("Use the sword to attack enemies",14,160); + drawText("Use the shovel to dig ground",32,180); + drawText("Use the pickaxe to mine rock/ore",8,200); + break; + case 2: // Inventory + drawTextColor("Inventory",(400-9*12)/2,40,0xBF7F00FF); + drawText("Press to open the menu",56,80); + renderButtonIcon(biasedMenuXY(k_menu.input), 126, 78, 1); + drawText("Press to scroll up",80,110); + renderButtonIcon(biasedCirclePad(k_up.input), 152, 108, 1); + drawText("Press to scroll down",68,140); + renderButtonIcon(biasedCirclePad(k_down.input), 140, 138, 1); + drawText("Press to select an item",50,170); + renderButtonIcon(k_accept.input & -k_accept.input, 120, 168, 1); + drawText("Press to close the menu",50,200); + renderButtonIcon(k_decline.input & -k_decline.input, 120, 198, 1); + break; + case 3: // Furniture + drawTextColor("Furniture",(400-9*12)/2,40,0xBF7F00FF); + drawText("Use furniture for item crafting",(400-31*12)/2,74); + drawText("Press to open the menu",56,100); + renderButtonIcon(biasedMenuXY(k_menu.input), 126, 98, 1); + drawText("while infront of the furniture",(400-30*12)/2,116); + drawText("Use the lantern item to light",(400-29*12)/2,144); + drawText("up underground areas",(400-20*12)/2,160); + drawText("Use the power glove item to",(400-27*12)/2,184); + drawText("pick up furniture",(400-17*12)/2,200); + break; + case 4: // Crafting + drawTextColor("Crafting",(400-8*12)/2,40,0xBF7F00FF); + drawText("Create new items and tools",(400-26*12)/2,74); + drawText("Go up to a furniture item and",(400-29*12)/2,104); + drawText("Press to open the menu",56,120); + renderButtonIcon(biasedMenuXY(k_menu.input), 126, 118, 1); + drawText("Gather up the required materials",(400-32*12)/2,150); + drawText("and then press to craft it",(400-28*12)/2,166); + renderButtonIcon(k_accept.input & -k_accept.input, 210, 164, 1); + break; + case 5: // Farming + drawTextColor("Farming",(400-7*12)/2,40,0xBF7F00FF); + drawText("Grow wheat to make bread",(400-24*12)/2,74); + drawText("Dig up grass to gather seeds",(400-28*12)/2,94); + drawText("Use the hoe to till ground",(400-26*12)/2,114); + drawText("Harvest wheat when it is yellow",(400-31*12)/2,134); + drawText("Use the oven to bake bread",(400-26*12)/2,154); + drawText("It takes 4 wheat to craft bread",(400-31*12)/2,174); + break; + case 6: // Mining + drawTextColor("Mining",(400-6*12)/2,40,0xBF7F00FF); + drawText("Use a pickaxe tool for mining",(400-29*12)/2,74); + drawText("Mine rocks for stone",(400-20*12)/2,94); + drawText("Mine iron ore for iron",(400-22*12)/2,114); + drawText("Mine gold ore for gold",(400-22*12)/2,134); + drawText("Mine gem ore to get gems",(400-24*12)/2,154); + drawText("It takes 4 ore and 1 coal to",(400-28*12)/2,190); + drawText("make an ingot inside a furnace",(400-30*12)/2,210); + break; + } + } else { + switch(pageNum){ + case 0: // Moving the character + render16(30,56,16,112,0);//Player up + renderButtonIcon(biasedCirclePad(k_up.input), 30,40, 2); + render16(60,56,0,112,0);//Player down + renderButtonIcon(biasedCirclePad(k_down.input), 60,40, 2); + render16(90,56,48,112,1);//Player left + renderButtonIcon(biasedCirclePad(k_left.input), 90,40, 2); + render16(120,56,48,112,0);//Player right + renderButtonIcon(biasedCirclePad(k_right.input), 120,40, 2); + break; + case 1: // Attacking + render16(60,56,0,112,0);//Player-down + renderButtonIcon(k_attack.input & -k_attack.input, 80, 56, 2); + renderc(60,68,16,160,16,8,2);//Slash + + render16b(12,20,16,80,0,0x69B569FF);// grass pit + render16b(12+16,20,32,80,0,0x69B569FF); + render16b(12,20+16,48,80,0,0x69B569FF); + render16b(12+16,20+16,64,80,0,0x69B569FF); + render16(12+8,20+4,0,16,0);//Tree + renderc(12+9,20+14,16,160,16,8,0);//Slash + render(12+9+4,20+14,192,144,0);//Axe + render16(12+9,20+18,16,112,0);//Player-up + + render16b(122,62,16,80,0,0xF7F77BFF);// sand pit + render16b(122+16,62,32,80,0,0xF7F77BFF); + render16b(122,62+16,48,80,0,0xF7F77BFF); + render16b(122+16,62+16,64,80,0,0xF7F77BFF); + render16b(130,70,0,96,0,0x383838FF);// hole + render16(116,70,48,112,0);//Player-right + renderb(136,76,16,152,0,0xAF9781FF);// Dirt item + renderc(128,70,40,160,8,16,0);//Slash + render(130,74,0,144,0);//Shovel + break; + case 2: // Inventory + renderFrame(4,4,17,11,0xAFFF); + renderItemStuffWithText(ITEM_APPLE,5,false,80,78); + renderItemStuffWithText(ITEM_SLIME,11,false,80,94); + renderItemStuffWithText(TOOL_SWORD,4,true,80,110); + renderItemStuffWithText(ITEM_IRONORE,3,false,80,126); + renderItemStuffWithText(ITEM_IRONINGOT,11,false,80,142); + sf2d_draw_rectangle(64, 110, 12, 12, 0xFF); + drawText(">", 64, 110); + renderButtonIcon(biasedCirclePad(k_up.input), 44, 92, 1); + renderButtonIcon(k_accept.input & -k_accept.input, 44, 108, 1); + renderButtonIcon(biasedCirclePad(k_down.input), 44, 125, 1); + break; + case 3: // Furniture + sf2d_draw_rectangle(64, 48, 192, 32, 0x69B569FF); + renderc(32,24,64,128,96,16,0);//Furniture entities + + renderFurniture(ITEM_WORKBENCH, 50,60); + render16(50,46,0,112,0);//Player-down + renderc(50,58,16,160,16,8,2);//Slash + render(54,58,56,152,0);//Power glove + + render16(92,56,0,128,0);//Player(Carrying) + render16(92,44,128,128,0);//Workbench + break; + case 4: // Crafting + renderFrame(11,3,19,6,0x1010FFFF); + renderFrame(11,7,19,12,0x1010FFFF); + renderFrame(1,3,10,12,0x1010FFFF); + renderItemStuffWithText(TOOL_AXE,0,true,28,64); + renderItemIcon(TOOL_AXE, 0, 94, 32); + drawText("0", 206, 66); + renderItemIcon(ITEM_WOOD, 0, 94, 64); + drawText("16/5", 206, 130); + break; + case 5: // Farming (Bottom screen) + renderc(24,16,144,0,112,16,0); // Wheat Stages + + render16(20,40,144,0,0); // Farm Tile + render16(36,40,240,0,0); // Wheat Tile + render16(52,40,240,0,0); // Wheat Tile + render16(20,54,16,112,0); // Player (Up) + renderc(20,50,16,160,16,8,0); // Slash (Up) + render(19,45,40,152,0); // Seeds + render(26,39,48,152,0); // Wheat1 + render(29,44,48,152,0); // Wheat2 + + renderc(72,40,144,0,32,16,0); // Farm Tile + Seeded Wheat Tile + render16(72,54,16,112,0); // Player (Up) + renderc(72,50,16,160,16,8,0); // Slash (Up) + render(76,48,40,152,0); // Seeds + + sf2d_draw_rectangle(216, 80, 32, 32, dirtColor[1]); // Dirt color for grass + render16b(108, 40, 0, 80, 0, 0x69B569FF); // Grass + render16(124, 40,144,0,0); // Farm Tile + render16(108,54,16,112,0); // Player (Up) + renderc(108,50,16,160,16,8,0); // Slash (Up) + render(112,48,72,144,0); // Gem Hoe + + sf2d_draw_rectangle(112, 156, 32, 32, dirtColor[1]); // Dirt color for grass + render16b(56, 78, 0, 80, 0, 0x69B569FF); // Grass + sf2d_draw_rectangle(80, 156, 32, 32, dirtColor[1]); // Dirt color + render16b(40, 78, 0, 0, 0, 0xA88F8FFF); // Dirt Dots + render(44, 82, 40,152,0); // Seeds + + render16(24,78,48,112,0); // Player (Right) + renderc(36,78,40,160,8,16,0); // Slash (Right) + render(38,82,32,144,0); // Gem Shovel + + render(82,78,48,152,0); // Wheat + render(90,78,48,152,0); // Wheat + render(82,86,48,152,0); // Wheat + render(90,86,48,152,0); // Wheat + drawText(">",203,164); + render16(108,76,96,128,0); // Oven + drawText(">",246,164); + render(132,82,72,152,0); // Bread + break; + case 6: //Mining + render16b(23,32,80,0,0,0xDFC8C8FF); // iron ore + render16b(23,52,80,0,0,0xE5E8B9FF); // gold ore + render16b(23,72,80,0,0,0xDF98DEFF); // gem ore + renderb(41,38,88,152,0,0xDFC8C8FF); // Iron ore item + renderb(41,58,88,152,0,0xE5E8B9FF); // Gold ore item + render(41,78,112,152,0); // Gem item + drawText(">",104,74); + drawText(">",104,114); + drawText(">",104,154); + render16(60,32,112,128,0); // Furnace + render16(60,52,112,128,0); // Furnace + render16(60,72,64,128,0); // Anvil + drawText(">",160,74); + drawText(">",160,114); + drawText(">",160,154); + renderb(88,36,96,152,0,0xDFC8C8FF); // Iron ingot item + renderb(88,56,96,152,0,0xE5E8B9FF); // Gold ingot item + renderb(88,76,152,144,0,0xE5E8B9FF); // Gem Pickaxe + drawText(">",200,74); + drawText(">",200,114); + render16(106,32,64,128,0); // Anvil + render16(106,52,64,128,0); // Anvil + drawText(">",244,74); + drawText(">",244,114); + render(130,36,136,144,0); // Iron Pickaxe + render(130,56,144,144,0); // Gold Pickaxe + break; + } + + drawText(pageText,(320-(strlen(pageText))*12)/2,12); + if(pageNum > 0){ + drawText("<",2,16); + renderButtonIcon(k_menuPrev.input & -k_menuPrev.input, 8, 2, 2); + } + if(pageNum < maxPageNum){ + drawText(">",306,16); + renderButtonIcon(k_menuNext.input & -k_menuNext.input, 136, 2, 2); + } + drawText("Press to exit",(320-(15*12))/2,218); + renderButtonIcon(k_decline.input & -k_decline.input, 140, 216, 1); + } +} diff --git a/source/MenuTutorial.h b/source/MenuTutorial.h new file mode 100644 index 0000000..84d5733 --- /dev/null +++ b/source/MenuTutorial.h @@ -0,0 +1,16 @@ +#pragma once + +#include <3ds.h> +#include +#include +#include +#include + +#include "Render.h" + +extern u8 pageNum; +extern u8 maxPageNum; + +char pageText[18]; + +void renderTutorialPage(bool topScreen); diff --git a/source/Render.c b/source/Render.c index 1e64b92..35952d3 100644 --- a/source/Render.c +++ b/source/Render.c @@ -93,20 +93,20 @@ void render16(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits) { scaleX, scaleY); } -void render16c(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, float scaleX, - float scaleY) { +void render16c(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, float scaleX,float scaleY) { xp -= offsetX; yp -= offsetY; + xp *= scaleX; + yp *= scaleY; if ((bits & 1) > 0) { + xp += 16 * scaleX; scaleX = -scaleX; - xp += 16; } if ((bits & 2) > 0) { + yp += 16 * scaleY; scaleY = -scaleY; - yp += 16; } - sf2d_draw_texture_part_scale(icons, xp * scaleX, yp * scaleY, xTile, yTile, - 16, 16, scaleX, scaleY); + sf2d_draw_texture_part_scale(icons, xp, yp, xTile, yTile,16, 16, scaleX, scaleY); } void render16b(s32 xp, s32 yp, u32 xTile, u32 yTile, u8 bits, u32 color) { @@ -548,7 +548,7 @@ void renderTile(int i, int x, int y) { render16s(x, y, rockTable[v] + 8192, 0, 0xCFCFFFFF); renderRockDotsWithColor(rockTable[v], x, y, 0x9494FFFF); break; - case TILE_DIRT: + case TILE_DIRT: // render dots. if (currentLevel > 1) render16b(x, y, 0, 0, 0, 0x383838FF); else @@ -637,10 +637,36 @@ void renderTile(int i, int x, int y) { } +void renderZoomedMap() { + int mx = mScrollX; + int my = mScrollY; + if(zoomLevel == 2) mx = 32; + sf2d_draw_texture_scale(minimap[currentLevel], mx, my, zoomLevel, zoomLevel); // zoomed map + if(currentLevel == 0){ + render16c( + (mx+((awX/16)*zoomLevel)-16)/2, + (my+((awY/16)*zoomLevel)-16)/2, + 160, 112, + ((player.p.walkDist >> 6) & 1) == 0 ? 0 : 1, + 2, 2 + ); // Airwizard on zoomed map + } + render16c( + (mx+((player.x/16)*zoomLevel)-16)/2, + (my+((player.y/16)*zoomLevel)-16)/2, + 0, 112, + ((player.p.walkDist >> 6) & 1) == 0 ? 0 : 1, + 2, 2 + ); // Player on zoomed map + drawText(mapText,224, 214); // "x2"/"x4"/"x6" + render16(142, 2, 72, 208, 0); // Exit button + renderc(126, 102, 40, 208, 32, 16, 0); // Plus/Minus zoom buttons + if(zoomLevel < 3) sf2d_draw_rectangle(258, 210, 26, 20, 0x4F4F4F7F); // gray out minus button + else if(zoomLevel > 5) sf2d_draw_rectangle(284, 210, 26, 20, 0x4F4F4F7F); // gray out minus button +} + char scoreT[32]; void renderGui() { - //renderFrame(0,0,11,3,0x201092FF); - //renderFrame(11,0,20,3,0x201092FF); int i; for (i = 0; i < 10; ++i) { if (i < player.p.health) @@ -657,6 +683,10 @@ void renderGui() { itoa(player.p.score, scoreT, 10); // integer to base10 string drawText("Score:",214,12); drawText(scoreT,(140-(strlen(scoreT)*12))/2 + 180,29); + if(currentLevel == 0){ + renderc(44 + (awX/32), 47 + (awY/32), 88, 216, 8, 8, 0); // Mini-AWizard head. + } + renderc(44 + (player.x/32), 47 + (player.y/32), 88, 208, 8, 8, 0); // Mini-Player head. } void renderPlayer() { @@ -748,7 +778,11 @@ void renderMenuBackground(int xScroll, int yScroll) { } void renderBackground(int xScroll, int yScroll) { - sf2d_draw_rectangle(0, 0, 400, 240, dirtColor[currentLevel]); // dirt color + if(currentLevel > 0) sf2d_draw_rectangle(0, 0, 400, 240, dirtColor[currentLevel]); // dirt color + else { + sf2d_draw_texture_part_scale(minimap[1], (-xScroll / 3) - 256, (-yScroll / 3) - 32, 0, 0, 128, 128, 12.5, 7.5); + sf2d_draw_rectangle(0, 0, 400, 240, 0xDFDFDFAF); + } int xo = xScroll >> 4; int yo = yScroll >> 4; int x, y; @@ -1037,6 +1071,15 @@ void renderItemWithText(Item* item, int x, int y) { y + 2, 0xD2D2D2FF, 0xFFFFFFFF); } +void renderItemStuffWithText(int itemID, int itemCL, bool onlyOne, int x, int y) { + renderItemIcon(itemID, itemCL, x >> 1, y >> 1); + if (onlyOne) + drawText(getItemName(itemID, itemCL), x + 18, y + 2); + else + drawTextColorSpecial(getItemName(itemID, itemCL), x + 18, + y + 2, 0xD2D2D2FF, 0xFFFFFFFF); +} + /* For bottom screen */ void renderItemWithTextCentered(Item* item, int width, int y) { char * tn = getItemName(item->id, item->countLevel); diff --git a/source/Render.h b/source/Render.h index 08ae9a3..1b91e04 100644 --- a/source/Render.h +++ b/source/Render.h @@ -39,6 +39,7 @@ void bakeLight(sf2d_texture* texture, int x, int y, int r); void renderLight(int x, int y, sf2d_texture* texture); void renderGui(); +void renderZoomedMap(); void renderPlayer(); void drawText(char * msg, u32 x, u32 y); @@ -56,6 +57,7 @@ void renderRecipes(RecipeManager * r, int xo, int yo, int x1, int y1, void renderItemList(Inventory * inv, int xo, int yo, int x1, int y1, int selected); void renderItemWithText(Item* item, int x, int y); +void renderItemStuffWithText(int itemID, int itemCL, bool onlyOne, int x, int y); void renderItemWithTextCentered(Item* item, int width, 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 97de4c9..e640b01 100644 --- a/source/main.c +++ b/source/main.c @@ -98,6 +98,9 @@ void initMiniMap(bool loadUpWorld) { case TILE_STAIRS_UP: sf2d_set_pixel(minimap[i], x, y, 0xFF9F9F9F); break; + case 255: + sf2d_set_pixel(minimap[i], x, y, 0xFF007F00); + break; default: sf2d_set_pixel(minimap[i], x, y, 0xFF111111); break; @@ -138,6 +141,11 @@ void setupGame(bool loadUpWorld) { } initMiniMap(loadUpWorld); + shouldRenderMap = false; + mScrollX = 0; + mScrollY = 0; + zoomLevel = 2; + sprintf(mapText,"x%d",zoomLevel); initGame = 0; } @@ -156,6 +164,8 @@ void tick() { --player.p.endTimer; return; } + + tickTouchMap(); int i; for (i = 0; i < 324; ++i) { @@ -194,6 +204,16 @@ void clearScreen(int* data, u8 fill, int size) { char debugText[34]; char bossHealthText[34]; int main() { + CFGU_GetSystemModel(&MODEL_3DS); + FILE * file; + shouldRenderDebug = true; + if ((file = fopen("settings.bin", "r"))) { + fread(&shouldRenderDebug,sizeof(bool),1,file); + fread(&shouldSpeedup,sizeof(bool),1,file); + osSetSpeedupEnable(shouldSpeedup); + fclose(file); + } + sf2d_init(); csndInit(); noItem = newItem(ITEM_NULL, 0); @@ -246,7 +266,8 @@ int main() { k_accept.input = KEY_A; k_decline.input = KEY_B; k_delete.input = KEY_X; - FILE * file; + k_menuNext.input = KEY_R; + k_menuPrev.input = KEY_L; /* If btnSave exists, then use that. */ if ((file = fopen("btnSave.bin", "rb"))) { @@ -260,6 +281,8 @@ int main() { fread(&k_accept.input, sizeof(int), 1, file); fread(&k_decline.input, sizeof(int), 1, file); fread(&k_delete.input, sizeof(int), 1, file); + fread(&k_menuNext.input, sizeof(int), 1, file); + fread(&k_menuPrev.input, sizeof(int), 1, file); fclose(file); } @@ -270,12 +293,6 @@ int main() { loadTexturePack(fnbuf); fclose(file); } - - shouldRenderDebug = true; - if ((file = fopen("settings.bin", "r"))) { - fread(&shouldRenderDebug,sizeof(bool),1,file); - fclose(file); - } tickCount = 0; initRecipes(); @@ -292,10 +309,6 @@ int main() { if (currentMenu == 0) { tick(); 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; @@ -305,10 +318,11 @@ int main() { renderBackground(xscr, yscr); renderEntities(player.x, player.y, &eManager); renderPlayer(); - + resetStencilStuff(); offsetX = 0; offsetY = 0; + if(shouldRenderDebug){ sprintf(fpsstr, " FPS: %.0f, X:%d, Y:%d, E:%d", sf2d_get_fps(), player.x, player.y, eManager.lastSlot[currentLevel]); drawText(fpsstr, 2, 225); @@ -316,10 +330,14 @@ int main() { sf2d_end_frame(); - sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); - sf2d_draw_texture(bottombg, 0, 0); - renderGui(); - sf2d_end_frame(); + sf2d_start_frame(GFX_BOTTOM, GFX_LEFT); + if(!shouldRenderMap){ + sf2d_draw_texture(bottombg, 0, 0); + renderGui(); + } else { + renderZoomedMap(); + } + sf2d_end_frame(); } else { tickMenu(currentMenu); renderMenu(currentMenu, xscr, yscr);