Version 1.5.0
Big Refactor
This commit is contained in:
parent
3b2a0f4de8
commit
d2f7796b79
49 changed files with 5306 additions and 3590 deletions
382
source/main.c
382
source/main.c
|
@ -13,189 +13,72 @@
|
|||
#include "Menu.h"
|
||||
#include "texturepack.h"
|
||||
#include "Network.h"
|
||||
#include "SaveLoad.h"
|
||||
#include "Ingame.h"
|
||||
#include "Player.h"
|
||||
#include "Synchronizer.h"
|
||||
#include "PacketHandler.h"
|
||||
|
||||
// TODO: Dungeon is way to difficult
|
||||
// -> Skeleton arrows are slower, do a little less damage
|
||||
// -> Or instead of less damage, implement a simple armor system
|
||||
|
||||
//TODO: Multiplayer should use normal drawing code -> so remove this first test again
|
||||
float tmxscr = 400;
|
||||
float tmyscr = 400;
|
||||
float tmenuxa = 0.25;
|
||||
float tmenuya = 0.25;
|
||||
//TODO: Something still causes desyncs very rarely
|
||||
|
||||
|
||||
void initMiniMapData() {
|
||||
int i;
|
||||
for(i = 0; i < 128 * 128; ++i) {
|
||||
minimapData[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void initMiniMap(bool loadUpWorld) {
|
||||
int i;
|
||||
for (i = 0; i < 5; ++i) {
|
||||
initMinimapLevel(i, loadUpWorld);
|
||||
}
|
||||
}
|
||||
|
||||
void initNewMap() {
|
||||
newSeed();
|
||||
createAndValidateSkyMap(128, 128, 0, map[0], data[0]);
|
||||
createAndValidateTopMap(128, 128, 1, map[1], data[1]);
|
||||
createAndValidateUndergroundMap(128, 128, 1, 2, map[2], data[2]);
|
||||
createAndValidateUndergroundMap(128, 128, 2, 3, map[3], data[3]);
|
||||
createAndValidateUndergroundMap(128, 128, 3, 4, map[4], data[4]);
|
||||
}
|
||||
|
||||
void setupGame(bool loadUpWorld, bool remote) {
|
||||
currentLevel = 1;
|
||||
|
||||
// Reset entity manager.
|
||||
memset(&eManager, 0, sizeof(eManager));
|
||||
sf2d_set_clear_color(0xFF6C6D82); //sf2d_set_clear_color(RGBA8(0x82, 0x6D, 0x6C, 0xFF));
|
||||
|
||||
initMiniMapData();
|
||||
|
||||
if(!remote) {
|
||||
if (!loadUpWorld) {
|
||||
initNewMap();
|
||||
initPlayer();
|
||||
resetQuests();
|
||||
airWizardHealthDisplay = 2000;
|
||||
int i;
|
||||
for (i = 0; i < 5; ++i) {
|
||||
trySpawn(500, i);
|
||||
}
|
||||
addEntityToList(newAirWizardEntity(630, 820, 0), &eManager);
|
||||
daytime = 6000;
|
||||
day = 0;
|
||||
season = 0;
|
||||
rain = false;
|
||||
} else {
|
||||
initPlayer();
|
||||
resetQuests();
|
||||
loadWorld(currentFileName, &eManager, &player, (u8*) map, (u8*) data);
|
||||
}
|
||||
|
||||
updateMusic(currentLevel, daytime);
|
||||
|
||||
initMiniMap(loadUpWorld);
|
||||
} else {
|
||||
//reset level data so no old data can somehow remain
|
||||
memset(map, 0, 128*128*5 * sizeof(u8));
|
||||
memset(data, 0, 128*128*5 * sizeof(u8));
|
||||
|
||||
currentLevel = 1;
|
||||
|
||||
//TODO: Can Packets get dropped - if yes, should resending be handled by network functions (so I dont need to do it everywhere)
|
||||
networkPacket packet = {
|
||||
.requestMapData = {
|
||||
.type = PACKET_REQUEST_MAPDATA,
|
||||
.level = 1
|
||||
}
|
||||
};
|
||||
networkSend(&packet, sizeof(packetRequestMapData));
|
||||
}
|
||||
void setupGame() {
|
||||
synchronizerInit(rand(), 1, 0);
|
||||
synchronizerSetPlayerUID(0, localUID);
|
||||
synchronizerStart();
|
||||
|
||||
shouldRenderMap = false;
|
||||
mScrollX = 0;
|
||||
mScrollY = 0;
|
||||
zoomLevel = 2;
|
||||
sprintf(mapText,"x%d",zoomLevel);
|
||||
initGame = 0;
|
||||
}
|
||||
|
||||
void setupBGMap(bool loadUpWorld) {
|
||||
void setupGameServer() {
|
||||
size_t size;
|
||||
|
||||
networkHostStopConnections();
|
||||
|
||||
//send start info (seed)
|
||||
size = writeStartPacket(networkWriteBuffer, rand());
|
||||
networkSend(networkWriteBuffer, size);
|
||||
processPacket(networkWriteBuffer, size);
|
||||
networkSendWaitFlush();
|
||||
|
||||
//send save file if loading
|
||||
FILE *file = fopen(currentFileName, "rb");
|
||||
if(file!=NULL) {
|
||||
sendFile(file, 0, 0);
|
||||
networkSendWaitFlush();
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
//send start command
|
||||
size = writeStartRequestPacket(networkWriteBuffer);
|
||||
networkSend(networkWriteBuffer, size);
|
||||
processPacket(networkWriteBuffer, size);
|
||||
|
||||
initMPGame = 0;
|
||||
}
|
||||
|
||||
void setupBGMap() {
|
||||
// Reset entity manager.
|
||||
memset(&eManager, 0, sizeof(eManager));
|
||||
sf2d_set_clear_color(0xFF6C6D82); //sf2d_set_clear_color(RGBA8(0x82, 0x6D, 0x6C, 0xFF));
|
||||
sf2d_set_clear_color(0xFF6C6D82);
|
||||
|
||||
if(!loadUpWorld) {
|
||||
newSeed();
|
||||
createAndValidateTopMap(128, 128, 1, map[1], data[1]);
|
||||
} else {
|
||||
loadWorld(currentFileName, &eManager, &player, (u8*) map, (u8*) data);
|
||||
}
|
||||
|
||||
srand(time(NULL));
|
||||
createAndValidateTopMap(128, 128, 1, worldData.map[1], worldData.data[1]);
|
||||
|
||||
// Reset entity manager.
|
||||
memset(&eManager, 0, sizeof(eManager));
|
||||
sf2d_set_clear_color(0xFF6C6D82); //sf2d_set_clear_color(RGBA8(0x82, 0x6D, 0x6C, 0xFF));
|
||||
sf2d_set_clear_color(0xFF6C6D82);
|
||||
|
||||
initBGMap = 0;
|
||||
}
|
||||
|
||||
int xscr = 0, yscr = 0;
|
||||
void tick() {
|
||||
//TODO: Some stuff DOES need to happen even on client side
|
||||
if(!isRemote) {
|
||||
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;
|
||||
}
|
||||
|
||||
tickTouchMap();
|
||||
tickTouchQuickSelect();
|
||||
|
||||
++daytime;
|
||||
//daytime += 20;
|
||||
if(daytime>=24000) {
|
||||
daytime -= 24000;
|
||||
++day;
|
||||
//TODO: maybe make season length not as hardcoded + make the transition better (fade to black and back maybe?)
|
||||
if(day%7==0) {
|
||||
++season;
|
||||
if(season==4) season = 0;
|
||||
}
|
||||
rain = false;
|
||||
if(season!=3 && rand()%5==0) rain = true;
|
||||
}
|
||||
if(daytime==6000 && currentLevel==1) {
|
||||
playMusic(music_floor1);
|
||||
} else if(daytime==19000 && currentLevel==1) {
|
||||
playMusic(music_floor1_night);
|
||||
}
|
||||
|
||||
int i;
|
||||
for (i = 0; i < 324; ++i) {
|
||||
int xx = rand() & 127;
|
||||
int yy = rand() & 127;
|
||||
tickTile(xx, yy);
|
||||
}
|
||||
tickPlayer();
|
||||
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;
|
||||
|
||||
if(eManager.lastSlot[currentLevel]<80 && currentLevel != 5) {
|
||||
trySpawn(1, currentLevel);
|
||||
}
|
||||
|
||||
for (i = 0; i < eManager.lastSlot[currentLevel]; ++i) {
|
||||
Entity * e = &eManager.entities[currentLevel][i];
|
||||
if ((e->type != ENTITY_ZOMBIE && e->type != ENTITY_SKELETON && e->type != ENTITY_KNIGHT && e->type != ENTITY_SLIME && e->type != ENTITY_PASSIVE)
|
||||
|| (e->type == ENTITY_GLOWWORM && (daytime>6000 || daytime<18000))
|
||||
|| (e->x > player.x - 160 && e->y > player.y - 125 && e->x < player.x + 160 && e->y < player.y + 125))
|
||||
tickEntity(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
//for rendering -> move to a better place
|
||||
extern int xscr, yscr;
|
||||
|
||||
char debugText[34];
|
||||
char bossHealthText[34];
|
||||
|
@ -203,7 +86,7 @@ int main() {
|
|||
cfguInit();
|
||||
CFGU_GetSystemModel(&MODEL_3DS);
|
||||
FILE * file;
|
||||
shouldRenderDebug = true;
|
||||
shouldRenderDebug = false;
|
||||
if ((file = fopen("settings.bin", "r"))) {
|
||||
fread(&shouldRenderDebug,sizeof(bool),1,file);
|
||||
fread(&shouldSpeedup,sizeof(bool),1,file);
|
||||
|
@ -213,6 +96,21 @@ int main() {
|
|||
sf2d_init();
|
||||
csndInit();
|
||||
networkInit();
|
||||
|
||||
srand(time(NULL));
|
||||
|
||||
//load or create localUID
|
||||
if ((file = fopen("m3ds_uid.bin", "rb"))) {
|
||||
fread(&localUID, sizeof(u32), 1, file);
|
||||
fclose(file);
|
||||
} else {
|
||||
localUID = (((u32) (rand()%256))<<24) | (((u32) (rand()%256))<<16) | (((u32) (rand()%256))<<8) | (((u32) (rand()%256)));
|
||||
|
||||
if ((file = fopen("m3ds_uid.bin", "wb"))) {
|
||||
fwrite(&localUID, sizeof(u32), 1, file);
|
||||
fclose(file);
|
||||
}
|
||||
}
|
||||
|
||||
noItem = newItem(ITEM_NULL, 0);
|
||||
|
||||
|
@ -220,13 +118,15 @@ int main() {
|
|||
currentMenu = MENU_TITLE;
|
||||
currentSelection = 0;
|
||||
quitGame = false;
|
||||
initBGMap = 1;
|
||||
|
||||
icons = sfil_load_PNG_buffer(icons2_png, SF2D_PLACE_RAM);
|
||||
playerSprites = sfil_load_PNG_buffer(player_png, SF2D_PLACE_RAM);
|
||||
font = sfil_load_PNG_buffer(Font_png, SF2D_PLACE_RAM);
|
||||
bottombg = sfil_load_PNG_buffer(bottombg_png, SF2D_PLACE_RAM);
|
||||
|
||||
loadSounds();
|
||||
playMusic(music_menu);
|
||||
playMusic(&music_menu);
|
||||
|
||||
bakeLights();
|
||||
|
||||
|
@ -244,33 +144,33 @@ int main() {
|
|||
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;
|
||||
k_left.input = KEY_DLEFT | KEY_CPAD_LEFT | KEY_CSTICK_LEFT;
|
||||
k_right.input = KEY_DRIGHT | KEY_CPAD_RIGHT | KEY_CSTICK_RIGHT;
|
||||
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;
|
||||
k_menuNext.input = KEY_R;
|
||||
k_menuPrev.input = KEY_L;
|
||||
localInputs.k_up.input = KEY_DUP | KEY_CPAD_UP | KEY_CSTICK_UP;
|
||||
localInputs.k_down.input = KEY_DDOWN | KEY_CPAD_DOWN | KEY_CSTICK_DOWN;
|
||||
localInputs.k_left.input = KEY_DLEFT | KEY_CPAD_LEFT | KEY_CSTICK_LEFT;
|
||||
localInputs.k_right.input = KEY_DRIGHT | KEY_CPAD_RIGHT | KEY_CSTICK_RIGHT;
|
||||
localInputs.k_attack.input = KEY_A | KEY_B | KEY_L | KEY_ZR;
|
||||
localInputs.k_menu.input = KEY_X | KEY_Y | KEY_R | KEY_ZL;
|
||||
localInputs.k_pause.input = KEY_START;
|
||||
localInputs.k_accept.input = KEY_A;
|
||||
localInputs.k_decline.input = KEY_B;
|
||||
localInputs.k_delete.input = KEY_X;
|
||||
localInputs.k_menuNext.input = KEY_R;
|
||||
localInputs.k_menuPrev.input = KEY_L;
|
||||
|
||||
/* 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);
|
||||
fread(&k_menuNext.input, sizeof(int), 1, file);
|
||||
fread(&k_menuPrev.input, sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_up.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_down.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_left.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_right.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_attack.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_menu.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_pause.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_accept.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_decline.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_delete.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_menuNext.input), sizeof(int), 1, file);
|
||||
fread(&(localInputs.k_menuPrev.input), sizeof(int), 1, file);
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
|
@ -281,102 +181,25 @@ int main() {
|
|||
loadTexturePack(fnbuf);
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
tickCount = 0;
|
||||
|
||||
initPlayers();
|
||||
initRecipes();
|
||||
initQuests();
|
||||
initTrades();
|
||||
while (aptMainLoop()) {
|
||||
++tickCount;
|
||||
hidScanInput();
|
||||
tickKeys(hidKeysHeld(), hidKeysDown());
|
||||
|
||||
if (quitGame) break;
|
||||
|
||||
if (initGame > 0) setupGame(initGame == 1 ? true : false, isRemote);
|
||||
if (initBGMap > 0) setupBGMap(initBGMap == 1 ? true : false);
|
||||
|
||||
networkRecieve();
|
||||
if (initGame > 0 && --initGame==0) setupGame();
|
||||
if (initMPGame > 0 && --initMPGame==0) setupGameServer();
|
||||
if (initBGMap > 0 && --initBGMap==0) setupBGMap();
|
||||
|
||||
if (currentMenu == 0) {
|
||||
tick();
|
||||
//TODO: Multiplayer should use normal drawing code -> so remove this first test again
|
||||
if(!isRemote) {
|
||||
sf2d_start_frame(GFX_TOP, GFX_LEFT);
|
||||
|
||||
offsetX = xscr;
|
||||
offsetY = yscr;
|
||||
sf2d_draw_rectangle(0, 0, 400, 240, 0xFF0C0C0C); //RGBA8(12, 12, 12, 255)); //You might think "real" black would be better, but it actually looks better that way
|
||||
|
||||
renderLightsToStencil(false, false, true);
|
||||
|
||||
renderBackground(xscr, yscr);
|
||||
renderEntities(player.x, player.y, &eManager);
|
||||
renderPlayer();
|
||||
renderWeather(xscr, yscr);
|
||||
|
||||
resetStencilStuff();
|
||||
|
||||
renderDayNight();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
sf2d_end_frame();
|
||||
|
||||
sf2d_start_frame(GFX_BOTTOM, GFX_LEFT);
|
||||
if(!shouldRenderMap){
|
||||
sf2d_draw_texture(bottombg, 0, 0);
|
||||
renderGui();
|
||||
} else {
|
||||
renderZoomedMap();
|
||||
}
|
||||
sf2d_end_frame();
|
||||
//TODO: Multiplayer should use normal drawing code -> so remove this first test again
|
||||
} else {
|
||||
//TODO: Temporary way of getting back to the menu
|
||||
if (k_pause.clicked){
|
||||
sf2d_set_clear_color(0xFF);
|
||||
currentSelection = 0;
|
||||
currentMenu = MENU_TITLE;
|
||||
|
||||
networkDisconnect();
|
||||
|
||||
playMusic(music_menu);
|
||||
}
|
||||
|
||||
tmxscr += tmenuxa;
|
||||
tmyscr += tmenuya;
|
||||
|
||||
if (tmxscr < 16) {
|
||||
tmxscr = 16;
|
||||
tmenuxa = -tmenuxa;
|
||||
} else if (tmxscr > 1832) {
|
||||
tmxscr = 1832;
|
||||
tmenuxa = -tmenuxa;
|
||||
}
|
||||
if (tmyscr < 16) {
|
||||
tmyscr = 16;
|
||||
tmenuya = -tmenuya;
|
||||
} else if (tmyscr > 1792) {
|
||||
tmyscr = 1792;
|
||||
tmenuya = -tmenuya;
|
||||
}
|
||||
|
||||
sf2d_start_frame(GFX_TOP, GFX_LEFT);
|
||||
offsetX = (int) tmxscr; offsetY = (int) tmyscr;
|
||||
renderBackground((int) tmxscr, (int) tmyscr);
|
||||
offsetX = 0; offsetY = 0;
|
||||
sf2d_end_frame();
|
||||
|
||||
sf2d_start_frame(GFX_BOTTOM, GFX_LEFT);
|
||||
sf2d_end_frame();
|
||||
}
|
||||
if (currentMenu == MENU_NONE) {
|
||||
tickGame();
|
||||
renderGame();
|
||||
} else {
|
||||
//input scanning ingame is handled by the synchronizer
|
||||
hidScanInput();
|
||||
tickKeys(&localInputs, hidKeysHeld(), hidKeysDown());
|
||||
|
||||
tickMenu(currentMenu);
|
||||
renderMenu(currentMenu, xscr, yscr);
|
||||
}
|
||||
|
@ -386,8 +209,9 @@ int main() {
|
|||
|
||||
stopMusic();
|
||||
|
||||
freeQuests();
|
||||
freeTrades();
|
||||
freeRecipes();
|
||||
freePlayers();
|
||||
|
||||
freeLightBakes();
|
||||
sf2d_free_texture(icons);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue