X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FGameTick.cpp;h=4db82ea26746c1978af1173e8f33bfa5f9bb336b;hb=97989f58ab13c64fbe05e629d2b2a024a2c3cfa4;hp=e062d66eff2228332ce028e00edf10d87597f6d7;hpb=2db542f6927807e964ddb7a5962e2f5cd14e3123;p=lugaru.git diff --git a/Source/GameTick.cpp b/Source/GameTick.cpp index e062d66..4db82ea 100644 --- a/Source/GameTick.cpp +++ b/Source/GameTick.cpp @@ -3,20 +3,18 @@ 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. +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, +Lugaru 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. +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. +along with Lugaru. If not, see . */ // Enable full math definitions @@ -42,8 +40,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "Animation.h" #include "Awards.h" #include "Menu.h" +#include "ConsoleCmds.h" #include +#include using namespace std; using namespace Game; @@ -100,7 +100,6 @@ extern float usermousesensitivity; extern bool ismotionblur; extern bool showdamagebar; // (des)activate the damage bar extern bool decals; -extern float tintr, tintg, tintb; extern bool skyboxtexture; extern float skyboxr; extern float skyboxg; @@ -125,7 +124,7 @@ extern float damagedealt; extern int maptype; extern int editoractive; extern int editorpathtype; -extern TGAImageRec texture; +extern ImageRec texture; extern float hostiletime; @@ -146,12 +145,7 @@ extern bool winfreeze; extern bool campaign; - - -void Loadlevel(int which); -void Loadlevel(const char *name); - - +extern void toggleFullscreen(); class CampaignLevel { @@ -229,7 +223,6 @@ public: } }; -int indemo = 0; bool won = false; int entername = 0; vector campaignlevels; @@ -246,9 +239,7 @@ float musicvolume[4] = {}; float oldmusicvolume[4] = {}; int musicselected = 0; - - -static const char *rabbitskin[] = { +const char *rabbitskin[] = { ":Data:Textures:Fur3.jpg", ":Data:Textures:Fur.jpg", ":Data:Textures:Fur2.jpg", @@ -261,43 +252,17 @@ static const char *rabbitskin[] = { ":Data:Textures:WB2.jpg" }; -static const char *wolfskin[] = { +const char *wolfskin[] = { ":Data:Textures:Wolf.jpg", ":Data:Textures:Darkwolf.jpg", ":Data:Textures:Snowwolf.jpg" }; +const char **creatureskin[] = {rabbitskin, wolfskin}; + #define STATIC_ASSERT(x) extern int s_a_dummy[2 * (!!(x)) - 1]; STATIC_ASSERT (rabbittype == 0 && wolftype == 1) -static const char **creatureskin[] = {rabbitskin, wolfskin}; - -/* Return true if PFX is a prefix of STR (case-insensitive). */ -static bool stripfx(const char *str, const char *pfx) -{ - return !strncasecmp(str, pfx, strlen(pfx)); -} - -static const char *cmd_names[] = { -#define DECLARE_COMMAND(cmd) #cmd, -#include "ConsoleCmds.h" -#undef DECLARE_COMMAND -}; - -typedef void (*console_handler)(const char *args); - -#define DECLARE_COMMAND(cmd) static void ch_##cmd(const char *args); -#include "ConsoleCmds.h" -#undef DECLARE_COMMAND - -static console_handler cmd_handlers[] = { -#define DECLARE_COMMAND(cmd) ch_##cmd, -#include "ConsoleCmds.h" -#undef DECLARE_COMMAND -}; - - - // utility functions // TODO: this is slightly incorrect @@ -336,7 +301,7 @@ inline float stepTowardf(float from, float to, float by) return from + by; } -void playdialogueboxsound() +void Game::playdialogueboxsound() { XYZ temppos; temppos = Person::players[participantfocus[whichdialogue][indialogue]]->coords; @@ -418,14 +383,11 @@ void playdialogueboxsound() // ================================================================ -bool AddClothes(const char *fileName, GLubyte *array) +bool Game::AddClothes(const char *fileName, GLubyte *array) { LOGFUNC; //Load Image - unsigned char fileNamep[256]; - CopyCStringToPascal(fileName, fileNamep); - bool opened; - opened = upload_image( fileNamep , 1); + bool opened = upload_image(fileName); float alphanum; //Is it valid? @@ -447,7 +409,6 @@ bool AddClothes(const char *fileName, GLubyte *array) alphanum = 255; else if ((i + 1) % 4 == 0) alphanum = texture.data[i]; - //alphanum/=2; if ((i + 1) % 4 || bytesPerPixel == 3) { if ((i % 4) == 0) texture.data[i] *= tintr; @@ -459,244 +420,18 @@ bool AddClothes(const char *fileName, GLubyte *array) tempnum++; } } - } else + return 1; + } else { return 0; - return 1; -} - - - -static void ch_quit(const char *args) -{ - tryquit = 1; -} - -static void ch_map(const char *args) -{ - Loadlevel(args); - whichlevel = -2; - campaign = 0; -} - -static void ch_save(const char *args) -{ - char buf[64]; - snprintf(buf, 63, ":Data:Maps:%s", args); - - int mapvers = 12; - - FILE *tfile; - tfile = fopen( ConvertFileName(buf), "wb" ); - fpackf(tfile, "Bi", mapvers); - fpackf(tfile, "Bi", maptype); - fpackf(tfile, "Bi", hostile); - fpackf(tfile, "Bf Bf", viewdistance, fadestart); - fpackf(tfile, "Bb Bf Bf Bf", skyboxtexture, skyboxr, skyboxg, skyboxb); - fpackf(tfile, "Bf Bf Bf", skyboxlightr, skyboxlightg, skyboxlightb); - fpackf(tfile, "Bf Bf Bf Bf Bf Bi", Person::players[0]->coords.x, Person::players[0]->coords.y, Person::players[0]->coords.z, - Person::players[0]->yaw, Person::players[0]->targetyaw, Person::players[0]->num_weapons); - if (Person::players[0]->num_weapons > 0 && Person::players[0]->num_weapons < 5) - for (int j = 0; j < Person::players[0]->num_weapons; j++) - fpackf(tfile, "Bi", weapons[Person::players[0]->weaponids[j]].getType()); - - fpackf(tfile, "Bf Bf Bf", Person::players[0]->armorhead, Person::players[0]->armorhigh, Person::players[0]->armorlow); - fpackf(tfile, "Bf Bf Bf", Person::players[0]->protectionhead, Person::players[0]->protectionhigh, Person::players[0]->protectionlow); - fpackf(tfile, "Bf Bf Bf", Person::players[0]->metalhead, Person::players[0]->metalhigh, Person::players[0]->metallow); - fpackf(tfile, "Bf Bf", Person::players[0]->power, Person::players[0]->speedmult); - - fpackf(tfile, "Bi", Person::players[0]->numclothes); - - fpackf(tfile, "Bi Bi", Person::players[0]->whichskin, Person::players[0]->creature); - - fpackf(tfile, "Bi", numdialogues); - - for (int k = 0; k < numdialogues; k++) { - fpackf(tfile, "Bi", numdialogueboxes[k]); - fpackf(tfile, "Bi", dialoguetype[k]); - for (int l = 0; l < 10; l++) { - fpackf(tfile, "Bf Bf Bf", participantlocation[k][l].x, participantlocation[k][l].y, participantlocation[k][l].z); - fpackf(tfile, "Bf", participantyaw[k][l]); - } - for (int l = 0; l < numdialogueboxes[k]; l++) { - fpackf(tfile, "Bi", dialogueboxlocation[k][l]); - fpackf(tfile, "Bf", dialogueboxcolor[k][l][0]); - fpackf(tfile, "Bf", dialogueboxcolor[k][l][1]); - fpackf(tfile, "Bf", dialogueboxcolor[k][l][2]); - fpackf(tfile, "Bi", dialogueboxsound[k][l]); - - int templength = strlen(dialoguetext[k][l]); - fpackf(tfile, "Bi", (templength)); - for (int m = 0; m < templength; m++) { - fpackf(tfile, "Bb", dialoguetext[k][l][m]); - if (dialoguetext[k][l][m] == '\0') - break; - } - - templength = strlen(dialoguename[k][l]); - fpackf(tfile, "Bi", templength); - for (int m = 0; m < templength; m++) { - fpackf(tfile, "Bb", dialoguename[k][l][m]); - if (dialoguename[k][l][m] == '\0') - break; - } - - fpackf(tfile, "Bf Bf Bf", dialoguecamera[k][l].x, dialoguecamera[k][l].y, dialoguecamera[k][l].z); - fpackf(tfile, "Bi", participantfocus[k][l]); - fpackf(tfile, "Bi", participantaction[k][l]); - - for (int m = 0; m < 10; m++) - fpackf(tfile, "Bf Bf Bf", participantfacing[k][l][m].x, participantfacing[k][l][m].y, participantfacing[k][l][m].z); - - fpackf(tfile, "Bf Bf", dialoguecamerayaw[k][l], dialoguecamerapitch[k][l]); - } - } - - for (int k = 0; k < Person::players[0]->numclothes; k++) { - int templength = strlen(Person::players[0]->clothes[k]); - fpackf(tfile, "Bi", templength); - for (int l = 0; l < templength; l++) - fpackf(tfile, "Bb", Person::players[0]->clothes[k][l]); - fpackf(tfile, "Bf Bf Bf", Person::players[0]->clothestintr[k], Person::players[0]->clothestintg[k], Person::players[0]->clothestintb[k]); - } - - fpackf(tfile, "Bi", environment); - - fpackf(tfile, "Bi", objects.numobjects); - - for (int k = 0; k < objects.numobjects; k++) - fpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", objects.type[k], objects.yaw[k], objects.pitch[k], - objects.position[k].x, objects.position[k].y, objects.position[k].z, objects.scale[k]); - - fpackf(tfile, "Bi", numhotspots); - for (int i = 0; i < numhotspots; i++) { - fpackf(tfile, "Bi Bf Bf Bf Bf", hotspottype[i], hotspotsize[i], hotspot[i].x, hotspot[i].y, hotspot[i].z); - int templength = strlen(hotspottext[i]); - fpackf(tfile, "Bi", templength); - for (int l = 0; l < templength; l++) - fpackf(tfile, "Bb", hotspottext[i][l]); } - - fpackf(tfile, "Bi", Person::players.size()); - if (Person::players.size() > maxplayers) { - cout << "Warning: this level contains more players than allowed" << endl; - } - for (int j = 1; j < Person::players.size(); j++) { - fpackf(tfile, "Bi Bi Bf Bf Bf Bi Bi Bf Bb Bf", Person::players[j]->whichskin, Person::players[j]->creature, - Person::players[j]->coords.x, Person::players[j]->coords.y, Person::players[j]->coords.z, - Person::players[j]->num_weapons, Person::players[j]->howactive, Person::players[j]->scale, Person::players[j]->immobile, Person::players[j]->yaw); - if (Person::players[j]->num_weapons < 5) - for (int k = 0; k < Person::players[j]->num_weapons; k++) - fpackf(tfile, "Bi", weapons[Person::players[j]->weaponids[k]].getType()); - if (Person::players[j]->numwaypoints < 30) { - fpackf(tfile, "Bi", Person::players[j]->numwaypoints); - for (int k = 0; k < Person::players[j]->numwaypoints; k++) { - fpackf(tfile, "Bf", Person::players[j]->waypoints[k].x); - fpackf(tfile, "Bf", Person::players[j]->waypoints[k].y); - fpackf(tfile, "Bf", Person::players[j]->waypoints[k].z); - fpackf(tfile, "Bi", Person::players[j]->waypointtype[k]); - } - fpackf(tfile, "Bi", Person::players[j]->waypoint); - } else { - Person::players[j]->numwaypoints = 0; - Person::players[j]->waypoint = 0; - fpackf(tfile, "Bi Bi Bi", Person::players[j]->numwaypoints, Person::players[j]->waypoint, Person::players[j]->waypoint); - } - - fpackf(tfile, "Bf Bf Bf", Person::players[j]->armorhead, Person::players[j]->armorhigh, Person::players[j]->armorlow); - fpackf(tfile, "Bf Bf Bf", Person::players[j]->protectionhead, Person::players[j]->protectionhigh, Person::players[j]->protectionlow); - fpackf(tfile, "Bf Bf Bf", Person::players[j]->metalhead, Person::players[j]->metalhigh, Person::players[j]->metallow); - fpackf(tfile, "Bf Bf", Person::players[j]->power, Person::players[j]->speedmult); - - float headprop, bodyprop, armprop, legprop; - if (Person::players[j]->creature == wolftype) { - headprop = Person::players[j]->proportionhead.x / 1.1; - bodyprop = Person::players[j]->proportionbody.x / 1.1; - armprop = Person::players[j]->proportionarms.x / 1.1; - legprop = Person::players[j]->proportionlegs.x / 1.1; - } else if (Person::players[j]->creature == rabbittype) { - headprop = Person::players[j]->proportionhead.x / 1.2; - bodyprop = Person::players[j]->proportionbody.x / 1.05; - armprop = Person::players[j]->proportionarms.x / 1.00; - legprop = Person::players[j]->proportionlegs.x / 1.1; - } - - fpackf(tfile, "Bf Bf Bf Bf", headprop, bodyprop, armprop, legprop); - - fpackf(tfile, "Bi", Person::players[j]->numclothes); - if (Person::players[j]->numclothes) - for (int k = 0; k < Person::players[j]->numclothes; k++) { - int templength; - templength = strlen(Person::players[j]->clothes[k]); - fpackf(tfile, "Bi", templength); - for (int l = 0; l < templength; l++) - fpackf(tfile, "Bb", Person::players[j]->clothes[k][l]); - fpackf(tfile, "Bf Bf Bf", Person::players[j]->clothestintr[k], Person::players[j]->clothestintg[k], Person::players[j]->clothestintb[k]); - } - } - - fpackf(tfile, "Bi", numpathpoints); - for (int j = 0; j < numpathpoints; j++) { - fpackf(tfile, "Bf Bf Bf Bi", pathpoint[j].x, pathpoint[j].y, pathpoint[j].z, numpathpointconnect[j]); - for (int k = 0; k < numpathpointconnect[j]; k++) - fpackf(tfile, "Bi", pathpointconnect[j][k]); - } - - fpackf(tfile, "Bf Bf Bf Bf", mapcenter.x, mapcenter.y, mapcenter.z, mapradius); - - fclose(tfile); -} - -static void ch_cellar(const char *args) -{ - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:Furdarko.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); -} - -static void ch_tint(const char *args) -{ - sscanf(args, "%f%f%f", &tintr, &tintg, &tintb); -} - -static void ch_tintr(const char *args) -{ - tintr = atof(args); -} - -static void ch_tintg(const char *args) -{ - tintg = atof(args); } -static void ch_tintb(const char *args) -{ - tintb = atof(args); -} - -static void ch_speed(const char *args) -{ - Person::players[0]->speedmult = atof(args); -} - -static void ch_strength(const char *args) -{ - Person::players[0]->power = atof(args); -} - -static void ch_power(const char *args) -{ - Person::players[0]->power = atof(args); -} - -static void ch_size(const char *args) -{ - Person::players[0]->scale = atof(args) * .2; -} - -static int findClosestPlayer() +int Game::findClosestPlayer() { int closest = -1; float closestdist = std::numeric_limits::max(); - for (int i = 1; i < Person::players.size(); i++) { + for (unsigned i = 1; i < Person::players.size(); i++) { float distance = distsq(&Person::players[i]->coords, &Person::players[0]->coords); if (distance < closestdist) { closestdist = distance; @@ -721,588 +456,6 @@ static int findClosestObject() return closest; } -static void ch_sizenear(const char *args) -{ - int closest = findClosestPlayer(); - if (closest >= 0) - Person::players[closest]->scale = atof(args) * .2; -} - -static void set_proportion(int pnum, const char *args) -{ - float headprop, bodyprop, armprop, legprop; - - sscanf(args, "%f%f%f%f", &headprop, &bodyprop, &armprop, &legprop); - - if (Person::players[pnum]->creature == wolftype) { - Person::players[pnum]->proportionhead = 1.1 * headprop; - Person::players[pnum]->proportionbody = 1.1 * bodyprop; - Person::players[pnum]->proportionarms = 1.1 * armprop; - Person::players[pnum]->proportionlegs = 1.1 * legprop; - } else if (Person::players[pnum]->creature == rabbittype) { - Person::players[pnum]->proportionhead = 1.2 * headprop; - Person::players[pnum]->proportionbody = 1.05 * bodyprop; - Person::players[pnum]->proportionarms = 1.00 * armprop; - Person::players[pnum]->proportionlegs = 1.1 * legprop; - Person::players[pnum]->proportionlegs.y = 1.05 * legprop; - } -} - -static void ch_proportion(const char *args) -{ - set_proportion(0, args); -} - -static void ch_proportionnear(const char *args) -{ - int closest = findClosestPlayer(); - if (closest >= 0) - set_proportion(closest, args); -} - -static void set_protection(int pnum, const char *args) -{ - float head, high, low; - sscanf(args, "%f%f%f", &head, &high, &low); - - Person::players[pnum]->protectionhead = head; - Person::players[pnum]->protectionhigh = high; - Person::players[pnum]->protectionlow = low; -} - -static void ch_protection(const char *args) -{ - set_protection(0, args); -} - -static void ch_protectionnear(const char *args) -{ - int closest = findClosestPlayer(); - if (closest >= 0) - set_protection(closest, args); -} - -static void set_armor(int pnum, const char *args) -{ - float head, high, low; - sscanf(args, "%f%f%f", &head, &high, &low); - - Person::players[pnum]->armorhead = head; - Person::players[pnum]->armorhigh = high; - Person::players[pnum]->armorlow = low; -} - -static void ch_armor(const char *args) -{ - set_armor(0, args); -} - -static void ch_armornear(const char *args) -{ - int closest = findClosestPlayer(); - if (closest >= 0) - set_armor(closest, args); -} - -static void ch_protectionreset(const char *args) -{ - set_protection(0, "1 1 1"); - set_armor(0, "1 1 1"); -} - -static void set_metal(int pnum, const char *args) -{ - float head, high, low; - sscanf(args, "%f%f%f", &head, &high, &low); - - Person::players[pnum]->metalhead = head; - Person::players[pnum]->metalhigh = high; - Person::players[pnum]->metallow = low; -} - -static void ch_metal(const char *args) -{ - set_metal(0, args); -} - -static void set_noclothes(int pnum, const char *args) -{ - Person::players[pnum]->numclothes = 0; - Person::players[pnum]->skeleton.drawmodel.textureptr.load( - creatureskin[Person::players[pnum]->creature][Person::players[pnum]->whichskin], 1, - &Person::players[pnum]->skeleton.skinText[0], &Person::players[pnum]->skeleton.skinsize); -} - -static void ch_noclothes(const char *args) -{ - set_noclothes(0, args); -} - -static void ch_noclothesnear(const char *args) -{ - int closest = findClosestPlayer(); - if (closest >= 0) - set_noclothes(closest, args); -} - - -static void set_clothes(int pnum, const char *args) -{ - char buf[64]; - snprintf(buf, 63, ":Data:Textures:%s.png", args); - - if (!AddClothes(buf, &Person::players[pnum]->skeleton.skinText[pnum])) - return; - - Person::players[pnum]->DoMipmaps(); - strcpy(Person::players[pnum]->clothes[Person::players[pnum]->numclothes], buf); - Person::players[pnum]->clothestintr[Person::players[pnum]->numclothes] = tintr; - Person::players[pnum]->clothestintg[Person::players[pnum]->numclothes] = tintg; - Person::players[pnum]->clothestintb[Person::players[pnum]->numclothes] = tintb; - Person::players[pnum]->numclothes++; -} - -static void ch_clothes(const char *args) -{ - set_clothes(0, args); -} - -static void ch_clothesnear(const char *args) -{ - int closest = findClosestPlayer(); - if (closest >= 0) - set_clothes(closest, args); -} - -static void ch_belt(const char *args) -{ - Person::players[0]->skeleton.clothes = !Person::players[0]->skeleton.clothes; -} - - -static void ch_cellophane(const char *args) -{ - cellophane = !cellophane; - float mul = (cellophane ? 0 : 1); - - for (auto player : Person::players) { - player->proportionhead.z = player->proportionhead.x * mul; - player->proportionbody.z = player->proportionbody.x * mul; - player->proportionarms.z = player->proportionarms.x * mul; - player->proportionlegs.z = player->proportionlegs.x * mul; - } -} - -static void ch_funnybunny(const char *args) -{ - Person::players[0]->skeleton.id = 0; - Person::players[0]->skeleton.Load(":Data:Skeleton:Basic Figure", ":Data:Skeleton:Basic Figurelow", - ":Data:Skeleton:Rabbitbelt", ":Data:Models:Body.solid", - ":Data:Models:Body2.solid", ":Data:Models:Body3.solid", - ":Data:Models:Body4.solid", ":Data:Models:Body5.solid", - ":Data:Models:Body6.solid", ":Data:Models:Body7.solid", - ":Data:Models:Bodylow.solid", ":Data:Models:Belt.solid", 1); - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); - Person::players[0]->creature = rabbittype; - Person::players[0]->scale = .2; - Person::players[0]->headless = 0; - Person::players[0]->damagetolerance = 200; - set_proportion(0, "1 1 1 1"); -} - -static void ch_wolfie(const char *args) -{ - Person::players[0]->skeleton.id = 0; - Person::players[0]->skeleton.Load(":Data:Skeleton:Basic Figure Wolf", ":Data:Skeleton:Basic Figure Wolf Low", - ":Data:Skeleton:Rabbitbelt", ":Data:Models:Wolf.solid", - ":Data:Models:Wolf2.solid", ":Data:Models:Wolf3.solid", - ":Data:Models:Wolf4.solid", ":Data:Models:Wolf5.solid", - ":Data:Models:Wolf6.solid", ":Data:Models:Wolf7.solid", - ":Data:Models:Wolflow.solid", ":Data:Models:Belt.solid", 0); - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); - Person::players[0]->creature = wolftype; - Person::players[0]->damagetolerance = 300; - set_proportion(0, "1 1 1 1"); -} - -static void ch_wolfieisgod(const char *args) -{ - ch_wolfie(args); -} - -static void ch_wolf(const char *args) -{ - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); -} - -static void ch_snowwolf(const char *args) -{ - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:SnowWolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); -} - -static void ch_darkwolf(const char *args) -{ - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:DarkWolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); -} - -static void ch_lizardwolf(const char *args) -{ - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:Lizardwolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); -} - -static void ch_white(const char *args) -{ - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:fur.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); -} - -static void ch_brown(const char *args) -{ - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:fur3.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); -} - -static void ch_black(const char *args) -{ - Person::players[0]->skeleton.drawmodel.textureptr.load(":Data:Textures:fur2.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); -} - -static void ch_sizemin(const char *args) -{ - for (int i = 1; i < Person::players.size(); i++) - if (Person::players[i]->scale < 0.8 * 0.2) - Person::players[i]->scale = 0.8 * 0.2; -} - -static void ch_tutorial(const char *args) -{ - tutoriallevel = atoi(args); -} - -static void ch_hostile(const char *args) -{ - hostile = atoi(args); -} - -static void ch_indemo(const char *args) -{ - indemo = 1; - hotspot[numhotspots] = Person::players[0]->coords; - hotspotsize[numhotspots] = 0; - hotspottype[numhotspots] = -111; - strcpy(hotspottext[numhotspots], "mapname"); - numhotspots++; -} - -static void ch_notindemo(const char *args) -{ - indemo = 0; - numhotspots--; -} - -static void ch_type(const char *args) -{ - int n = sizeof(editortypenames) / sizeof(editortypenames[0]); - for (int i = 0; i < n; i++) - if (stripfx(args, editortypenames[i])) { - editoractive = i; - break; - } -} - -static void ch_path(const char *args) -{ - int n = sizeof(pathtypenames) / sizeof(pathtypenames[0]); - for (int i = 0; i < n; i++) - if (stripfx(args, pathtypenames[i])) { - editorpathtype = i; - break; - } -} - -static void ch_hs(const char *args) -{ - hotspot[numhotspots] = Person::players[0]->coords; - - float size; - int type, shift; - sscanf(args, "%f%d %n", &size, &type, &shift); - - hotspotsize[numhotspots] = size; - hotspottype[numhotspots] = type; - - strcpy(hotspottext[numhotspots], args + shift); - strcat(hotspottext[numhotspots], "\n"); - - numhotspots++; -} - -static void ch_dialogue(const char *args) -{ - int dlg; - char buf1[32], buf2[64]; - - sscanf(args, "%d %31s", &dlg, buf1); - snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1); - - dialoguetype[numdialogues] = dlg; - - memset(dialoguetext[numdialogues], 0, sizeof(dialoguetext[numdialogues])); - memset(dialoguename[numdialogues], 0, sizeof(dialoguename[numdialogues])); - - ifstream ipstream(ConvertFileName(buf2)); - ipstream.ignore(256, ':'); - ipstream >> numdialogueboxes[numdialogues]; - for (int i = 0; i < numdialogueboxes[numdialogues]; i++) { - ipstream.ignore(256, ':'); - ipstream.ignore(256, ':'); - ipstream.ignore(256, ' '); - ipstream >> dialogueboxlocation[numdialogues][i]; - ipstream.ignore(256, ':'); - ipstream >> dialogueboxcolor[numdialogues][i][0]; - ipstream >> dialogueboxcolor[numdialogues][i][1]; - ipstream >> dialogueboxcolor[numdialogues][i][2]; - ipstream.ignore(256, ':'); - ipstream.getline(dialoguename[numdialogues][i], 64); - ipstream.ignore(256, ':'); - ipstream.ignore(256, ' '); - ipstream.getline(dialoguetext[numdialogues][i], 128); - for (int j = 0; j < 128; j++) { - if (dialoguetext[numdialogues][i][j] == '\\') - dialoguetext[numdialogues][i][j] = '\n'; - } - ipstream.ignore(256, ':'); - ipstream >> dialogueboxsound[numdialogues][i]; - } - - for (int i = 0; i < numdialogueboxes[numdialogues]; i++) { - for (int j = 0; j < Person::players.size(); j++) { - participantfacing[numdialogues][i][j] = Person::players[j]->facing; - } - } - ipstream.close(); - - directing = 1; - indialogue = 0; - whichdialogue = numdialogues; - - numdialogues++; -} - -static void ch_fixdialogue(const char *args) -{ - char buf1[32], buf2[64]; - int whichdi; - - sscanf(args, "%d %31s", &whichdi, buf1); - snprintf(buf2, 63, ":Data:Dialogues:%s.txt", buf1); - - memset(dialoguetext[whichdi], 0, sizeof(dialoguetext[whichdi])); - memset(dialoguename[whichdi], 0, sizeof(dialoguename[whichdi])); - - ifstream ipstream(ConvertFileName(buf2)); - ipstream.ignore(256, ':'); - ipstream >> numdialogueboxes[whichdi]; - for (int i = 0; i < numdialogueboxes[whichdi]; i++) { - ipstream.ignore(256, ':'); - ipstream.ignore(256, ':'); - ipstream.ignore(256, ' '); - ipstream >> dialogueboxlocation[whichdi][i]; - ipstream.ignore(256, ':'); - ipstream >> dialogueboxcolor[whichdi][i][0]; - ipstream >> dialogueboxcolor[whichdi][i][1]; - ipstream >> dialogueboxcolor[whichdi][i][2]; - ipstream.ignore(256, ':'); - ipstream.getline(dialoguename[whichdi][i], 64); - ipstream.ignore(256, ':'); - ipstream.ignore(256, ' '); - ipstream.getline(dialoguetext[whichdi][i], 128); - for (int j = 0; j < 128; j++) { - if (dialoguetext[whichdi][i][j] == '\\') - dialoguetext[whichdi][i][j] = '\n'; - } - ipstream.ignore(256, ':'); - ipstream >> dialogueboxsound[whichdi][i]; - } - - ipstream.close(); -} - -static void ch_fixtype(const char *args) -{ - int dlg; - sscanf(args, "%d", &dlg); - dialoguetype[0] = dlg; -} - -static void ch_fixrotation(const char *args) -{ - participantyaw[whichdialogue][participantfocus[whichdialogue][indialogue]] = Person::players[participantfocus[whichdialogue][indialogue]]->yaw; -} - -static void ch_ddialogue(const char *args) -{ - if (numdialogues) - numdialogues--; -} - -static void ch_dhs(const char *args) -{ - if (numhotspots) - numhotspots--; -} - -static void ch_immobile(const char *args) -{ - Person::players[0]->immobile = 1; -} - -static void ch_allimmobile(const char *args) -{ - for (int i = 1; i < Person::players.size(); i++) - Person::players[i]->immobile = 1; -} - -static void ch_mobile(const char *args) -{ - Person::players[0]->immobile = 0; -} - -static void ch_default(const char *args) -{ - Person::players[0]->armorhead = 1; - Person::players[0]->armorhigh = 1; - Person::players[0]->armorlow = 1; - Person::players[0]->protectionhead = 1; - Person::players[0]->protectionhigh = 1; - Person::players[0]->protectionlow = 1; - Person::players[0]->metalhead = 1; - Person::players[0]->metalhigh = 1; - Person::players[0]->metallow = 1; - Person::players[0]->power = 1; - Person::players[0]->speedmult = 1; - Person::players[0]->scale = 1; - - if (Person::players[0]->creature == wolftype) { - Person::players[0]->proportionhead = 1.1; - Person::players[0]->proportionbody = 1.1; - Person::players[0]->proportionarms = 1.1; - Person::players[0]->proportionlegs = 1.1; - } else if (Person::players[0]->creature == rabbittype) { - Person::players[0]->proportionhead = 1.2; - Person::players[0]->proportionbody = 1.05; - Person::players[0]->proportionarms = 1.00; - Person::players[0]->proportionlegs = 1.1; - Person::players[0]->proportionlegs.y = 1.05; - } - - Person::players[0]->numclothes = 0; - Person::players[0]->skeleton.drawmodel.textureptr.load( - creatureskin[Person::players[0]->creature][Person::players[0]->whichskin], 1, - &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize); - - editoractive = typeactive; - Person::players[0]->immobile = 0; -} - -static void ch_play(const char *args) -{ - int dlg; - sscanf(args, "%d", &dlg); - whichdialogue = dlg; - - if (whichdialogue >= numdialogues) - return; - - for (int i = 0; i < numdialogueboxes[whichdialogue]; i++) { - Person::players[participantfocus[whichdialogue][i]]->coords = participantlocation[whichdialogue][participantfocus[whichdialogue][i]]; - Person::players[participantfocus[whichdialogue][i]]->yaw = participantyaw[whichdialogue][participantfocus[whichdialogue][i]]; - Person::players[participantfocus[whichdialogue][i]]->targetyaw = participantyaw[whichdialogue][participantfocus[whichdialogue][i]]; - Person::players[participantfocus[whichdialogue][i]]->velocity = 0; - Person::players[participantfocus[whichdialogue][i]]->animTarget = Person::players[participantfocus[whichdialogue][i]]->getIdle(); - Person::players[participantfocus[whichdialogue][i]]->frameTarget = 0; - } - - directing = 0; - indialogue = 0; - - playdialogueboxsound(); -} - -static void ch_mapkilleveryone(const char *args) -{ - maptype = mapkilleveryone; -} - -static void ch_mapkillmost(const char *args) -{ - maptype = mapkillmost; -} - -static void ch_mapkillsomeone(const char *args) -{ - maptype = mapkillsomeone; -} - -static void ch_mapgosomewhere(const char *args) -{ - maptype = mapgosomewhere; -} - -static void ch_viewdistance(const char *args) -{ - viewdistance = atof(args) * 100; -} - -static void ch_fadestart(const char *args) -{ - fadestart = atof(args); -} - -static void ch_slomo(const char *args) -{ - slomospeed = atof(args); - slomo = !slomo; - slomodelay = 1000; -} - -static void ch_slofreq(const char *args) -{ - slomofreq = atof(args); -} - -static void ch_skytint(const char *args) -{ - sscanf(args, "%f%f%f", &skyboxr, &skyboxg, &skyboxb); - - skyboxlightr = skyboxr; - skyboxlightg = skyboxg; - skyboxlightb = skyboxb; - - SetUpLighting(); - - terrain.DoShadows(); - objects.DoShadows(); -} - -static void ch_skylight(const char *args) -{ - sscanf(args, "%f%f%f", &skyboxlightr, &skyboxlightg, &skyboxlightb); - - SetUpLighting(); - - terrain.DoShadows(); - objects.DoShadows(); -} - -static void ch_skybox(const char *args) -{ - skyboxtexture = !skyboxtexture; - - SetUpLighting(); - - terrain.DoShadows(); - objects.DoShadows(); -} - static void cmd_dispatch(const string cmd) { int i, n_cmds = sizeof(cmd_names) / sizeof(cmd_names[0]); @@ -1317,21 +470,20 @@ static void cmd_dispatch(const string cmd) } /********************> Tick() <*****/ -extern bool save_image(const char * fname); +extern bool save_screenshot(const char * fname); void Screenshot (void) { - char temp[1024]; + char filename[1024]; time_t t = time(NULL); 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); + sprintf(filename, "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); #if defined(_WIN32) mkdir("Screenshots"); -#else - mkdir("Screenshots", S_IRWXU); #endif - save_image(temp); + save_screenshot(filename); } void Game::SetUpLighting() @@ -1429,8 +581,6 @@ int Game::checkcollide(XYZ startpoint, XYZ endpoint) } } - //if(terrain.lineTerrain(startpoint,endpoint,&colpoint)!=-1)return 1000; - return -1; } @@ -1669,7 +819,7 @@ vector ListCampaigns() return campaignNames; } -void Loadlevel(int which) +void Game::Loadlevel(int which) { stealthloading = 0; whichlevel = which; @@ -1685,8 +835,9 @@ void Loadlevel(int which) Loadlevel("mapsave"); } -void Loadlevel(const char *name) +void Game::Loadlevel(const char *name) { + int indemo; // FIXME this should be removed int templength; float lamefloat; static const char *pfx = ":Data:Maps:"; @@ -1730,9 +881,6 @@ void Loadlevel(const char *name) int mapvers; FILE *tfile; - //~ char* buff=getcwd(NULL,0); - //~ cout << buff << " " << FixedFN << endl; - //~ free(buff); tfile = fopen( FixedFN, "rb" ); if (tfile) { pause_sound(stream_firesound); @@ -2147,7 +1295,7 @@ void Loadlevel(const char *name) fclose(tfile); - for (int i = 0; i < Person::players.size(); i++) { + for (unsigned i = 0; i < Person::players.size(); i++) { if (visibleloading) LoadingScreen(); Person::players[i]->burnt = 0; @@ -3055,7 +2203,7 @@ void doDebugKeys() int closest = -1; float closestdist = std::numeric_limits::max(); - for (int i = 1; i < Person::players.size(); i++) { + for (unsigned i = 1; i < Person::players.size(); i++) { float distance = distsq(&Person::players[i]->coords, &Person::players[0]->coords); if (!Person::players[i]->headless) if (distance < closestdist) { @@ -3180,8 +2328,8 @@ void doDebugKeys() } XYZ temppos; - for (int j = 0; j < Person::players.size(); j++) { - if (j != closest) { + for (unsigned j = 0; j < Person::players.size(); j++) { + if (int(j) != closest) { if (distsq(&Person::players[j]->coords, &Person::players[closest]->coords) < 25) { Person::players[j]->DoDamage((25 - distsq(&Person::players[j]->coords, &Person::players[closest]->coords)) * 60); if (Person::players[j]->skeleton.free == 2) @@ -3223,10 +2371,7 @@ void doDebugKeys() } if (Input::isKeyPressed(SDL_SCANCODE_N) && !Input::isKeyDown(SDL_SCANCODE_LCTRL)) { - //if(!Person::players[0]->skeleton.free)Person::players[0]->damage+=500; Person::players[0]->RagDoll(0); - //Person::players[0]->spurt=1; - //Person::players[0]->DoDamage(1000); emit_sound_at(whooshsound, Person::players[0]->coords, 128.); } @@ -3277,8 +2422,6 @@ void doDebugKeys() } if (Input::isKeyPressed(SDL_SCANCODE_M) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) { - //drawmode++; - //if(drawmode>2)drawmode=0; if (objects.numobjects < max_objects - 1) { XYZ boxcoords; boxcoords.x = Person::players[0]->coords.x; @@ -3577,8 +2720,8 @@ void doDebugKeys() void doJumpReversals() { - for (int k = 0; k < Person::players.size(); k++) - for (int i = k; i < Person::players.size(); i++) { + for (unsigned k = 0; k < Person::players.size(); k++) + for (unsigned i = k; i < Person::players.size(); i++) { if (i == k) continue; if ( Person::players[k]->skeleton.free == 0 && @@ -3587,8 +2730,8 @@ void doJumpReversals() Person::players[k]->animTarget == jumpupanim) && (Person::players[i]->aitype == playercontrolled || Person::players[k]->aitype == playercontrolled) && - (Person::players[i]->aitype == attacktypecutoff && Person::players[i]->stunned <= 0 || - Person::players[k]->aitype == attacktypecutoff && Person::players[k]->stunned <= 0)) { + ((Person::players[i]->aitype == attacktypecutoff && Person::players[i]->stunned <= 0) || + (Person::players[k]->aitype == attacktypecutoff && Person::players[k]->stunned <= 0))) { if ( distsq(&Person::players[i]->coords, &Person::players[k]->coords) < 10 * sq((Person::players[i]->scale + Person::players[k]->scale) * 2.5) && distsqflat(&Person::players[i]->coords, &Person::players[k]->coords) < 2 * sq((Person::players[i]->scale + Person::players[k]->scale) * 2.5)) { //TODO: refactor two huge similar ifs @@ -3597,7 +2740,7 @@ void doJumpReversals() Person::players[k]->animTarget != getupfromfrontanim && animation[Person::players[k]->animTarget].height == middleheight && normaldotproduct(Person::players[i]->velocity, Person::players[k]->coords - Person::players[i]->coords) < 0 && - (Person::players[k]->aitype == playercontrolled && Person::players[k]->attackkeydown || + ((Person::players[k]->aitype == playercontrolled && Person::players[k]->attackkeydown) || Person::players[k]->aitype != playercontrolled)) { Person::players[i]->victim = Person::players[k]; Person::players[i]->velocity = 0; @@ -3678,7 +2821,7 @@ void doJumpReversals() void doAerialAcrobatics() { static XYZ facing, flatfacing; - for (int k = 0; k < Person::players.size(); k++) { + for (unsigned k = 0; k < Person::players.size(); k++) { Person::players[k]->turnspeed = 500; if ((Person::players[k]->isRun() && @@ -3713,7 +2856,6 @@ void doAerialAcrobatics() Person::players[k]->yaw = stepTowardf(Person::players[k]->yaw, Person::players[k]->targetyaw, multiplier * Person::players[k]->turnspeed * 4); } - /*if(Person::players[k]->aitype!=passivetype||(distsq(&Person::players[k]->coords,&viewer)DoStuff(); if (Person::players[k]->immobile && k != 0) Person::players[k]->coords = Person::players[k]->realoldcoords; @@ -3889,7 +3031,7 @@ void doAerialAcrobatics() } } - if (tempcollide && (/*Person::players[k]->jumptogglekeydown*/1 == 1 || Person::players[k]->aitype != playercontrolled)) + if (tempcollide) for (int l = 0; l < terrain.patchobjectnum[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz]; l++) { int i = terrain.patchobjects[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz][l]; lowpoint = Person::players[k]->coords; @@ -3971,7 +3113,6 @@ void doAerialAcrobatics() if (j <= 6 || j <= 25 && Person::players[k]->animTarget == jumpdownanim) break; if (Person::players[k]->animTarget == jumpupanim || Person::players[k]->animTarget == jumpdownanim) { - lowpoint = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[k], 0); lowpoint = Person::players[k]->coords; lowpoint.y += (float)j / 13; lowpointtarget = lowpoint + facing * 1.3; @@ -4079,7 +3220,7 @@ void doAttacks() if (Input::isKeyDown(attackkey) && !oldattackkey && !Person::players[0]->backkeydown) { - for (int k = 0; k < Person::players.size(); k++) { + for (unsigned k = 0; k < Person::players.size(); k++) { if ((Person::players[k]->animTarget == swordslashanim || Person::players[k]->animTarget == staffhitanim || Person::players[k]->animTarget == staffspinhitanim) && @@ -4092,7 +3233,7 @@ void doAttacks() if (!hostile || indialogue != -1) Person::players[0]->attackkeydown = 0; - for (int k = 0; k < Person::players.size(); k++) { + for (unsigned k = 0; k < Person::players.size(); k++) { if (indialogue != -1) Person::players[k]->attackkeydown = 0; if (Person::players[k]->animTarget != rabbitrunninganim && Person::players[k]->animTarget != wolfrunninganim) { @@ -4110,7 +3251,7 @@ void doAttacks() if (Person::players[k]->jumppower <= 1) { Person::players[k]->jumppower -= 2; } else { - for (int i = 0; i < Person::players.size(); i++) { + for (unsigned i = 0; i < Person::players.size(); i++) { if (i == k) continue; if (Person::players[i]->animTarget == swordslashanim || @@ -4149,7 +3290,7 @@ void doAttacks() //normal attacks (?) Person::players[k]->hasvictim = 0; if (Person::players.size() > 1) - for (int i = 0; i < Person::players.size(); i++) { + for (unsigned i = 0; i < Person::players.size(); i++) { if (i == k || !(k == 0 || i == 0)) continue; if (!Person::players[k]->hasvictim) @@ -4420,7 +3561,7 @@ void doAttacks() } const bool hasstaff = attackweapon == staff; if (k == 0 && Person::players.size() > 1) - for (int i = 0; i < Person::players.size(); i++) { + for (unsigned i = 0; i < Person::players.size(); i++) { if (i == k) continue; if ((playerrealattackkeydown || Person::players[i]->dead || !hasstaff) && @@ -4545,7 +3686,7 @@ void doAttacks() } if (!Person::players[k]->hasvictim) { //find victim - for (int i = 0; i < Person::players.size(); i++) { + for (unsigned i = 0; i < Person::players.size(); i++) { if (i == k || !(i == 0 || k == 0)) continue; if (!Person::players[i]->skeleton.free) { @@ -4608,8 +3749,8 @@ void doPlayerCollisions() static XYZ rotatetarget; static float collisionradius; if (Person::players.size() > 1) - for (int k = 0; k < Person::players.size(); k++) - for (int i = k + 1; i < Person::players.size(); i++) { + for (unsigned k = 0; k < Person::players.size(); k++) + for (unsigned i = k + 1; i < Person::players.size(); i++) { //neither player is part of a reversal if ((animation[Person::players[i]->animTarget].attack != reversed && animation[Person::players[i]->animTarget].attack != reversal && @@ -4807,7 +3948,7 @@ void doPlayerCollisions() } } -void doAI(int i) +void doAI(unsigned i) { static bool connected; if (Person::players[i]->aitype != playercontrolled && indialogue == -1) { @@ -4967,7 +4108,7 @@ void doAI(int i) if (Person::players[i]->losupdatedelay < 0 && !editorenabled && Person::players[i]->occluded < 2) { Person::players[i]->losupdatedelay = .2; - for (int j = 0; j < Person::players.size(); j++) + for (unsigned j = 0; j < Person::players.size(); j++) if (j == 0 || Person::players[j]->skeleton.free || Person::players[j]->aitype != passivetype) if (abs(Random() % 2) || animation[Person::players[j]->animTarget].height != lowheight || j != 0) if (distsq(&Person::players[i]->coords, &Person::players[j]->coords) < 400) @@ -5088,7 +4229,7 @@ void doAI(int i) //wolf smell if (Person::players[i]->creature == wolftype) { XYZ windsmell; - for (int j = 0; j < Person::players.size(); j++) { + for (unsigned j = 0; j < Person::players.size(); j++) { if (j == 0 || (Person::players[j]->dead && Person::players[j]->bloodloss > 0)) { float smelldistance = 50; if (j == 0 && Person::players[j]->num_weapons > 0) { @@ -5111,7 +4252,7 @@ void doAI(int i) if (Person::players[i]->howactive < typesleeping && Person::players[i]->losupdatedelay < 0 && !editorenabled && Person::players[i]->occluded < 2) { Person::players[i]->losupdatedelay = .2; - for (int j = 0; j < Person::players.size(); j++) { + for (unsigned j = 0; j < Person::players.size(); j++) { if (j == 0 || Person::players[j]->skeleton.free || Person::players[j]->aitype != passivetype) { if (abs(Random() % 2) || animation[Person::players[j]->animTarget].height != lowheight || j != 0) if (distsq(&Person::players[i]->coords, &Person::players[j]->coords) < 400) @@ -5301,7 +4442,7 @@ void doAI(int i) if (!Person::players[i]->ally) { int closest = -1; float closestdist = -1; - for (int k = 0; k < Person::players.size(); k++) { + for (unsigned k = 0; k < Person::players.size(); k++) { if (k != i && k != 0 && !Person::players[k]->dead && Person::players[k]->howactive < typedead1 && !Person::players[k]->skeleton.free && @@ -5401,7 +4542,7 @@ void doAI(int i) if (Person::players[i]->ally < 0) { int closest = -1; float closestdist = -1; - for (int k = 0; k < weapons.size(); k++) + for (unsigned k = 0; k < weapons.size(); k++) if (weapons[k].owner == -1) { float distance = distsq(&Person::players[i]->coords, &weapons[k].position); if (closestdist == -1 || distance < closestdist) { @@ -5488,7 +4629,7 @@ void doAI(int i) if (Person::players[0]->animTarget != rabbitkickanim && Person::players[0]->weaponactive != -1) { if (weapons[Person::players[0]->weaponids[0]].getType() == knife) { if (Person::players[i]->isIdle() || Person::players[i]->isCrouch() || Person::players[i]->isRun() || Person::players[i]->isFlip()) { - if (abs(Random() % 2 == 0)) + if (abs(Random() % 2) == 0) Person::players[i]->setAnimation(backhandspringanim); else Person::players[i]->setAnimation(rollanim); @@ -5513,7 +4654,7 @@ void doAI(int i) } //go for weapon on the ground if (Person::players[i]->wentforweapon < 3) - for (int k = 0; k < weapons.size(); k++) + for (unsigned k = 0; k < weapons.size(); k++) if (Person::players[i]->creature != wolftype) if (Person::players[i]->num_weapons == 0 && weapons[k].owner == -1 && @@ -5650,7 +4791,7 @@ void doAI(int i) Person::players[i]->isCrouch() || Person::players[i]->isRun())) { int target = -2; - for (int j = 0; j < Person::players.size(); j++) + for (unsigned j = 0; j < Person::players.size(); j++) if (j != i && !Person::players[j]->skeleton.free && Person::players[j]->hasvictim && (tutoriallevel == 1 && reversaltrain || @@ -5794,6 +4935,7 @@ void updateSettingsMenu() else sprintf (sbuf, "Resolution: %d*%d (widescreen)", (int)newscreenwidth, (int)newscreenheight); Menu::setText(0, sbuf); + Menu::setText(14, fullscreen ? "Fullscreen: On" : "Fullscreen: Off"); if (newdetail == 0) Menu::setText(1, "Detail: Low"); if (newdetail == 1) Menu::setText(1, "Detail: Medium"); if (newdetail == 2) Menu::setText(1, "Detail: High"); @@ -5874,6 +5016,7 @@ void Game::LoadMenu() break; case 3: Menu::addButton( 0, "", 10 + 20, 440); + Menu::addButton(14, "", 10 + 400, 440); Menu::addButton( 1, "", 10 + 60, 405); Menu::addButton( 2, "", 10 + 70, 370); Menu::addButton( 3, "", 10 + 20 - 1000, 335 - 1000); @@ -6009,7 +5152,7 @@ void Game::LoadMenu() } } -extern SDL_Rect **resolutions; +extern set> resolutions; void MenuTick() { @@ -6030,9 +5173,8 @@ void MenuTick() static int oldmainmenu = mainmenu; - char sbuf[256]; - if (Input::MouseClicked() && (selected >= 0)) { // handling of the left mouse clic in menus + set>::iterator newscreenresolution; switch (mainmenu) { case 1: case 2: @@ -6081,40 +5223,17 @@ void MenuTick() break; case 3: fireSound(); - bool isCustomResolution, found; switch (selected) { case 0: - isCustomResolution = true; - 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; + newscreenresolution = resolutions.find(make_pair(newscreenwidth, newscreenheight)); + /* Next one (end() + 1 is also end() so the ++ is safe even if it was not found) */ + newscreenresolution++; + if (newscreenresolution == resolutions.end()) { + /* It was the last one (or not found), go back to the beginning */ + newscreenresolution = resolutions.begin(); } + newscreenwidth = newscreenresolution->first; + newscreenheight = newscreenresolution->second; break; case 1: newdetail++; @@ -6186,6 +5305,9 @@ void MenuTick() case 13: showdamagebar = !showdamagebar; break; + case 14: + toggleFullscreen(); + break; } updateSettingsMenu(); break; @@ -6644,8 +5766,9 @@ void Game::Tick() if (talkdelay <= 0 && indialogue == -1 && animation[Person::players[0]->animTarget].height != highheight) for (int i = 0; i < numdialogues; i++) { - int realdialoguetype; + unsigned realdialoguetype; bool special; + /* FIXME - Seems like modulo done with ifs */ if (dialoguetype[i] > 49) { realdialoguetype = dialoguetype[i] - 50; special = 1; @@ -6706,7 +5829,6 @@ void Game::Tick() hotspotvisual[i] -= multiplier / 320; for (int i = 0; i < numhotspots; i++) { - //if(hotspottype[i]<=10) while (hotspotvisual[i] < 0) { hotspotsprite = 0; hotspotsprite.x = float(abs(Random() % 100000)) / 100000 * hotspotsize[i]; @@ -6881,7 +6003,7 @@ void Game::Tick() } } - for (int j = 0; j < Person::players.size(); j++) { + for (unsigned j = 0; j < Person::players.size(); j++) { participantfacing[whichdialogue][indialogue][j] = participantfacing[whichdialogue][indialogue - 1][j]; } } @@ -6969,7 +6091,7 @@ void Game::Tick() } if (dialoguetype[whichdialogue] > 49 && dialoguetype[whichdialogue] < 60) { hostile = 1; - for (int i = 1; i < Person::players.size(); i++) { + for (unsigned i = 1; i < Person::players.size(); i++) { Person::players[i]->aitype = attacktypecutoff; } } @@ -7008,11 +6130,11 @@ void Game::Tick() doJumpReversals(); - for (int k = 0; k < Person::players.size(); k++) + for (unsigned k = 0; k < Person::players.size(); k++) if (k != 0 && Person::players[k]->immobile) Person::players[k]->coords = Person::players[k]->realoldcoords; - for (int k = 0; k < Person::players.size(); k++) { + for (unsigned k = 0; k < Person::players.size(); k++) { if (!isnormal(Person::players[k]->coords.x) || !isnormal(Person::players[k]->coords.y) || !isnormal(Person::players[k]->coords.z)) { if (!isnormal(Person::players[k]->coords.x) || !isnormal(Person::players[k]->coords.y) || !isnormal(Person::players[k]->coords.z)) { Person::players[k]->DoDamage(1000); @@ -7046,7 +6168,7 @@ void Game::Tick() static bool movekey; //? - for (int i = 0; i < Person::players.size(); i++) { + for (unsigned i = 0; i < Person::players.size(); i++) { static float oldtargetyaw; if (!Person::players[i]->skeleton.free) { oldtargetyaw = Person::players[i]->targetyaw; @@ -7134,7 +6256,7 @@ void Game::Tick() } //avoid flaming players - for (int j = 0; j < Person::players.size(); j++) + for (unsigned j = 0; j < Person::players.size(); j++) if (Person::players[j]->onfire) if (distsq(&Person::players[j]->coords, &Person::players[i]->coords) < sq(0.3) * 200) if ( distsq(&Person::players[i]->coords, &Person::players[j]->coords) < @@ -7215,9 +6337,8 @@ void Game::Tick() Person::players[i]->animTarget == rollanim || Person::players[i]->animTarget == backhandspringanim || Person::players[i]->isFlip() || - Person::players[i]->isFlip() || Person::players[i]->aitype != playercontrolled)) { - for (int j = 0; j < weapons.size(); j++) { + for (unsigned j = 0; j < weapons.size(); j++) { if ((weapons[j].velocity.x == 0 && weapons[j].velocity.y == 0 && weapons[j].velocity.z == 0 || Person::players[i]->aitype == playercontrolled) && weapons[j].owner == -1 && @@ -7242,7 +6363,7 @@ void Game::Tick() Person::players[i]->aitype == playercontrolled) && weapons[j].owner == -1 || Person::players[i]->victim && - weapons[j].owner == Person::players[i]->victim->id) + weapons[j].owner == int(Person::players[i]->victim->id)) if (distsqflat(&Person::players[i]->coords, &weapons[j].position) < 2 && Person::players[i]->weaponactive == -1) if (distsq(&Person::players[i]->coords, &weapons[j].position) < 1 || Person::players[i]->victim) { if (weapons[j].getType() != staff) @@ -7270,13 +6391,13 @@ void Game::Tick() Person::players[i]->throwtogglekeydown = 1; Person::players[i]->hasvictim = 0; - for (int k = 0; k < weapons.size(); k++) { + for (unsigned k = 0; k < weapons.size(); k++) { if (Person::players[i]->weaponactive == -1) if ((weapons[k].velocity.x == 0 && weapons[k].velocity.y == 0 && weapons[k].velocity.z == 0 || Person::players[i]->aitype == playercontrolled) && weapons[k].owner == -1 || Person::players[i]->victim && - weapons[k].owner == Person::players[i]->victim->id) + weapons[k].owner == int(Person::players[i]->victim->id)) if (distsqflat(&Person::players[i]->coords, &weapons[k].position) < 3 && Person::players[i]->weaponactive == -1) { if (weapons[k].getType() != staff) @@ -7300,7 +6421,7 @@ void Game::Tick() Person::players[i]->isIdle() || Person::players[i]->animTarget == rollanim || Person::players[i]->animTarget == backhandspringanim) { if (Person::players.size() > 1) - for (int j = 0; j < Person::players.size(); j++) { + for (unsigned j = 0; j < Person::players.size(); j++) { if (Person::players[i]->weaponactive == -1) if (j != i) if (Person::players[j]->num_weapons && @@ -7407,7 +6528,7 @@ void Game::Tick() Person::players[i]->animTarget == sneakanim || Person::players[i]->isFlip()) if (Person::players.size() > 1) - for (int j = 0; j < Person::players.size(); j++) { + for (unsigned j = 0; j < Person::players.size(); j++) { if (i != j) if (tutoriallevel != 1 || tutorialstage == 49) if (hostile) @@ -7471,7 +6592,7 @@ void Game::Tick() } Person::players[i]->weaponactive = -1; - for (int j = 0; j < Person::players.size(); j++) { + for (unsigned j = 0; j < Person::players.size(); j++) { Person::players[j]->wentforweapon = 0; } } @@ -7568,14 +6689,14 @@ void Game::Tick() if (i == 0) { Person::players[i]->superruntoggle = 1; if (Person::players.size() > 1) - for (int j = 0; j < Person::players.size(); j++) + for (unsigned j = 0; j < Person::players.size(); j++) if (j != i && !Person::players[j]->skeleton.free && Person::players[j]->aitype == passivetype) if (distsq(&Person::players[j]->coords, &Person::players[i]->coords) < 16) Person::players[i]->superruntoggle = 0; } if (Person::players.size() > 1) - for (int j = 0; j < Person::players.size(); j++) { + for (unsigned j = 0; j < Person::players.size(); j++) { if (j != i && !Person::players[j]->skeleton.free && Person::players[j]->victim && Person::players[i]->lowreversaldelay <= 0) { if (distsq(&Person::players[j]->coords, &Person::players[j]->victim->coords) < 3 && Person::players[j]->victim == Person::players[i] && @@ -7619,7 +6740,7 @@ void Game::Tick() target = -2; if (Person::players[i]->isCrouch()) { if (Person::players.size() > 1) - for (int j = 0; j < Person::players.size(); j++) { + for (unsigned j = 0; j < Person::players.size(); j++) { if (j != i && !Person::players[j]->skeleton.free && Person::players[j]->victim && @@ -7809,7 +6930,7 @@ void Game::Tick() //Dodge sweep? target = -2; if (Person::players.size() > 1) - for (int j = 0; j < Person::players.size(); j++) { + for (unsigned j = 0; j < Person::players.size(); j++) { if (j != i && !Person::players[j]->skeleton.free && Person::players[j]->victim) { if (distsq(&Person::players[j]->coords, &Person::players[j]->victim->coords) < 3 && (Person::players[j]->victim == Person::players[i]) && @@ -7894,7 +7015,7 @@ void Game::Tick() } //Rotation - for (int k = 0; k < Person::players.size(); k++) { + for (unsigned k = 0; k < Person::players.size(); k++) { if (fabs(Person::players[k]->yaw - Person::players[k]->targetyaw) > 180) { if (Person::players[k]->yaw > Person::players[k]->targetyaw) Person::players[k]->yaw -= 360; @@ -7931,7 +7052,7 @@ void Game::Tick() } //do animations - for (int k = 0; k < Person::players.size(); k++) { + for (unsigned k = 0; k < Person::players.size(); k++) { Person::players[k]->DoAnimations(); Person::players[k]->whichpatchx = Person::players[k]->coords.x / (terrain.size / subdivision * terrain.scale); Person::players[k]->whichpatchz = Person::players[k]->coords.z / (terrain.size / subdivision * terrain.scale); @@ -8115,7 +7236,7 @@ void Game::TickOnceAfter() realthreat = 0; musictype = leveltheme; - for (int i = 0; i < Person::players.size(); i++) { + for (unsigned i = 0; i < Person::players.size(); i++) { if ((Person::players[i]->aitype == attacktypecutoff || Person::players[i]->aitype == getweapontype || Person::players[i]->aitype == gethelptype || @@ -8232,7 +7353,7 @@ void Game::TickOnceAfter() winhotspot = true; int numalarmed = 0; - for (int i = 1; i < Person::players.size(); i++) + for (unsigned i = 1; i < Person::players.size(); i++) if (!Person::players[i]->dead && Person::players[i]->aitype == attacktypecutoff && Person::players[i]->surprised <= 0) numalarmed++; if (numalarmed > maxalarmed) @@ -8244,7 +7365,7 @@ void Game::TickOnceAfter() targetlevel = whichlevel; } alldead = true; - for (int i = 1; i < Person::players.size(); i++) { + for (unsigned i = 1; i < Person::players.size(); i++) { if (!Person::players[i]->dead && Person::players[i]->howactive < typedead1) { alldead = false; break; @@ -8419,7 +7540,7 @@ void Game::TickOnceAfter() } target.y += .1; } - if (Person::players[0]->skeleton.free != 2/*&&!autocam*/) { + if (Person::players[0]->skeleton.free != 2) { cameraspeed = 20; if (findLengthfast(&Person::players[0]->velocity) > 400) { cameraspeed = 20 + (findLength(&Person::players[0]->velocity) - 20) * .96; @@ -8467,55 +7588,8 @@ void Game::TickOnceAfter() cameraloc.y = terrain.getHeight(cameraloc.x, cameraloc.z); } } - /* - //what did autocam do? - if(Person::players[0]->skeleton.free!=2&&autocam){ - cameraspeed=20; - if(findLengthfast(&Person::players[0]->velocity)>400){ - cameraspeed=20+(findLength(&Person::players[0]->velocity)-20)*.96; - } - if(Person::players[0]->skeleton.free==0&&Person::players[0]->animTarget!=hanganim&&Person::players[0]->animTarget!=climbanim)target.y+=1.4; - cameradist+=multiplier*5; - if(cameradist>3.3)cameradist=3.3; - coltarget=target-cameraloc; - if(findLengthfast(&coltarget)1) - { - Normalise(&coltarget); - if(Person::players[0]->animTarget!=hanganim&&Person::players[0]->animTarget!=climbanim&&Person::players[0]->animCurrent!=climbanim&&Person::players[0]->currentoffset.x==0)cameraloc=cameraloc+coltarget*multiplier*cameraspeed; - else cameraloc=cameraloc+coltarget*multiplier*8; - } - if(editorenabled)cameraloc=target; - viewer=cameraloc; - colviewer=viewer; - coltarget=cameraloc; - objects.SphereCheckPossible(&colviewer, findDistance(&colviewer,&coltarget)); - if(terrain.patchobjectnum[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz]) - for(int j=0;jwhichpatchx][Person::players[0]->whichpatchz];j++){ - int i=terrain.patchobjects[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz][j]; - colviewer=viewer; - coltarget=cameraloc; - if(objects.model[i].LineCheckPossible(&colviewer,&coltarget,&col,&objects.position[i],&objects.yaw[i])!=-1)viewer=col; - } - if(terrain.patchobjectnum[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz]) - for(int j=0;jwhichpatchx][Person::players[0]->whichpatchz];j++){ - int i=terrain.patchobjects[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz][j]; - colviewer=viewer; - if(objects.model[i].SphereCheck(&colviewer,.15,&col,&objects.position[i],&objects.yaw[i])!=-1){ - viewer=colviewer; - } - } - cameradist=findDistance(&viewer,&target); - viewer.y=max((double)viewer.y,terrain.getHeight(viewer.x,viewer.z)+.6); - if(cameraloc.y .8) camerashake = .8; - //if(woozy>10)woozy=10; - //woozy+=multiplier; woozy += multiplier; if (Person::players[0]->dead) camerashake = 0; @@ -8523,12 +7597,10 @@ void Game::TickOnceAfter() woozy = 0; camerashake -= multiplier * 2; blackout -= multiplier * 2; - //if(Person::players[0]->isCrouch())woozy-=multiplier*8; if (camerashake < 0) camerashake = 0; if (blackout < 0) blackout = 0; - //if(woozy<0)woozy=0; if (camerashake) { viewer.x += (float)(Random() % 100) * .0005 * camerashake; viewer.y += (float)(Random() % 100) * .0005 * camerashake;