From 0fe6c06c7d4d4dfbdb0960a5fcf0102f14b30d2a Mon Sep 17 00:00:00 2001 From: seth Date: Wed, 13 Sep 2017 09:48:34 +0000 Subject: [PATCH] * (windows) Version # is now shown in title bar * (bugfix) Fixed some issues with how default offsets are calculated, it fixed some problems where sprites would be in the wrong place in certain DMODs - Added info to programmer_readme.txt about how to set the Windows version to build git-svn-id: svn://rtsoft.com/rtsvn/projects/RTDink@1476 353e56fe-9613-0410-8469-b96ad8e6f29c --- programmer_readme.txt | 5 + script/win_installer/readme.txt | 6 +- source/App.cpp | 27 +++- source/GUI/QuickTipMenu.cpp | 2 +- source/dink/dink.cpp | 218 +++++++++++++++++++++++++++----- 5 files changed, 217 insertions(+), 41 deletions(-) diff --git a/programmer_readme.txt b/programmer_readme.txt index 7c86253..3f2bfab 100644 --- a/programmer_readme.txt +++ b/programmer_readme.txt @@ -6,9 +6,14 @@ Dink Smallwood HD * Move the RTDink directory checkout to a sub directory of your proton dir. (it works exactly like a proton example - you can still svn update/commit like normal, svn allows you to move around dirs like that) * Sign up at fmod.com and download FMod Studio for Windows. Unzip to \shared\win\fmodstudio, so you should have a proton\shared\win\fmodstudio\api dir, etc. * Install Visual Studio 2017 (Community version works fine and is free) and open RTDink\windows_vs2017\iPhoneRTDink.sln +* By default, Proton SDK's main.cpp is setup to compile for iPhone most likely. Assuming you'd rather not have an iPhone build, search the project for "//WORK: Change device emulation here" and right under that, + change it from string desiredVideoMode = "iPhone Landscape"; or whatever it was to "string desiredVideoMode = "Windows"; instead. (this is where you can emulate many devices and sizes) * Set the profile to "Release GL" and "Win32". (or "Debug GL" is ok too) Compile. If it worked, you should have a dink.exe created in DinkHD/bin. * Install DinkHD from rtsoft.com. (media is not svn, so this is a way to get it..) Overwrite its dink.exe with your new one. It should run! + + + Use the "Debug GL" or "Release GL" solution configuations. --- Have a bugfix or patch?! Please send it over to Seth! Please note that any submission (code, media, translations, ect) must be 100% compatible with the license as listed in dinkhd_license.txt diff --git a/script/win_installer/readme.txt b/script/win_installer/readme.txt index 20a4578..0b63cef 100644 --- a/script/win_installer/readme.txt +++ b/script/win_installer/readme.txt @@ -5,6 +5,8 @@ Requires OpenGL, if you have any problems running this, try installing the lates To change screen size, drag the window borders around. (Hold shift while dragging to toggle aspect-ratio lock) To toggle a psuedo full screen mode, click Full Screen Toggle in the options. (Or hit Alt-Enter) +NOTE: Quick saves might give a "Can't load old version" error if the data format has changed. However, normal Dink saves (using save machines, etc) will always work. + ------------- BETA VERSION ----------------- This is a beta version which means it probably has bugs and isn't ready for general consumption. However, it means you've been recruited to help us make it better! @@ -53,4 +55,6 @@ www.rtsoft.com * (Windows) Input URL input area gets focus by default when installing a DMOD by URL * (bugfix) Can no longer tap F8 during a game load to load a save state too early which can freeze the game * (bugfix) Fixed issue where 32 bit tilebitmaps would go wonky when reloading the surface -* Default color under status bar is now black, fixes issue when transparent colors are used in the stats area, random garbage would show through \ No newline at end of file +* Default color under status bar is now black, fixes issue when transparent colors are used in the stats area, random garbage would show through +* (windows) Version # is now shown in title bar +* (bugfix) Fixed some issues with how default offsets are calculated, it fixed some problems where sprites would be in the wrong place in certain DMODs \ No newline at end of file diff --git a/source/App.cpp b/source/App.cpp index 262e7ea..4911c04 100644 --- a/source/App.cpp +++ b/source/App.cpp @@ -144,7 +144,24 @@ App * GetApp() return g_pApp; } -const char * GetAppName() {return "Dink Smallwood HD";}; +const char * GetAppName() +{ + +#ifdef WINAPI + + if (GetApp()) + { + static char name[64]; + sprintf(name, "Dink Smallwood HD %s", GetApp()->GetVersionString().c_str()); + return name; + } +#endif + + return "Dink Smallwood HD"; + + + +}; App::App() @@ -706,10 +723,10 @@ void App::OnScreenSizeChange() } #ifdef WINAPI - GetApp()->GetVar("fullscreen")->Set(uint32(g_bIsFullScreen)); - GetApp()->GetVar("videox")->Set(uint32(GetPrimaryGLX())); - GetApp()->GetVar("videoy")->Set(uint32(GetPrimaryGLY())); -#endif + GetApp()->GetVar("fullscreen")->Set(uint32(g_bIsFullScreen)); + GetApp()->GetVar("videox")->Set(uint32(GetPrimaryGLX())); + GetApp()->GetVar("videoy")->Set(uint32(GetPrimaryGLY())); +#endif } diff --git a/source/GUI/QuickTipMenu.cpp b/source/GUI/QuickTipMenu.cpp index 8ad44a2..7d52d70 100644 --- a/source/GUI/QuickTipMenu.cpp +++ b/source/GUI/QuickTipMenu.cpp @@ -51,7 +51,7 @@ Entity * CreateQuickTipFirstTimeOnly(Entity *pParentEnt, string tipFileName, boo #ifdef _DEBUG //cheat to always show quicktips - GetApp()->GetShared()->DeleteVarsStartingWith("tip_"); //for testing + //GetApp()->GetShared()->DeleteVarsStartingWith("tip_"); //for testing #endif if (GetApp()->GetShared()->GetVarIfExists(key)) diff --git a/source/dink/dink.cpp b/source/dink/dink.cpp index 557d3eb..9c1f3e1 100644 --- a/source/dink/dink.cpp +++ b/source/dink/dink.cpp @@ -16,7 +16,7 @@ bool pre_figure_out(const char *line, int load_seq, bool bLoadSpriteOnly); #define C_DINK_SCREEN_TRANSITION_TIME_MS 400 -const float SAVE_FORMAT_VERSION = 1.8f; +const float SAVE_FORMAT_VERSION = 1.9f; const int C_DINK_FADE_TIME_MS = 300; const float G_TRANSITION_SCALE_TRICK = 1.01f; @@ -1576,45 +1576,93 @@ if (fName == "ds-cr-01.bmp") { #ifdef _DEBUG - if (seq == 180 && oo == 3) + if (seq == 9) { //LogMsg("Woah nelly"); } + + if (seq == 453) + { + // LogMsg("Found seq %d", 453); + } + #endif //set the default offset stuff - - if ( (oo > 1) && g_dglos.g_seq[seq].m_bIsAnim) //yes, it should be a &, but it breaks old dmods + //if ((oo > 1) & g_dglos.g_seq[seq].m_bIsAnim) //yes, it should be a &&, but it breaks old dmods + + if ( (oo > 1) & (g_dglos.g_seq[seq].m_bIsAnim)) //COMPATIBILITY WARNING: I fixed this, but do old mods depend on it being wrong? { -// g_dglos.g_picInfo[picIndex].yoffset = g_dglos.g_picInfo[g_dglos.g_seq[seq].s+1].yoffset; -// g_dglos.g_picInfo[picIndex].xoffset = g_dglos.g_picInfo[g_dglos.g_seq[seq].s+1].xoffset; - g_dglos.g_picInfo[picIndex].yoffset = yoffset; - g_dglos.g_picInfo[picIndex].xoffset = xoffset; + //g_dglos.g_picInfo[picIndex].yoffset = g_dglos.g_seq[seq].m_yoffset; + //g_dglos.g_picInfo[picIndex].xoffset = g_dglos.g_seq[seq].m_xoffset; + - } else - { if (yoffset > 0) g_dglos.g_picInfo[picIndex].yoffset = yoffset; else { - g_dglos.g_picInfo[picIndex].yoffset = (g_dglos.g_picInfo[picIndex].box.bottom - + g_dglos.g_picInfo[picIndex].yoffset = (g_dglos.g_picInfo[picIndex].box.bottom - (g_dglos.g_picInfo[picIndex].box.bottom / 4)) - (g_dglos.g_picInfo[picIndex].box.bottom / 30); } if (xoffset > 0) g_dglos.g_picInfo[picIndex].xoffset = xoffset; else { - g_dglos.g_picInfo[picIndex].xoffset = (g_dglos.g_picInfo[picIndex].box.right - + g_dglos.g_picInfo[picIndex].xoffset = (g_dglos.g_picInfo[picIndex].box.right - (g_dglos.g_picInfo[picIndex].box.right / 2)) + (g_dglos.g_picInfo[picIndex].box.right / 6); } - if (oo == 1 && g_dglos.g_seq[seq].m_bIsAnim) + g_dglos.g_seq[seq].m_xoffset = g_dglos.g_picInfo[picIndex].xoffset; + g_dglos.g_seq[seq].m_yoffset = g_dglos.g_picInfo[picIndex].yoffset; + + + //make to the first frame of the anim? + //g_dglos.g_picInfo[picIndex].yoffset = g_dglos.g_picInfo[g_dglos.g_seq[seq].s+1].yoffset; + //g_dglos.g_picInfo[picIndex].xoffset = g_dglos.g_picInfo[g_dglos.g_seq[seq].s+1].xoffset; + + //i'm not too sure about this... + //save it to this seq's settings + //g_dglos.g_seq[seq].m_xoffset = g_dglos.g_picInfo[picIndex].xoffset; + //g_dglos.g_seq[seq].m_yoffset = g_dglos.g_picInfo[picIndex].yoffset; + +// g_dglos.g_picInfo[picIndex].yoffset = yoffset; + // g_dglos.g_picInfo[picIndex].xoffset = xoffset; + + } else + { + + /* + if (!g_dglos.g_seq[seq].m_bIsAnim) { - //save it to this seq's settings + g_dglos.g_picInfo[picIndex].yoffset = yoffset; + g_dglos.g_picInfo[picIndex].xoffset = xoffset; + g_dglos.g_seq[seq].m_xoffset = g_dglos.g_picInfo[picIndex].xoffset; g_dglos.g_seq[seq].m_yoffset = g_dglos.g_picInfo[picIndex].yoffset; + } + else + */ + { + if (yoffset > 0) + g_dglos.g_picInfo[picIndex].yoffset = yoffset; else + { + g_dglos.g_picInfo[picIndex].yoffset = (g_dglos.g_picInfo[picIndex].box.bottom - + (g_dglos.g_picInfo[picIndex].box.bottom / 4)) - (g_dglos.g_picInfo[picIndex].box.bottom / 30); + } + + if (xoffset > 0) + g_dglos.g_picInfo[picIndex].xoffset = xoffset; else + { + g_dglos.g_picInfo[picIndex].xoffset = (g_dglos.g_picInfo[picIndex].box.right - + (g_dglos.g_picInfo[picIndex].box.right / 2)) + (g_dglos.g_picInfo[picIndex].box.right / 6); + } + } + + } + + } if (!g_dglos.g_picInfo[picIndex].m_bCustomSettingsApplied) @@ -1678,11 +1726,15 @@ bool load_sprites(char org[512], int seq, int speed, int xoffset, int yoffset, r #ifdef _DEBUG - if (seq == 424) + if (seq == 35) { - LogMsg("Loading status bar"); + //LogMsg("Loading seq %d", seq); } + + #endif + + char hold[5]; ToLowerCase(org); @@ -1750,6 +1802,12 @@ bool load_sprites(char org[512], int seq, int speed, int xoffset, int yoffset, r { if (oo < 10) strcpy(hold, "0"); else strcpy(hold,""); +#ifdef _DEBUG + if (seq == 35 && oo == 22) + { + // LogMsg("Loading seq %d frame %d", seq, oo); + } +#endif if (reader.DoesFileExist(fNameBase+string(hold)+toString(oo)+".bmp")) { g_dglos.g_curPicIndex++; @@ -1785,6 +1843,16 @@ bool load_sprites(char org[512], int seq, int speed, int xoffset, int yoffset, r for (int oo = 1; oo <= C_MAX_SPRITE_FRAMES; oo++) { + //LogMsg("Loading seq %d, oo is %d", seq, oo); + +#ifdef _DEBUG + if (seq == 35 && oo == 22) + { + LogMsg("Gotcha"); + } + +#endif + if (LoadSpriteSingleFrame(fNameBase, seq, oo, g_dglos.g_curPicIndex, transType, &reader, hardbox, xoffset, yoffset, false)) { g_dglos.g_curPicIndex++; @@ -1843,7 +1911,7 @@ void ReadFromLoadSequenceString(char ev[15][100] ) #ifdef _DEBUG - if (seqID == 452) + if (seqID == 35) { LogMsg("Found seq %d", seqID); } @@ -1928,6 +1996,58 @@ void ReadFromLoadSequenceString(char ev[15][100] ) g_dglos.g_seq[seqID].m_hardbox.right = atol(ev[9]); g_dglos.g_seq[seqID].m_hardbox.bottom = atol(ev[10]); + /* + if (g_dglos.g_seq[seqID].m_bIsAnim) + { + //let's set some default offsets and hardboxes for this + + if (ev[5][0] == 0) + { + //guess on the offset. This should match the guess elsewhere but I'm too lazy to put it in a function + g_dglos.g_seq[seqID].m_xoffset = (g_dglos.g_picInfo[picIndex].box.bottom - + (g_dglos.g_picInfo[picIndex].box.bottom / 4)) - (g_dglos.g_picInfo[picIndex].box.bottom / 30); + } + + if (ev[6][0] == 0) + { + //guess on the offset. This should match the guess elsewhere but I'm too lazy to put it in a function + g_dglos.g_seq[seqID].m_yoffset = g_dglos.g_picInfo[picIndex].xoffset = (g_dglos.g_picInfo[picIndex].box.right - + (g_dglos.g_picInfo[picIndex].box.right / 2)) + (g_dglos.g_picInfo[picIndex].box.right / 6); + } + + + //ok, setup main offsets, lets build the hard block + /* + if (hardbox.right > 0) + { + //forced setting + g_dglos.g_picInfo[picIndex].hardbox.left = hardbox.left; + g_dglos.g_picInfo[picIndex].hardbox.right = hardbox.right; + } + else + { + //guess setting + work = g_dglos.g_picInfo[picIndex].box.right / 4; + g_dglos.g_picInfo[picIndex].hardbox.left -= work; + g_dglos.g_picInfo[picIndex].hardbox.right += work; + } + + if (hardbox.bottom > 0) + { + g_dglos.g_picInfo[picIndex].hardbox.top = hardbox.top; + g_dglos.g_picInfo[picIndex].hardbox.bottom = hardbox.bottom; + } + else + { + work = g_dglos.g_picInfo[picIndex].box.bottom / 10; + g_dglos.g_picInfo[picIndex].hardbox.top -= work; + g_dglos.g_picInfo[picIndex].hardbox.bottom += work; + } + */ + + + + #ifdef _DEBUG //LogMsg("Hardbox: %s", PrintRect(hardbox).c_str()); #endif @@ -1977,12 +2097,20 @@ bool figure_out(const char *line, int load_seq) int seqID = atol(ev[3]); +#ifdef _DEBUG + if (seqID == 453) + { + // LogMsg("Loading sand stuff"); + } + +#endif if (!g_dglos.g_seq[seqID].active) { ReadFromLoadSequenceString(ev); + //first time, actually init it bReturn = load_sprites(g_dglos.g_seq[seqID].m_fileName,seqID,g_dglos.g_seq[seqID].m_speed,g_dglos.g_seq[seqID].m_xoffset,g_dglos.g_seq[seqID].m_yoffset, g_dglos.g_seq[seqID].m_hardbox , g_dglos.g_seq[seqID].m_transType, g_dglos.g_seq[seqID].m_bLeftAlign, true); @@ -2036,6 +2164,14 @@ bool pre_figure_out(const char *line, int load_seq, bool bLoadSpriteOnly) { int seqID = atol(ev[3]); +#ifdef _DEBUG + if (seqID == 453) + { + + // LogMsg("Loading sand stuff prefigure out"); + } + +#endif ReadFromLoadSequenceString(ev); bReturn = load_sprites(g_dglos.g_seq[seqID].m_fileName,seqID,g_dglos.g_seq[seqID].m_speed,g_dglos.g_seq[seqID].m_xoffset,g_dglos.g_seq[seqID].m_yoffset, g_dglos.g_seq[seqID].m_hardbox @@ -2069,6 +2205,7 @@ bool pre_figure_out(const char *line, int load_seq, bool bLoadSpriteOnly) g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].m_bCustomSettingsApplied = true; + /* if (myframe == 1 && g_dglos.g_seq[myseq].m_bIsAnim) { //set these to be the default for the whole anim.. (replacing that idata crap from the old source) @@ -2079,6 +2216,7 @@ bool pre_figure_out(const char *line, int load_seq, bool bLoadSpriteOnly) g_dglos.g_seq[myseq].m_yoffset = g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].yoffset; //g_dglos.g_seq[myseq].m_hardbox = g_dglos.g_picInfo[g_dglos.g_seq[myseq].frame[myframe]].hardbox; } + */ } @@ -2642,7 +2780,7 @@ int add_sprite_dumb(int x1, int y, int brain,int pseq, int pframe,int size ) { #ifdef _DEBUG - + if (pseq == 180) { LogMsg("wtf!"); @@ -2694,6 +2832,7 @@ int add_sprite_dumb(int x1, int y, int brain,int pseq, int pframe,int size ) g_sprite[x].strength = 0; g_sprite[x].damage = 0; g_sprite[x].defense = 0; + if ( g_customSpriteMap[x] == NULL ) { @@ -4850,14 +4989,19 @@ void draw_sprite_game(LPDIRECTDRAWSURFACE lpdest,int h) } #endif -#ifdef _DEBUG - if (g_sprite[h].pseq == 66 && g_sprite[h].pframe == 1) - { - //LogMsg("Drawing it"); + +#ifdef _DEBUG + if (g_sprite[h].pseq == 35 && g_sprite[h].pframe == 22) + { + //LogMsg("Drawing the rock"); + } + + if (g_sprite[h].pseq == 453) + { + // LogMsg("Drawing a title"); } #endif - if (get_box(h, &dstRect, &srcRect)) { @@ -4933,6 +5077,9 @@ void draw_sprite_game(LPDIRECTDRAWSURFACE lpdest,int h) } } + + + ddrval = lpdest->Blt(&dstRect, g_pSpriteSurface[getpic(h)], &srcRect , DDBLT_KEYSRC ,&ddbltfx ); @@ -5353,13 +5500,7 @@ void place_sprites_game(bool bBackgroundOnly ) //Msg("Ok, rank[%d] is %d.",oo,rank[oo]); j = rank[oo]; -#ifdef _DEBUG - if (g_dglos.g_smallMap.sprite[j].seq == 66 && g_dglos.g_smallMap.sprite[j].frame == 1) - { - //LogMsg("Drawing it"); - } -#endif if (g_dglos.g_smallMap.sprite[j].active == true) if ( ( g_dglos.g_smallMap.sprite[j].vision == 0) || (g_dglos.g_smallMap.sprite[j].vision == *pvision)) @@ -5429,7 +5570,6 @@ void place_sprites_game(bool bBackgroundOnly ) g_sprite[sprite].hard = g_dglos.g_smallMap.sprite[j].hard; g_sprite[sprite].timer = g_dglos.g_smallMap.sprite[j].timer; g_sprite[sprite].que = g_dglos.g_smallMap.sprite[j].que; - g_sprite[sprite].sp_index = j; g_sprite[sprite].alt = g_dglos.g_smallMap.sprite[j].alt; g_sprite[sprite].base_die = g_dglos.g_smallMap.sprite[j].base_die; g_sprite[sprite].strength = g_dglos.g_smallMap.sprite[j].strength; @@ -5441,6 +5581,15 @@ void place_sprites_game(bool bBackgroundOnly ) g_sprite[sprite].hitpoints = g_dglos.g_smallMap.sprite[j].hitpoints; g_sprite[sprite].sound = g_dglos.g_smallMap.sprite[j].sound; check_sprite_status_full(sprite); + +#ifdef _DEBUG + if (g_dglos.g_smallMap.sprite[j].seq == 35 && g_dglos.g_smallMap.sprite[j].frame == 22) + { + + LogMsg("Drawing it"); + } +#endif + if (g_dglos.g_smallMap.sprite[j].prop == 0) if (g_sprite[sprite].sound != 0) { //make looping sound @@ -15664,10 +15813,11 @@ LastWindowsTimer = GetTickCount(); //Blit from Two, which holds the base scene. // lpDDSBack->BltFast( 0, 0, lpDDSBackGround, &rcRect, DDBLTFAST_NOCOLORKEY); - - rtRect32 rcRectGameArea(g_dglo.m_gameArea.left, g_dglo.m_gameArea.top, g_dglo.m_gameArea.right, g_dglo.m_gameArea.bottom); - lpDDSBack->BltFast(g_dglo.m_gameArea.left, g_dglo.m_gameArea.top, lpDDSBackGround, - &rcRectGameArea, DDBLTFAST_NOCOLORKEY); + { + rtRect32 rcRectGameArea(g_dglo.m_gameArea.left, g_dglo.m_gameArea.top, g_dglo.m_gameArea.right, g_dglo.m_gameArea.bottom); + lpDDSBack->BltFast(g_dglo.m_gameArea.left, g_dglo.m_gameArea.top, lpDDSBackGround, + &rcRectGameArea, DDBLTFAST_NOCOLORKEY); + } g_dglo.m_bgSpriteMan.Render(lpDDSBack); //blit sprites that have been shoved into the bg, too slow to actually add them, so we fake it until the screen is rebuilt