]> git.jsancho.org Git - lugaru.git/blobdiff - Source/GameTick.cpp
Added GPL license and headers.
[lugaru.git] / Source / GameTick.cpp
index 73b815b13347470d79770d83d2ad737d84df4fa0..aa14e093b0808330bcd313bfb66792f86e88c2d4 100644 (file)
@@ -1,4 +1,32 @@
+/*
+Copyright (C) 2003, 2010 - Wolfire Games
+
+This file is part of Lugaru.
+
+Lugaru is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+*/
+
+#if PLATFORM_UNIX
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#else
 #include <direct.h>
+#endif
+
 #include <ctime>
 #include "Game.h"
 
@@ -196,7 +224,7 @@ extern float accountcampaigntime[10];
 extern int accountcampaignchoicesmade[10];
 extern int accountcampaignchoices[10][5000];
 /********************> Tick() <*****/
-extern FSOUND_STREAM * strm[10];
+extern FSOUND_STREAM * strm[20];
 extern "C"     void PlaySoundEx(int channel, FSOUND_SAMPLE *sptr, FSOUND_DSPUNIT *dsp, signed char startpaused);
 extern "C" void PlayStreamEx(int chan, FSOUND_STREAM *sptr, FSOUND_DSPUNIT *dsp, signed char startpaused);
 
@@ -208,7 +236,7 @@ void Screenshot     (void)
        struct  tm *tme = localtime(&t);
        sprintf(temp, "Screenshots\\Screenshot_%04d_%02d_%02d--%02d_%02d_%02d.png", tme->tm_year + 1900, tme->tm_mon + 1, tme->tm_mday, tme->tm_hour, tme->tm_min, tme->tm_sec);
 
