#include <3ds.h> #include #include #include #include #include #include #include #include "Globals.h" #include "Render.h" #include "MapGen.h" #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: Something still causes desyncs very rarely void setupGame() { synchronizerInit(rand(), 1, 0); synchronizerSetPlayerUID(0, localUID); synchronizerStart(); initGame = 0; } 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); 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); initBGMap = 0; } //for rendering -> move to a better place extern int xscr, yscr; char debugText[34]; char bossHealthText[34]; int main() { cfguInit(); CFGU_GetSystemModel(&MODEL_3DS); FILE * file; shouldRenderDebug = false; 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(); 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); initMenus(); 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); bakeLights(); int i; for (i = 0; i < 6; ++i) { minimap[i] = sf2d_create_texture(128, 128, TEXFMT_RGBA8, SF2D_PLACE_RAM); sf2d_texture_tile32(minimap[i]); } reloadColors(); sf2d_set_vblank_wait(true); sf2d_set_clear_color(0xFF); /* Default inputs */ 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(&(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); } /* If lastTP exists, then use that. */ if ((file = fopen("lastTP.bin", "r"))) { char fnbuf[256]; fgets(fnbuf, 256, file); // get directory to texturepack loadTexturePack(fnbuf); fclose(file); } initPlayers(); initRecipes(); initTrades(); while (aptMainLoop()) { if (quitGame) break; if (initGame > 0 && --initGame==0) setupGame(); if (initMPGame > 0 && --initMPGame==0) setupGameServer(); if (initBGMap > 0 && --initBGMap==0) setupBGMap(); 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); } sf2d_swapbuffers(); } stopMusic(); freeTrades(); freeRecipes(); freePlayers(); freeLightBakes(); sf2d_free_texture(icons); sf2d_free_texture(minimap[0]); sf2d_free_texture(minimap[1]); sf2d_free_texture(minimap[2]); sf2d_free_texture(minimap[3]); sf2d_free_texture(minimap[4]); sf2d_free_texture(minimap[5]); freeSounds(); networkExit(); csndExit(); cfguExit(); sf2d_fini(); return 0; }