Beta Build 5!

This commit is contained in:
DavidSM64 2015-11-15 20:15:08 -06:00
parent 34e1896ee8
commit 93674e3fa2
12 changed files with 583 additions and 68 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,6 +1,6 @@
#include "Globals.h"
char versionText[34] = "BETA BUILD 4";
char versionText[34] = "BETA BUILD 5 (pre 1.0)";
char fpsstr[34];
u8 currentMenu = 0;
@ -118,6 +118,86 @@ bool moveMob(Entity* e, int xa, int ya){
return move(e, xa, ya);
}
s16 lastTouchX = -1;
s16 lastTouchY = -1;
bool isDraggingMap = false;
bool isChangingSize = false;
void tickTouchMap(){
if(shouldRenderMap){
if(k_touch.px > 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){

View file

@ -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);

View file

@ -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);
}

View file

@ -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);
bool clicked(Key key);

View file

@ -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,9 +623,16 @@ 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);
fwrite(&shouldSpeedup,sizeof(bool),1,fset);
fclose(fset);
}
currentMenu = MENU_TITLE;
@ -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;
}
@ -1183,14 +1251,32 @@ void renderMenu(int menu,int xscr,int yscr){
drawTextColor("Learn the basics",64,24,0xFFFF7FFF);
break;
case 2: // "Settings"
drawTextColor("Modify the game's feel",(320 - (22 * 12))/2,24,0xFFFF7FFF);
renderc(48,48,0,112,64,32,0);
break;
case 3: // "About"
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;
}
}

View file

@ -1,12 +1,6 @@
#pragma once
#include <3ds.h>
#include <string.h>
#include <sf2d.h>
#include <dirent.h>
#include <ctype.h>
#include "Render.h"
#include "MenuTutorial.h"
#include "texturepack.h"
void renderMenu(int menu,int xscr,int yscr);

256
source/MenuTutorial.c Normal file
View file

@ -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);
}
}

16
source/MenuTutorial.h Normal file
View file

@ -0,0 +1,16 @@
#pragma once
#include <3ds.h>
#include <string.h>
#include <sf2d.h>
#include <dirent.h>
#include <ctype.h>
#include "Render.h"
extern u8 pageNum;
extern u8 maxPageNum;
char pageText[18];
void renderTutorialPage(bool topScreen);

View file

@ -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);

View file

@ -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);

View file

@ -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;
}
@ -157,6 +165,8 @@ void tick() {
return;
}
tickTouchMap();
int i;
for (i = 0; i < 324; ++i) {
int xx = rand() & 127;
@ -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);
}
@ -271,12 +294,6 @@ int main() {
fclose(file);
}
shouldRenderDebug = true;
if ((file = fopen("settings.bin", "r"))) {
fread(&shouldRenderDebug,sizeof(bool),1,file);
fclose(file);
}
tickCount = 0;
initRecipes();
defineTables();
@ -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;
@ -309,6 +322,7 @@ int main() {
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);
@ -317,8 +331,12 @@ int main() {
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);