-       mkdir("Screenshots");
+       mkdir("Screenshots", S_IRWXU);
        ScreenShot(temp/*"Screenshots\\Screenshot.png"*/);
 
        /*FSSpec                                MAC_file;
@@ -624,10 +652,10 @@ void      Game::Setenvironment(int which)
                FSOUND_Sample_Free(samp[footstepsound2]);
                FSOUND_Sample_Free(samp[footstepsound3]);
                FSOUND_Sample_Free(samp[footstepsound4]);
-               samp[footstepsound] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow1.ogg", FSOUND_HW3D, 0);
-               samp[footstepsound2] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow2.ogg", FSOUND_HW3D, 0);
-               samp[footstepsound3] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepstone1.ogg", FSOUND_HW3D, 0);
-               samp[footstepsound4] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepstone2.ogg", FSOUND_HW3D, 0);
+               samp[footstepsound] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow1.ogg", FSOUND_HW3D, 0, 0);
+               samp[footstepsound2] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow2.ogg", FSOUND_HW3D, 0, 0);
+               samp[footstepsound3] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepstone1.ogg", FSOUND_HW3D, 0, 0);
+               samp[footstepsound4] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepstone2.ogg", FSOUND_HW3D, 0, 0);
                FSOUND_Sample_SetMinMaxDistance(samp[footstepsound], 4.0f, 1000.0f);    
                FSOUND_Sample_SetMinMaxDistance(samp[footstepsound2], 4.0f, 1000.0f);   
                FSOUND_Sample_SetMinMaxDistance(samp[footstepsound3], 4.0f, 1000.0f);   
@@ -678,10 +706,10 @@ void      Game::Setenvironment(int which)
                FSOUND_Sample_Free(samp[footstepsound2]);
                FSOUND_Sample_Free(samp[footstepsound3]);
                FSOUND_Sample_Free(samp[footstepsound4]);
-               samp[footstepsound] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow1.ogg", FSOUND_HW3D, 0);
-               samp[footstepsound2] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow2.ogg", FSOUND_HW3D, 0);
-               samp[footstepsound3] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow1.ogg", FSOUND_HW3D, 0);
-               samp[footstepsound4] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow2.ogg", FSOUND_HW3D, 0);
+               samp[footstepsound] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow1.ogg", FSOUND_HW3D, 0, 0);
+               samp[footstepsound2] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow2.ogg", FSOUND_HW3D, 0, 0);
+               samp[footstepsound3] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow1.ogg", FSOUND_HW3D, 0, 0);
+               samp[footstepsound4] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepsnow2.ogg", FSOUND_HW3D, 0, 0);
                FSOUND_Sample_SetMinMaxDistance(samp[footstepsound], 4.0f, 1000.0f);    
                FSOUND_Sample_SetMinMaxDistance(samp[footstepsound2], 4.0f, 1000.0f);   
                FSOUND_Sample_SetMinMaxDistance(samp[footstepsound3], 4.0f, 1000.0f);   
@@ -729,10 +757,10 @@ void      Game::Setenvironment(int which)
                FSOUND_Sample_Free(samp[footstepsound2]);
                FSOUND_Sample_Free(samp[footstepsound3]);
                FSOUND_Sample_Free(samp[footstepsound4]);
-               samp[footstepsound] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepgrass1.ogg", FSOUND_HW3D, 0);
-               samp[footstepsound2] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepgrass2.ogg", FSOUND_HW3D, 0);
-               samp[footstepsound3] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepstone1.ogg", FSOUND_HW3D, 0);
-               samp[footstepsound4] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepstone2.ogg", FSOUND_HW3D, 0);
+               samp[footstepsound] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepgrass1.ogg", FSOUND_HW3D, 0, 0);
+               samp[footstepsound2] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepgrass2.ogg", FSOUND_HW3D, 0, 0);
+               samp[footstepsound3] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepstone1.ogg", FSOUND_HW3D, 0, 0);
+               samp[footstepsound4] = FSOUND_Sample_Load(FSOUND_FREE, ":Data:Sounds:footstepstone2.ogg", FSOUND_HW3D, 0, 0);
                FSOUND_Sample_SetMinMaxDistance(samp[footstepsound], 4.0f, 1000.0f);    
                FSOUND_Sample_SetMinMaxDistance(samp[footstepsound2], 4.0f, 1000.0f);   
                FSOUND_Sample_SetMinMaxDistance(samp[footstepsound3], 4.0f, 1000.0f);   
@@ -1837,13 +1865,14 @@ void    Game::Tick()
 
                                if(newdetail>2)newdetail=detail;
                                if(newdetail<0)newdetail=detail;
+#if !USE_SDL  // we'll take anything that works.
                                if(newscreenwidth>3000)newscreenwidth=screenwidth;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
                                if(newscreenheight>3000)newscreenheight=screenheight;
+#endif
+                               if(newscreenwidth<0)newscreenwidth=screenwidth;
                                if(newscreenheight<0)newscreenheight=screenheight;
 
-                               //ofstream opstream(":Data:config.txt"); 
-                               ofstream opstream("./Data/config.txt"); 
+                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
                                opstream << "Screenwidth:\n";
                                opstream << newscreenwidth;
                                opstream << "\nScreenheight:\n";
@@ -2100,6 +2129,52 @@ void     Game::Tick()
                                FSOUND_Sample_SetMinMaxDistance(samp[firestartsound], 8.0f, 2000.0f);   
                        }
                        if(Button()&&!oldbutton&&selected==0){
+                               #if USE_SDL
+                               extern SDL_Rect **resolutions;
+                               bool isCustomResolution = true;
+                               bool found = false;
+                               for (int i = 0; (!found) && (resolutions[i]); i++)
+                               {
+                                       if ((resolutions[i]->w == screenwidth) && (resolutions[i]->h == screenwidth))
+                                               isCustomResolution = false;
+
+                                       if ((resolutions[i]->w == newscreenwidth) && (resolutions[i]->h == newscreenheight))
+                                       {
+                                               i++;
+                                               if (resolutions[i] != NULL)
+                                               {
+                                                       newscreenwidth = (int) resolutions[i]->w;
+                                                       newscreenheight = (int) resolutions[i]->h;
+                                               }
+                                               else if (isCustomResolution)
+                                               {
+                                                       if ((screenwidth == newscreenwidth) && (screenheight == newscreenheight))
+                                                       {
+                                                               newscreenwidth = (int) resolutions[0]->w;
+                                                               newscreenheight = (int) resolutions[0]->h;
+                                                       }
+                                                       else
+                                                       {
+                                                               newscreenwidth = screenwidth;
+                                                               newscreenheight = screenheight;
+                                                       }
+                                               }
+                                               else
+                                               {
+                                                       newscreenwidth = (int) resolutions[0]->w;
+                                                       newscreenheight = (int) resolutions[0]->h;
+                                               }
+                                               found = true;
+                                       }
+                               }
+
+                               if (!found)
+                               {
+                                       newscreenwidth = (int) resolutions[0]->w;
+                                       newscreenheight = (int) resolutions[0]->h;
+                               }
+
+                               #else
                                int whichres;
                                whichres=-1;
                                if(newscreenwidth==640&&newscreenheight==480)whichres=0;
@@ -2110,8 +2185,9 @@ void      Game::Tick()
                                if(newscreenwidth==840&&newscreenheight==524)whichres=5;
                                if(newscreenwidth==1024&&newscreenheight==640)whichres=6;
                                if(newscreenwidth==1344&&newscreenheight==840)whichres=7;
+                               if(newscreenwidth==1920&&newscreenheight==1200)whichres=8;
 
-                               if(whichres==-1||whichres==7){
+                               if(whichres==-1||whichres==8){
                                        newscreenwidth=640;
                                        newscreenheight=480;
                                }
@@ -2143,6 +2219,11 @@ void     Game::Tick()
                                        newscreenwidth=1344;
                                        newscreenheight=840;
                                }
+                               if(whichres==7){
+                                       newscreenwidth=1920;
+                                       newscreenheight=1200;
+                               }
+                               #endif
                        }
                        if(Button()&&!oldbutton&&selected==1){
                                newdetail++;
@@ -2233,14 +2314,15 @@ void    Game::Tick()
 
                                if(newdetail>2)newdetail=detail;
                                if(newdetail<0)newdetail=detail;
+#if !USE_SDL  // we'll take anything that works.
                                if(newscreenwidth>3000)newscreenwidth=screenwidth;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
                                if(newscreenheight>3000)newscreenheight=screenheight;
+#endif
+                               if(newscreenwidth<0)newscreenwidth=screenwidth;
                                if(newscreenheight<0)newscreenheight=screenheight;
 
 
-                               //ofstream opstream(":Data:config.txt"); 
-                               ofstream opstream("./Data/config.txt"); 
+                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
                                opstream << "Screenwidth:\n";
                                opstream << newscreenwidth;
                                opstream << "\nScreenheight:\n";
@@ -2980,13 +3062,14 @@ void    Game::Tick()
                        if(mainmenu==3){
                                if(newdetail>2)newdetail=detail;
                                if(newdetail<0)newdetail=detail;
+#if !USE_SDL  // we'll take anything that works.
                                if(newscreenwidth>3000)newscreenwidth=screenwidth;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
                                if(newscreenheight>3000)newscreenheight=screenheight;
+#endif
+                               if(newscreenwidth<0)newscreenwidth=screenwidth;
                                if(newscreenheight<0)newscreenheight=screenheight;
 
-                               //ofstream opstream(":Data:config.txt"); 
-                               ofstream opstream("./Data/config.txt"); 
+                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
                                opstream << "Screenwidth:\n";
                                opstream << newscreenwidth;
                                opstream << "\nScreenheight:\n";
@@ -3165,7 +3248,13 @@ void     Game::Tick()
                                                        if(displaychars[0]){
                                                                char serialstring[256];
                                                                char tempstring[256];
+                                                               #if defined(__APPLE__)
+                                                               sprintf (tempstring, "%s", registrationname);
+                                                               #elif defined(_MSC_VER) || defined(__linux__)
                                                                sprintf (tempstring, "%s-windows", registrationname);
+                                                               #else
+                                                               #error Please make sure you have the right registration key stuff here!
+                                                               #endif
                                                                long num1;
                                                                long num2;
                                                                long num3;
@@ -3202,7 +3291,7 @@ void      Game::Tick()
                                                                        if(displaytext[0][j]!=tempstring[j]&&tempstring[j]!=' '&&tempstring[j]!='\0')goodcode--;
                                                                }
 
-                                                               if(longnum==5077041556214789)goodcode=-1;
+                                                               if(longnum==LONGLONGCONST(5077041556214789))goodcode=-1;
 
                                                                if(goodcode<0)goodcode=0;
 
@@ -4511,7 +4600,7 @@ void      Game::Tick()
                                                                        }
                                                                }
 
-                                                               ifstream ipstream(mapname);
+                                                               ifstream ipstream(ConvertFileName(mapname));
                                                                ipstream.ignore(256,':');
                                                                ipstream >> numdialogueboxes[numdialogues];
                                                                for(i=0;i<numdialogueboxes[numdialogues];i++){
@@ -4604,7 +4693,7 @@ void      Game::Tick()
                                                                        }
                                                                }
 
-                                                               ifstream ipstream(mapname);
+                                                               ifstream ipstream(ConvertFileName(mapname));
                                                                ipstream.ignore(256,':');
                                                                ipstream >> numdialogueboxes[whichdi];
                                                                for(i=0;i<numdialogueboxes[whichdi];i++){
@@ -5619,13 +5708,14 @@ void    Game::Tick()
                        if(mainmenu==3){
                                if(newdetail>2)newdetail=detail;
                                if(newdetail<0)newdetail=detail;
+#if !USE_SDL  // we'll take anything that works.
                                if(newscreenwidth>3000)newscreenwidth=screenwidth;
-                               if(newscreenwidth<0)newscreenwidth=screenwidth;
                                if(newscreenheight>3000)newscreenheight=screenheight;
+#endif
+                               if(newscreenwidth<0)newscreenwidth=screenwidth;
                                if(newscreenheight<0)newscreenheight=screenheight;
 
-                               //ofstream opstream(":Data:config.txt"); 
-                               ofstream opstream("./Data/config.txt"); 
+                               ofstream opstream(ConvertFileName(":Data:config.txt", "w"));
                                opstream << "Screenwidth:\n";
                                opstream << newscreenwidth;
                                opstream << "\nScreenheight:\n";
@@ -10759,6 +10849,7 @@ void    Game::Tick()
                                                                        oldtemp2=temp2;
                                                                        if(tutorialstage>=51)
                                                                                if(findDistancefast(&temp,&player[0].coords)>=findDistancefast(&temp,&temp2)-1||findDistancefast(&temp3,&player[0].coords)<4){
+                                                   FSOUND_StopSound(FSOUND_ALL);  // hack...OpenAL renderer isn't stopping music after tutorial goes to level menu...
                                                                                        FSOUND_SetFrequency(FSOUND_ALL, 0.001);
 
                                                                                        PlayStreamEx( stream_music3, strm[stream_music3], NULL, TRUE);
@@ -11339,8 +11430,7 @@ void    Game::TickOnceAfter(){
 
                                                                startbonustotal=0;
 
-                                                               //              ifstream ipstream(":Data:Campaigns:main.txt");  
-                                                               ifstream ipstream("./Data/Campaigns/main.txt"); 
+                                                               ifstream ipstream(ConvertFileName(":Data:Campaigns:main.txt"));
                                                                //campaignnumlevels=0;
                                                                //accountcampaignchoicesmade[accountactive]=0;
                                                                ipstream.ignore(256,':');