X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FGameTick.cpp;h=a400c22321826144d3cb1db681c1c42408d54e67;hb=31191d0c0118f6abfccd7bf3ecc13bbfef3fa335;hp=216a81c3fd11d1c25ab5879688d0bfb8dee851ef;hpb=88891f52b571983a2f7407a39bed6eb6269af708;p=lugaru.git diff --git a/Source/GameTick.cpp b/Source/GameTick.cpp index 216a81c..a400c22 100644 --- a/Source/GameTick.cpp +++ b/Source/GameTick.cpp @@ -34,6 +34,7 @@ along with Lugaru. If not, see . #include "User/Settings.hpp" #include "Utils/Folders.hpp" #include "Utils/Input.hpp" +#include "Tutorial.hpp" #if PLATFORM_UNIX #include @@ -68,7 +69,6 @@ extern float screenwidth, screenheight; extern float gravity; extern int detail; extern float texdetail; -extern Objects objects; extern int slomo; extern float slomodelay; extern bool floatjump; @@ -113,12 +113,7 @@ extern float skyboxlightb; extern float fadestart; extern float slomospeed; extern float slomofreq; -extern int tutoriallevel; extern float smoketex; -extern float tutorialstagetime; -extern int tutorialstage; -extern float tutorialmaxtime; -extern float tutorialsuccess; extern bool againbonus; extern bool reversaltrain; extern bool canattack; @@ -318,8 +313,8 @@ static int findClosestObject() int closest = -1; float closestdist = std::numeric_limits::max(); - for (int i = 0; i < objects.numobjects; i++) { - float distance = distsq(&objects.position[i], &Person::players[0]->coords); + for (int i = 0; i < Object::objects.size(); i++) { + float distance = distsq(&Object::objects[i]->position, &Person::players[0]->coords); if (distance < closestdist) { closestdist = distance; closest = i; @@ -348,13 +343,9 @@ void Screenshot (void) char filename[1024]; time_t t = time(NULL); struct tm *tme = localtime(&t); - sprintf(filename, "Screenshots/Screenshot-%04d%02d%02d-%02d%02d%02d.png", + sprintf(filename, "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"); -#endif - save_screenshot(filename); } @@ -423,78 +414,6 @@ int findPathDist(int start, int end) return smallestcount; } -int Game::checkcollide(XYZ startpoint, XYZ endpoint) -{ - static XYZ colpoint, colviewer, coltarget; - static float minx, minz, maxx, maxz, miny, maxy; - - minx = min(startpoint.x, endpoint.x) - 1; - miny = min(startpoint.y, endpoint.y) - 1; - minz = min(startpoint.z, endpoint.z) - 1; - maxx = max(startpoint.x, endpoint.x) + 1; - maxy = max(startpoint.y, endpoint.y) + 1; - maxz = max(startpoint.z, endpoint.z) + 1; - - for (int i = 0; i < objects.numobjects; i++) { - if ( objects.position[i].x > minx - objects.model[i].boundingsphereradius && - objects.position[i].x < maxx + objects.model[i].boundingsphereradius && - objects.position[i].y > miny - objects.model[i].boundingsphereradius && - objects.position[i].y < maxy + objects.model[i].boundingsphereradius && - objects.position[i].z > minz - objects.model[i].boundingsphereradius && - objects.position[i].z < maxz + objects.model[i].boundingsphereradius) { - if ( objects.type[i] != treeleavestype && - objects.type[i] != bushtype && - objects.type[i] != firetype) { - colviewer = startpoint; - coltarget = endpoint; - if (objects.model[i].LineCheck(&colviewer, &coltarget, &colpoint, &objects.position[i], &objects.yaw[i]) != -1) - return i; - } - } - } - - return -1; -} - -int Game::checkcollide(XYZ startpoint, XYZ endpoint, int what) -{ - static XYZ colpoint, colviewer, coltarget; - static float minx, minz, maxx, maxz, miny, maxy; - static int i; //FIXME: see below - - minx = min(startpoint.x, endpoint.x) - 1; - miny = min(startpoint.y, endpoint.y) - 1; - minz = min(startpoint.z, endpoint.z) - 1; - maxx = max(startpoint.x, endpoint.x) + 1; - maxy = max(startpoint.y, endpoint.y) + 1; - maxz = max(startpoint.z, endpoint.z) + 1; - - if (what != 1000) { - if ( objects.position[what].x > minx - objects.model[what].boundingsphereradius && - objects.position[what].x < maxx + objects.model[what].boundingsphereradius && - objects.position[what].y > miny - objects.model[what].boundingsphereradius && - objects.position[what].y < maxy + objects.model[what].boundingsphereradius && - objects.position[what].z > minz - objects.model[what].boundingsphereradius && - objects.position[what].z < maxz + objects.model[what].boundingsphereradius) { - if ( objects.type[what] != treeleavestype && - objects.type[what] != bushtype && - objects.type[what] != firetype) { - colviewer = startpoint; - coltarget = endpoint; - //FIXME: i/what - if (objects.model[what].LineCheck(&colviewer, &coltarget, &colpoint, &objects.position[what], &objects.yaw[what]) != -1) - return i; - } - } - } - - if (what == 1000) - if (terrain.lineTerrain(startpoint, endpoint, &colpoint) != -1) - return 1000; - - return -1; -} - void Setenvironment(int which) { LOGFUNC; @@ -517,10 +436,10 @@ void Setenvironment(int which) if (ambientsound) emit_stream_np(stream_wind); - objects.treetextureptr.load("Textures/SnowTree.png", 0); - objects.bushtextureptr.load("Textures/BushSnow.png", 0); - objects.rocktextureptr.load("Textures/BoulderSnow.jpg", 1); - objects.boxtextureptr.load("Textures/SnowBox.jpg", 1); + Object::treetextureptr.load("Textures/SnowTree.png", 0); + Object::bushtextureptr.load("Textures/BushSnow.png", 0); + Object::rocktextureptr.load("Textures/BoulderSnow.jpg", 1); + Object::boxtextureptr.load("Textures/SnowBox.jpg", 1); footstepsound = footstepsn1; footstepsound2 = footstepsn2; @@ -548,10 +467,10 @@ void Setenvironment(int which) } else if (environment == desertenvironment) { windvector = 0; windvector.z = 2; - objects.treetextureptr.load("Textures/DesertTree.png", 0); - objects.bushtextureptr.load("Textures/BushDesert.png", 0); - objects.rocktextureptr.load("Textures/BoulderDesert.jpg", 1); - objects.boxtextureptr.load("Textures/DesertBox.jpg", 1); + Object::treetextureptr.load("Textures/DesertTree.png", 0); + Object::bushtextureptr.load("Textures/BushDesert.png", 0); + Object::rocktextureptr.load("Textures/BoulderDesert.jpg", 1); + Object::boxtextureptr.load("Textures/DesertBox.jpg", 1); if (ambientsound) @@ -583,10 +502,10 @@ void Setenvironment(int which) } else if (environment == grassyenvironment) { windvector = 0; windvector.z = 2; - objects.treetextureptr.load("Textures/Tree.png", 0); - objects.bushtextureptr.load("Textures/Bush.png", 0); - objects.rocktextureptr.load("Textures/Boulder.jpg", 1); - objects.boxtextureptr.load("Textures/GrassBox.jpg", 1); + Object::treetextureptr.load("Textures/Tree.png", 0); + Object::bushtextureptr.load("Textures/Bush.png", 0); + Object::rocktextureptr.load("Textures/Boulder.jpg", 1); + Object::boxtextureptr.load("Textures/GrassBox.jpg", 1); if (ambientsound) emit_stream_np(stream_wind, 100.); @@ -627,8 +546,7 @@ void Game::Loadlevel(int which) whichlevel = which; if (which == -1) { - tutoriallevel = -1; - Loadlevel("tutorial"); + Loadlevel("tutorial", true); } else if (which >= 0 && which <= 15) { char buf[32]; snprintf(buf, 32, "map%d", which + 1); // challenges @@ -637,7 +555,7 @@ void Game::Loadlevel(int which) Loadlevel("mapsave"); } -void Game::Loadlevel(const std::string& name) +void Game::Loadlevel(const std::string& name, bool tutorial) { int indemo; // FIXME this should be removed int templength; @@ -648,25 +566,23 @@ void Game::Loadlevel(const std::string& name) LOG(std::string("Loading level...") + name); if (!gameon) - visibleloading = 1; + visibleloading = true; if (stealthloading) - visibleloading = 0; + visibleloading = false; if (!stillloading) loadtime = 0; gamestarted = 1; numenvsounds = 0; - if (tutoriallevel != -1) - tutoriallevel = 0; - else - tutoriallevel = 1; + Tutorial::active = tutorial; - if (tutoriallevel == 1) - tutorialstage = 0; - if (tutorialstage == 0) { - tutorialstagetime = 0; - tutorialmaxtime = 1; + if (Tutorial::active) { + Tutorial::stage = 0; + } + if (Tutorial::stage == 0) { + Tutorial::stagetime = 0; + Tutorial::maxtime = 1; } pause_sound(whooshsound); pause_sound(stream_firesound); @@ -741,21 +657,13 @@ void Game::Loadlevel(const std::string& name) if (!stealthloading) { terrain.numdecals = 0; Sprite::deleteSprites(); - for (int i = 0; i < objects.numobjects; i++) - objects.model[i].numdecals = 0; - - int j = objects.numobjects; - for (int i = 0; i < j; i++) { - objects.DeleteObject(0); - if (visibleloading) - LoadingScreen(); - } - for (int i = 0; i < subdivision; i++) - for (int j = 0; j < subdivision; j++) + for (int i = 0; i < subdivision; i++) { + for (int j = 0; j < subdivision; j++) { terrain.patchobjectnum[i][j] = 0; - if (visibleloading) - LoadingScreen(); + } + } + Game::LoadingScreen(); } weapons.clear(); @@ -812,8 +720,7 @@ void Game::Loadlevel(const std::string& name) weapons.push_back(Weapon(type, 0)); } - if (visibleloading) - LoadingScreen(); + Game::LoadingScreen(); funpackf(tfile, "Bf Bf Bf", &Person::players[0]->armorhead, &Person::players[0]->armorhigh, &Person::players[0]->armorlow); funpackf(tfile, "Bf Bf Bf", &Person::players[0]->protectionhead, &Person::players[0]->protectionhigh, &Person::players[0]->protectionlow); @@ -848,12 +755,7 @@ void Game::Loadlevel(const std::string& name) funpackf(tfile, "Bi", &environment); - funpackf(tfile, "Bi", &objects.numobjects); - for (int i = 0; i < objects.numobjects; i++) { - funpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", &objects.type[i], &objects.yaw[i], &objects.pitch[i], &objects.position[i].x, &objects.position[i].y, &objects.position[i].z, &objects.scale[i]); - if (objects.type[i] == treeleavestype) - objects.scale[i] = objects.scale[i - 1]; - } + Object::LoadObjectsFromFile(tfile, stealthloading); if (mapvers >= 7) { int numhotspots; @@ -877,32 +779,14 @@ void Game::Loadlevel(const std::string& name) Hotspot::hotspots.clear(); } - if (visibleloading) - LoadingScreen(); + Game::LoadingScreen(); if (!stealthloading) { - objects.center = 0; - for (int i = 0; i < objects.numobjects; i++) - objects.center += objects.position[i]; - objects.center /= objects.numobjects; - - - if (visibleloading) - LoadingScreen(); - - float maxdistance = 0; - float tempdist; - for (int i = 0; i < objects.numobjects; i++) { - tempdist = distsq(&objects.center, &objects.position[i]); - if (tempdist > maxdistance) { - maxdistance = tempdist; - } - } - objects.radius = fast_sqrt(maxdistance); + Object::ComputeCenter(); + Object::ComputeRadius(); } - if (visibleloading) - LoadingScreen(); + Game::LoadingScreen(); int numplayers; funpackf(tfile, "Bi", &numplayers); @@ -918,8 +802,7 @@ void Game::Loadlevel(const std::string& name) cerr << "Invalid Person found in " << name << endl; } } - if (visibleloading) - LoadingScreen(); + Game::LoadingScreen(); funpackf(tfile, "Bi", &numpathpoints); if (numpathpoints > 30 || numpathpoints < 0) @@ -930,8 +813,7 @@ void Game::Loadlevel(const std::string& name) funpackf(tfile, "Bi", &pathpointconnect[j][k]); } } - if (visibleloading) - LoadingScreen(); + Game::LoadingScreen(); funpackf(tfile, "Bf Bf Bf Bf", &mapcenter.x, &mapcenter.y, &mapcenter.z, &mapradius); @@ -941,27 +823,17 @@ void Game::Loadlevel(const std::string& name) oldenvironment = environment; if (!stealthloading) { - int j = objects.numobjects; - objects.numobjects = 0; - for (int i = 0; i < j; i++) { - objects.MakeObject(objects.type[i], objects.position[i], objects.yaw[i], objects.pitch[i], objects.scale[i]); - if (visibleloading) - LoadingScreen(); - } - + Object::AddObjectsToTerrain(); terrain.DoShadows(); - if (visibleloading) - LoadingScreen(); - objects.DoShadows(); - if (visibleloading) - LoadingScreen(); + Game::LoadingScreen(); + Object::DoShadows(); + Game::LoadingScreen(); } fclose(tfile); for (unsigned i = 0; i < Person::players.size(); i++) { - if (visibleloading) - LoadingScreen(); + Game::LoadingScreen(); if (i == 0) { Person::players[i]->burnt = 0; Person::players[i]->bled = 0; @@ -1016,8 +888,7 @@ void Game::Loadlevel(const std::string& name) } - if (visibleloading) - LoadingScreen(); + Game::LoadingScreen(); if (cellophane) { Person::players[i]->proportionhead.z = 0; @@ -1083,8 +954,7 @@ void Game::Loadlevel(const std::string& name) hawkcoords = Person::players[0]->coords; hawkcoords.y += 30; - if (visibleloading) - LoadingScreen(); + Game::LoadingScreen(); LOG("Starting background music..."); @@ -1108,536 +978,7 @@ void Game::Loadlevel(const std::string& name) leveltime = 0; wonleveltime = 0; - visibleloading = 0; -} - -void doTutorial() -{ - if (tutorialstagetime > tutorialmaxtime) { - tutorialstage++; - tutorialsuccess = 0; - if (tutorialstage <= 1) { - canattack = 0; - cananger = 0; - reversaltrain = 0; - } - switch (tutorialstage) { - case 1: - tutorialmaxtime = 5; - break; - case 2: - tutorialmaxtime = 2; - break; - case 3: - tutorialmaxtime = 600; - break; - case 4: - tutorialmaxtime = 1000; - break; - case 5: - tutorialmaxtime = 600; - break; - case 6: - tutorialmaxtime = 600; - break; - case 7: - tutorialmaxtime = 600; - break; - case 8: - tutorialmaxtime = 600; - break; - case 9: - tutorialmaxtime = 600; - break; - case 10: - tutorialmaxtime = 2; - break; - case 11: - tutorialmaxtime = 1000; - break; - case 12: - tutorialmaxtime = 1000; - break; - case 13: - tutorialmaxtime = 2; - break; - case 14: { - tutorialmaxtime = 3; - - XYZ temp, temp2; - - temp.x = 1011; - temp.y = 84; - temp.z = 491; - temp2.x = 1025; - temp2.y = 75; - temp2.z = 447; - - Person::players[1]->coords = (temp + temp2) / 2; - - emit_sound_at(fireendsound, Person::players[1]->coords); - - for (unsigned i = 0; i < Person::players[1]->skeleton.joints.size(); i++) { - if (Random() % 2 == 0) { - if (!Person::players[1]->skeleton.free) - temp2 = (Person::players[1]->coords - Person::players[1]->oldcoords) / multiplier / 2; //velocity/2; - if (Person::players[1]->skeleton.free) - temp2 = Person::players[1]->skeleton.joints[i].velocity * Person::players[1]->scale / 2; - if (!Person::players[1]->skeleton.free) - temp = DoRotation(DoRotation(DoRotation(Person::players[1]->skeleton.joints[i].position, 0, 0, Person::players[1]->tilt), Person::players[1]->tilt2, 0, 0), 0, Person::players[1]->yaw, 0) * Person::players[1]->scale + Person::players[1]->coords; - if (Person::players[1]->skeleton.free) - temp = Person::players[1]->skeleton.joints[i].position * Person::players[1]->scale + Person::players[1]->coords; - Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1); - } - } - } - break; - case 15: - tutorialmaxtime = 500; - break; - case 16: - tutorialmaxtime = 500; - break; - case 17: - tutorialmaxtime = 500; - break; - case 18: - tutorialmaxtime = 500; - break; - case 19: - tutorialstage = 20; - break; - case 20: - tutorialmaxtime = 500; - break; - case 21: - tutorialmaxtime = 500; - if (bonus == cannon) { - bonus = Slicebonus; - againbonus = 1; - } else - againbonus = 0; - break; - case 22: - tutorialmaxtime = 500; - break; - case 23: - tutorialmaxtime = 500; - break; - case 24: - tutorialmaxtime = 500; - break; - case 25: - tutorialmaxtime = 500; - break; - case 26: - tutorialmaxtime = 2; - break; - case 27: - tutorialmaxtime = 4; - reversaltrain = 1; - cananger = 1; - Person::players[1]->aitype = attacktypecutoff; - break; - case 28: - tutorialmaxtime = 400; - break; - case 29: - tutorialmaxtime = 400; - Person::players[0]->escapednum = 0; - break; - case 30: - tutorialmaxtime = 4; - reversaltrain = 0; - cananger = 0; - Person::players[1]->aitype = passivetype; - break; - case 31: - tutorialmaxtime = 13; - break; - case 32: - tutorialmaxtime = 8; - break; - case 33: - tutorialmaxtime = 400; - cananger = 1; - canattack = 1; - Person::players[1]->aitype = attacktypecutoff; - break; - case 34: - tutorialmaxtime = 400; - break; - case 35: - tutorialmaxtime = 400; - break; - case 36: - tutorialmaxtime = 2; - reversaltrain = 0; - cananger = 0; - Person::players[1]->aitype = passivetype; - break; - case 37: - damagedealt = 0; - damagetaken = 0; - tutorialmaxtime = 50; - cananger = 1; - canattack = 1; - Person::players[1]->aitype = attacktypecutoff; - break; - case 38: - tutorialmaxtime = 4; - canattack = 0; - cananger = 0; - Person::players[1]->aitype = passivetype; - break; - case 39: { - XYZ temp, temp2; - - temp.x = 1011; - temp.y = 84; - temp.z = 491; - temp2.x = 1025; - temp2.y = 75; - temp2.z = 447; - - Weapon w(knife, -1); - w.position = (temp + temp2) / 2; - w.tippoint = (temp + temp2) / 2; - - w.velocity = 0.1; - w.tipvelocity = 0.1; - w.missed = 1; - w.hitsomething = 0; - w.freetime = 0; - w.firstfree = 1; - w.physics = 1; - - weapons.push_back(w); - } - break; - case 40: - tutorialmaxtime = 300; - break; - case 41: - tutorialmaxtime = 300; - break; - case 42: - tutorialmaxtime = 8; - break; - case 43: - tutorialmaxtime = 300; - break; - case 44: - weapons[0].owner = 1; - Person::players[0]->weaponactive = -1; - Person::players[0]->num_weapons = 0; - Person::players[1]->weaponactive = 0; - Person::players[1]->num_weapons = 1; - Person::players[1]->weaponids[0] = 0; - - cananger = 1; - canattack = 1; - Person::players[1]->aitype = attacktypecutoff; - - tutorialmaxtime = 300; - break; - case 45: - weapons[0].owner = 1; - Person::players[0]->weaponactive = -1; - Person::players[0]->num_weapons = 0; - Person::players[1]->weaponactive = 0; - Person::players[1]->num_weapons = 1; - Person::players[1]->weaponids[0] = 0; - - tutorialmaxtime = 300; - break; - case 46: - weapons[0].owner = 1; - Person::players[0]->weaponactive = -1; - Person::players[0]->num_weapons = 0; - Person::players[1]->weaponactive = 0; - Person::players[1]->num_weapons = 1; - Person::players[1]->weaponids[0] = 0; - - weapons[0].setType(sword); - - tutorialmaxtime = 300; - break; - case 47: { - tutorialmaxtime = 10; - - XYZ temp, temp2; - - temp.x = 1011; - temp.y = 84; - temp.z = 491; - temp2.x = 1025; - temp2.y = 75; - temp2.z = 447; - - Weapon w(sword, -1); - w.position = (temp + temp2) / 2; - w.tippoint = (temp + temp2) / 2; - - w.velocity = 0.1; - w.tipvelocity = 0.1; - w.missed = 1; - w.hitsomething = 0; - w.freetime = 0; - w.firstfree = 1; - w.physics = 1; - - weapons.push_back(w); - - weapons[0].owner = 1; - weapons[1].owner = 0; - Person::players[0]->weaponactive = 0; - Person::players[0]->num_weapons = 1; - Person::players[0]->weaponids[0] = 1; - Person::players[1]->weaponactive = 0; - Person::players[1]->num_weapons = 1; - Person::players[1]->weaponids[0] = 0; - - } - break; - case 48: - canattack = 0; - cananger = 0; - Person::players[1]->aitype = passivetype; - - tutorialmaxtime = 15; - - weapons[0].owner = 1; - weapons[1].owner = 0; - Person::players[0]->weaponactive = 0; - Person::players[0]->num_weapons = 1; - Person::players[0]->weaponids[0] = 1; - Person::players[1]->weaponactive = 0; - Person::players[1]->num_weapons = 1; - Person::players[1]->weaponids[0] = 0; - - if (Person::players[0]->weaponactive != -1) - weapons[Person::players[0]->weaponids[Person::players[0]->weaponactive]].setType(staff); - else - weapons[0].setType(staff); - break; - case 49: - canattack = 0; - cananger = 0; - Person::players[1]->aitype = passivetype; - - tutorialmaxtime = 200; - - weapons[1].position = 1000; - weapons[1].tippoint = 1000; - - weapons[0].setType(knife); - - weapons[0].owner = 0; - Person::players[1]->weaponactive = -1; - Person::players[1]->num_weapons = 0; - Person::players[0]->weaponactive = 0; - Person::players[0]->num_weapons = 1; - Person::players[0]->weaponids[0] = 0; - - break; - case 50: { - tutorialmaxtime = 8; - - XYZ temp, temp2; - emit_sound_at(fireendsound, Person::players[1]->coords); - - for (unsigned i = 0; i < Person::players[1]->skeleton.joints.size(); i++) { - if (Random() % 2 == 0) { - if (!Person::players[1]->skeleton.free) - temp2 = (Person::players[1]->coords - Person::players[1]->oldcoords) / multiplier / 2; //velocity/2; - if (Person::players[1]->skeleton.free) - temp2 = Person::players[1]->skeleton.joints[i].velocity * Person::players[1]->scale / 2; - if (!Person::players[1]->skeleton.free) - temp = DoRotation(DoRotation(DoRotation(Person::players[1]->skeleton.joints[i].position, 0, 0, Person::players[1]->tilt), Person::players[1]->tilt2, 0, 0), 0, Person::players[1]->yaw, 0) * Person::players[1]->scale + Person::players[1]->coords; - if (Person::players[1]->skeleton.free) - temp = Person::players[1]->skeleton.joints[i].position * Person::players[1]->scale + Person::players[1]->coords; - Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1); - } - } - - Person::players[1]->num_weapons = 0; - Person::players[1]->weaponstuck = -1; - Person::players[1]->weaponactive = -1; - - weapons.clear(); - } - break; - case 51: - tutorialmaxtime = 80000; - break; - default: - break; - } - if (tutorialstage <= 51) - tutorialstagetime = 0; - } - - //Tutorial success - if (tutorialstagetime < tutorialmaxtime - 3) { - switch (tutorialstage) { - case 3: - if (deltah || deltav) - tutorialsuccess += multiplier; - break; - case 4: - if (Person::players[0]->forwardkeydown || Person::players[0]->backkeydown || Person::players[0]->leftkeydown || Person::players[0]->rightkeydown) - tutorialsuccess += multiplier; - break; - case 5: - if (Person::players[0]->jumpkeydown) - tutorialsuccess = 1; - break; - case 6: - if (Person::players[0]->isCrouch()) - tutorialsuccess = 1; - break; - case 7: - if (Person::players[0]->animTarget == rollanim) - tutorialsuccess = 1; - break; - case 8: - if (Person::players[0]->animTarget == sneakanim) - tutorialsuccess += multiplier; - break; - case 9: - if (Person::players[0]->animTarget == rabbitrunninganim || Person::players[0]->animTarget == wolfrunninganim) - tutorialsuccess += multiplier; - break; - case 11: - if (Person::players[0]->isWallJump()) - tutorialsuccess = 1; - break; - case 12: - if (Person::players[0]->animTarget == flipanim) - tutorialsuccess = 1; - break; - case 15: - if (Person::players[0]->animTarget == upunchanim || Person::players[0]->animTarget == winduppunchanim) - tutorialsuccess = 1; - break; - case 16: - if (Person::players[0]->animTarget == winduppunchanim) - tutorialsuccess = 1; - break; - case 17: - if (Person::players[0]->animTarget == spinkickanim) - tutorialsuccess = 1; - break; - case 18: - if (Person::players[0]->animTarget == sweepanim) - tutorialsuccess = 1; - break; - case 19: - if (Person::players[0]->animTarget == dropkickanim) - tutorialsuccess = 1; - break; - case 20: - if (Person::players[0]->animTarget == rabbitkickanim) - tutorialsuccess = 1; - break; - case 21: - if (bonus == cannon) - tutorialsuccess = 1; - break; - case 22: - if (bonus == spinecrusher) - tutorialsuccess = 1; - break; - case 23: - if (Person::players[0]->animTarget == walljumprightkickanim || Person::players[0]->animTarget == walljumpleftkickanim) - tutorialsuccess = 1; - break; - case 24: - if (Person::players[0]->animTarget == rabbittacklinganim) - tutorialsuccess = 1; - break; - case 25: - if (Person::players[0]->animTarget == backhandspringanim) - tutorialsuccess = 1; - break; - case 28: - if (Animation::animations[Person::players[0]->animTarget].attack == reversed && Person::players[0]->feint) - tutorialsuccess = 1; - break; - case 29: - if (Person::players[0]->escapednum == 2) { - tutorialsuccess = 1; - reversaltrain = 0; - cananger = 0; - Person::players[1]->aitype = passivetype; - } - break; - case 33: - if (Animation::animations[Person::players[0]->animTarget].attack == reversal) - tutorialsuccess = 1; - break; - case 34: - if (Animation::animations[Person::players[0]->animTarget].attack == reversal) - tutorialsuccess = 1; - break; - case 35: - if (Animation::animations[Person::players[0]->animTarget].attack == reversal) { - tutorialsuccess = 1; - reversaltrain = 0; - cananger = 0; - Person::players[1]->aitype = passivetype; - } - break; - case 40: - if (Person::players[0]->num_weapons > 0) - tutorialsuccess = 1; - break; - case 41: - if (Person::players[0]->weaponactive == -1 && Person::players[0]->num_weapons > 0) - tutorialsuccess = 1; - break; - case 43: - if (Person::players[0]->animTarget == knifeslashstartanim) - tutorialsuccess = 1; - break; - case 44: - if (Animation::animations[Person::players[0]->animTarget].attack == reversal) - tutorialsuccess = 1; - break; - case 45: - if (Animation::animations[Person::players[0]->animTarget].attack == reversal) - tutorialsuccess = 1; - break; - case 46: - if (Animation::animations[Person::players[0]->animTarget].attack == reversal) - tutorialsuccess = 1; - break; - case 49: - if (Person::players[1]->weaponstuck != -1) - tutorialsuccess = 1; - break; - default: - break; - } - if (tutorialsuccess >= 1) - tutorialstagetime = tutorialmaxtime - 3; - - - if (tutorialstagetime == tutorialmaxtime - 3) { - emit_sound_np(consolesuccesssound); - } - - if (tutorialsuccess >= 1) { - if (tutorialstage == 34 || tutorialstage == 35) - tutorialstagetime = tutorialmaxtime - 1; - } - } - - if (tutorialstage < 14 || tutorialstage >= 50) { - Person::players[1]->coords.y = 300; - Person::players[1]->velocity = 0; - } + visibleloading = false; } void doDevKeys() @@ -1685,9 +1026,9 @@ void doDevKeys() /* Grow tree leaves?? */ if (Input::isKeyPressed(SDL_SCANCODE_Y)) { - for (int i = 0; i < objects.numobjects; i++) { - if (objects.type[i] == treeleavestype) { - objects.scale[i] *= .9; + for (int i = 0; i < Object::objects.size(); i++) { + if (Object::objects[i]->type == treeleavestype) { + Object::objects[i]->scale *= .9; } } } @@ -2028,12 +1369,13 @@ void doDevKeys() if (Input::isKeyPressed(SDL_SCANCODE_DELETE) && Input::isKeyDown(SDL_SCANCODE_LCTRL)) { int closest = findClosestObject(); - if (closest >= 0) - objects.position[closest].y -= 500; + if (closest >= 0) { + Object::objects[closest]->position.y -= 500; + } } if (Input::isKeyPressed(SDL_SCANCODE_M) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) { - if (objects.numobjects < max_objects - 1) { + if (Object::objects.size() < max_objects - 1) { XYZ scenecoords; scenecoords.x = Person::players[0]->coords.x; scenecoords.z = Person::players[0]->coords.z; @@ -2042,7 +1384,6 @@ void doDevKeys() scenecoords.y = Person::players[0]->coords.y - .5; if (editortype == firetype) scenecoords.y = Person::players[0]->coords.y - .5; - //objects.MakeObject(abs(Random()%3),scenecoords,Random()%360); float temprotat, temprotat2; temprotat = editoryaw; temprotat2 = editorpitch; @@ -2051,9 +1392,9 @@ void doDevKeys() if (temprotat2 < 0) temprotat2 = Random() % 360; - objects.MakeObject(editortype, scenecoords, (int)temprotat - ((int)temprotat) % 30, (int)temprotat2, editorsize); + Object::MakeObject(editortype, scenecoords, (int)temprotat - ((int)temprotat) % 30, (int)temprotat2, editorsize); if (editortype == treetrunktype) - objects.MakeObject(treeleavestype, scenecoords, Random() % 360 * (temprotat2 < 2) + (int)editoryaw - ((int)editoryaw) % 30, editorpitch, editorsize); + Object::MakeObject(treeleavestype, scenecoords, Random() % 360 * (temprotat2 < 2) + (int)editoryaw - ((int)editoryaw) % 30, editorpitch, editorsize); } } @@ -2198,11 +1539,13 @@ void doDevKeys() if (pathpointselected >= numpathpoints) pathpointselected = -1; } + if (Input::isKeyPressed(SDL_SCANCODE_COMMA) && !Input::isKeyDown(SDL_SCANCODE_LSHIFT)) { pathpointselected--; if (pathpointselected <= -2) pathpointselected = numpathpoints - 1; } + if (Input::isKeyPressed(SDL_SCANCODE_COMMA) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) { if (pathpointselected != -1) { numpathpoints--; @@ -2270,6 +1613,7 @@ void doDevKeys() if (Input::isKeyPressed(SDL_SCANCODE_RIGHT) && Input::isKeyDown(SDL_SCANCODE_LSHIFT) && Input::isKeyDown(SDL_SCANCODE_LCTRL)) { mapradius += multiplier * 10; } + if (Input::isKeyDown(SDL_SCANCODE_UP) && Input::isKeyDown(SDL_SCANCODE_LCTRL)) { editorpitch += multiplier * 100; } @@ -2279,10 +1623,12 @@ void doDevKeys() if (editorpitch < -.01) editorpitch = -.01; } - if (Input::isKeyPressed(SDL_SCANCODE_DELETE) && objects.numobjects && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) { + + if (Input::isKeyPressed(SDL_SCANCODE_DELETE) && Object::objects.size() && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) { int closest = findClosestObject(); - if (closest >= 0) - objects.DeleteObject(closest); + if (closest >= 0) { + Object::DeleteObject(closest); + } } } } @@ -2449,9 +1795,9 @@ void doAerialAcrobatics() 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]; - if (objects.type[i] != rocktype || - objects.scale[i] > .5 && Person::players[k]->aitype == playercontrolled || - objects.position[i].y > Person::players[k]->coords.y) { + if (Object::objects[i]->type != rocktype || + Object::objects[i]->scale > .5 && Person::players[k]->aitype == playercontrolled || + Object::objects[i]->position.y > Person::players[k]->coords.y) { lowpoint = Person::players[k]->coords; if (Person::players[k]->animTarget != jumpupanim && Person::players[k]->animTarget != jumpdownanim && @@ -2462,7 +1808,7 @@ void doAerialAcrobatics() if ( Person::players[k]->coords.y < terrain.getHeight(Person::players[k]->coords.x, Person::players[k]->coords.z) && Person::players[k]->coords.y > terrain.getHeight(Person::players[k]->coords.x, Person::players[k]->coords.z) - .1) Person::players[k]->coords.y = terrain.getHeight(Person::players[k]->coords.x, Person::players[k]->coords.z); - if (Person::players[k]->SphereCheck(&lowpoint, 1.3, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) { + if (Person::players[k]->SphereCheck(&lowpoint, 1.3, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw, &Object::objects[i]->model) != -1) { flatfacing = lowpoint - Person::players[k]->coords; Person::players[k]->coords = lowpoint; Person::players[k]->coords.y -= 1.3; @@ -2478,14 +1824,14 @@ void doAerialAcrobatics() Person::players[k]->jumpkeydown) { lowpointtarget = lowpoint + DoRotation(Person::players[k]->facing, 0, -90, 0) * 1.5; XYZ tempcoords1 = lowpoint; - whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]); - if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) { + whichhit = Object::objects[i]->model.LineCheck(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw); + if (whichhit != -1 && fabs(Object::objects[i]->model.facenormals[whichhit].y) < .3) { Person::players[k]->setAnimation(walljumpleftanim); emit_sound_at(movewhooshsound, Person::players[k]->coords); if (k == 0) pause_sound(whooshsound); - lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0); + lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0); Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI; if (lowpointtarget.z < 0) Person::players[k]->yaw = 180 - Person::players[k]->yaw; @@ -2496,14 +1842,14 @@ void doAerialAcrobatics() } else { lowpoint = tempcoords1; lowpointtarget = lowpoint + DoRotation(Person::players[k]->facing, 0, 90, 0) * 1.5; - whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]); - if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) { + whichhit = Object::objects[i]->model.LineCheck(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw); + if (whichhit != -1 && fabs(Object::objects[i]->model.facenormals[whichhit].y) < .3) { Person::players[k]->setAnimation(walljumprightanim); emit_sound_at(movewhooshsound, Person::players[k]->coords); if (k == 0) pause_sound(whooshsound); - lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0); + lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0); Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI; if (lowpointtarget.z < 0) Person::players[k]->yaw = 180 - Person::players[k]->yaw; @@ -2514,14 +1860,14 @@ void doAerialAcrobatics() } else { lowpoint = tempcoords1; lowpointtarget = lowpoint + Person::players[k]->facing * 2; - whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]); - if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) { + whichhit = Object::objects[i]->model.LineCheck(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw); + if (whichhit != -1 && fabs(Object::objects[i]->model.facenormals[whichhit].y) < .3) { Person::players[k]->setAnimation(walljumpbackanim); emit_sound_at(movewhooshsound, Person::players[k]->coords); if (k == 0) pause_sound(whooshsound); - lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0); + lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0); Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI; if (lowpointtarget.z < 0) Person::players[k]->yaw = 180 - Person::players[k]->yaw; @@ -2532,14 +1878,14 @@ void doAerialAcrobatics() } else { lowpoint = tempcoords1; lowpointtarget = lowpoint - Person::players[k]->facing * 2; - whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]); - if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) { + whichhit = Object::objects[i]->model.LineCheck(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw); + if (whichhit != -1 && fabs(Object::objects[i]->model.facenormals[whichhit].y) < .3) { Person::players[k]->setAnimation(walljumpfrontanim); emit_sound_at(movewhooshsound, Person::players[k]->coords); if (k == 0) pause_sound(whooshsound); - lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0); + lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0); Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI; if (lowpointtarget.z < 0) Person::players[k]->yaw = 180 - Person::players[k]->yaw; @@ -2554,11 +1900,11 @@ void doAerialAcrobatics() } } } - } else if (objects.type[i] == rocktype) { + } else if (Object::objects[i]->type == rocktype) { lowpoint2 = Person::players[k]->coords; lowpoint = Person::players[k]->coords; lowpoint.y += 2; - if (objects.model[i].LineCheck(&lowpoint, &lowpoint2, &colpoint, &objects.position[i], &objects.yaw[i]) != -1) { + if (Object::objects[i]->model.LineCheck(&lowpoint, &lowpoint2, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1) { Person::players[k]->coords = colpoint; Person::players[k]->collide = 1; tempcollide = 1; @@ -2601,8 +1947,8 @@ void doAerialAcrobatics() int i = terrain.patchobjects[Person::players[k]->whichpatchx][Person::players[k]->whichpatchz][l]; lowpoint = Person::players[k]->coords; lowpoint.y += 1.35; - if (objects.type[i] != rocktype) - if (Person::players[k]->SphereCheck(&lowpoint, 1.33, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) { + if (Object::objects[i]->type != rocktype) + if (Person::players[k]->SphereCheck(&lowpoint, 1.33, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw, &Object::objects[i]->model) != -1) { if (Person::players[k]->animTarget != jumpupanim && Person::players[k]->animTarget != jumpdownanim && Person::players[k]->onterrain) @@ -2618,14 +1964,14 @@ void doAerialAcrobatics() Person::players[k]->animTarget == jumpupanim || Person::players[k]->animTarget == jumpdownanim)) { lowpoint = Person::players[k]->coords; - objects.model[i].SphereCheckPossible(&lowpoint, 1.5, &objects.position[i], &objects.yaw[i]); + Object::objects[i]->model.SphereCheckPossible(&lowpoint, 1.5, &Object::objects[i]->position, &Object::objects[i]->yaw); lowpoint = Person::players[k]->coords; lowpoint.y += .05; facing = 0; facing.z = -1; facing = DoRotation(facing, 0, Person::players[k]->targetyaw + 180, 0); lowpointtarget = lowpoint + facing * 1.4; - whichhit = objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]); + whichhit = Object::objects[i]->model.LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw); if (whichhit != -1) { lowpoint = Person::players[k]->coords; lowpoint.y += .1; @@ -2654,27 +2000,27 @@ void doAerialAcrobatics() lowpointtarget6.y += 45 / 13; lowpointtarget6 += facing * .6; lowpointtarget7.y += 90 / 13; - whichhit = objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]); - if (objects.friction[i] > .5) + whichhit = Object::objects[i]->model.LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw); + if (Object::objects[i]->friction > .5) if (whichhit != -1) { if (whichhit != -1 && Person::players[k]->animTarget != jumpupanim && Person::players[k]->animTarget != jumpdownanim) Person::players[k]->collided = 1; - if (checkcollide(lowpoint7, lowpointtarget7) == -1) - if (checkcollide(lowpoint6, lowpointtarget6) == -1) - if ( objects.model[i].LineCheckPossible(&lowpoint2, &lowpointtarget2, - &colpoint, &objects.position[i], &objects.yaw[i]) != -1 && - objects.model[i].LineCheckPossible(&lowpoint3, &lowpointtarget3, - &colpoint, &objects.position[i], &objects.yaw[i]) != -1 && - objects.model[i].LineCheckPossible(&lowpoint4, &lowpointtarget4, - &colpoint, &objects.position[i], &objects.yaw[i]) != -1 && - objects.model[i].LineCheckPossible(&lowpoint5, &lowpointtarget5, - &colpoint, &objects.position[i], &objects.yaw[i]) != -1) + if (Object::checkcollide(lowpoint7, lowpointtarget7) == -1) + if (Object::checkcollide(lowpoint6, lowpointtarget6) == -1) + if ( Object::objects[i]->model.LineCheckPossible(&lowpoint2, &lowpointtarget2, + &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1 && + Object::objects[i]->model.LineCheckPossible(&lowpoint3, &lowpointtarget3, + &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1 && + Object::objects[i]->model.LineCheckPossible(&lowpoint4, &lowpointtarget4, + &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1 && + Object::objects[i]->model.LineCheckPossible(&lowpoint5, &lowpointtarget5, + &colpoint, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1) for (int j = 0; j < 45; j++) { lowpoint = Person::players[k]->coords; lowpoint.y += (float)j / 13; lowpointtarget = lowpoint + facing * 1.4; - if (objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget, - &colpoint2, &objects.position[i], &objects.yaw[i]) == -1) { + if (Object::objects[i]->model.LineCheckPossible(&lowpoint, &lowpointtarget, + &colpoint2, &Object::objects[i]->position, &Object::objects[i]->yaw) == -1) { if (j <= 6 || j <= 25 && Person::players[k]->animTarget == jumpdownanim) break; if (Person::players[k]->animTarget == jumpupanim || Person::players[k]->animTarget == jumpdownanim) { @@ -2682,7 +2028,7 @@ void doAerialAcrobatics() lowpoint.y += (float)j / 13; lowpointtarget = lowpoint + facing * 1.3; flatfacing = Person::players[k]->coords; - Person::players[k]->coords = colpoint - DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[k], 0) * .01; + Person::players[k]->coords = colpoint - DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[k]->yaw, 0) * .01; Person::players[k]->coords.y = lowpointtarget.y - .07; Person::players[k]->currentoffset = (flatfacing - Person::players[k]->coords) / Person::players[k]->scale; @@ -2693,7 +2039,7 @@ void doAerialAcrobatics() } emit_sound_at(jumpsound, Person::players[k]->coords, 128.); - lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0); + lowpointtarget = DoRotation(Object::objects[i]->model.facenormals[whichhit], 0, Object::objects[i]->yaw, 0); Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI; if (lowpointtarget.z < 0) Person::players[k]->yaw = 180 - Person::players[k]->yaw; @@ -2970,7 +2316,7 @@ void doAttacks() } if (attackweapon) { //sweep - if ((tutoriallevel != 1 || !attackweapon) && + if ((!Tutorial::active || !attackweapon) && distance < 2.5 * sq(Person::players[k]->scale * 5) && randattack == 0 && Animation::animations[Person::players[i]->animTarget].height != lowheight) @@ -3004,7 +2350,7 @@ void doAttacks() randattack >= 3) Person::players[k]->animTarget = staffspinhitanim; //spinkick - else if ((tutoriallevel != 1 || !attackweapon) && + else if ((!Tutorial::active || !attackweapon) && distance < 2.5 * sq(Person::players[k]->scale * 5) && randattack == 1 && Animation::animations[Person::players[i]->animTarget].height != lowheight) @@ -3022,7 +2368,7 @@ void doAttacks() Person::players[k]->animTarget = wolfslapanim; } //sneak attacks - if ((k == 0) && (tutoriallevel != 1 || tutorialstage == 22) && + if ((k == 0) && (!Tutorial::active || Tutorial::stage == 22) && Person::players[i]->howactive < typedead1 && distance < 1.5 * sq(Person::players[k]->scale * 5) && !Person::players[i]->skeleton.free && @@ -3143,7 +2489,7 @@ void doAttacks() distance < 1.5 * sq(Person::players[k]->scale * 5)))) { Person::players[k]->victim = Person::players[i]; Person::players[k]->hasvictim = 1; - if (attackweapon && tutoriallevel != 1) { + if (attackweapon && !Tutorial::active) { //crouchstab if (Person::players[k]->crouchkeydown && attackweapon == knife && distance < 1.5 * sq(Person::players[k]->scale * 5)) Person::players[k]->animTarget = crouchstabanim; @@ -3168,13 +2514,13 @@ void doAttacks() terrain.decalalivetime[j] < 2) terrain.DeleteDecal(j); } - for (int l = 0; l < objects.numobjects; l++) { - if (objects.model[l].type == decalstype) - for (int j = 0; j < objects.model[l].numdecals; j++) { - if ((objects.model[l].decaltype[j] == blooddecal || - objects.model[l].decaltype[j] == blooddecalslow) && - objects.model[l].decalalivetime[j] < 2) - objects.model[l].DeleteDecal(j); + for (int l = 0; l < Object::objects.size(); l++) { + if (Object::objects[l]->model.type == decalstype) + for (int j = 0; j < Object::objects[l]->model.numdecals; j++) { + if ((Object::objects[l]->model.decaltype[j] == blooddecal || + Object::objects[l]->model.decaltype[j] == blooddecalslow) && + Object::objects[l]->model.decalalivetime[j] < 2) + Object::objects[l]->model.DeleteDecal(j); } } } @@ -3194,13 +2540,13 @@ void doAttacks() terrain.DeleteDecal(j); } } - for (int l = 0; l < objects.numobjects; l++) { - if (objects.model[l].type == decalstype) - for (int j = 0; j < objects.model[l].numdecals; j++) { - if ((objects.model[l].decaltype[j] == blooddecal || - objects.model[l].decaltype[j] == blooddecalslow) && - objects.model[l].decalalivetime[j] < 2) { - objects.model[l].DeleteDecal(j); + for (int l = 0; l < Object::objects.size(); l++) { + if (Object::objects[l]->model.type == decalstype) + for (int j = 0; j < Object::objects[l]->model.numdecals; j++) { + if ((Object::objects[l]->model.decaltype[j] == blooddecal || + Object::objects[l]->model.decaltype[j] == blooddecalslow) && + Object::objects[l]->model.decalalivetime[j] < 2) { + Object::objects[l]->model.DeleteDecal(j); } } } @@ -3411,7 +2757,7 @@ void doPlayerCollisions() (k != 0 || Person::players[k]->skeleton.free) || (Animation::animations[Person::players[i]->animTarget].height == highheight && Animation::animations[Person::players[k]->animTarget].height == highheight)) { - if (tutoriallevel != 1) { + if (!Tutorial::active) { emit_sound_at(heavyimpactsound, Person::players[i]->coords); } @@ -3655,7 +3001,7 @@ void doAI(unsigned i) if ((Person::players[i]->collided > .8 && Person::players[i]->jumppower >= 5)) Person::players[i]->jumpkeydown = 1; - if ((tutoriallevel != 1 || cananger) && + if ((!Tutorial::active || cananger) && hostile && !Person::players[0]->dead && distsq(&Person::players[i]->coords, &Person::players[0]->coords) < 400 && @@ -3678,7 +3024,7 @@ void doAI(unsigned i) if (distsq(&Person::players[i]->coords, &Person::players[j]->coords) < 400) if (normaldotproduct(Person::players[i]->facing, Person::players[j]->coords - Person::players[i]->coords) > 0) if (Person::players[j]->coords.y < Person::players[i]->coords.y + 5 || Person::players[j]->onterrain) - if (!Person::players[j]->isWallJump() && -1 == checkcollide( + if (!Person::players[j]->isWallJump() && -1 == Object::checkcollide( DoRotation(Person::players[i]->jointPos(head), 0, Person::players[i]->yaw, 0) *Person::players[i]->scale + Person::players[i]->coords, DoRotation(Person::players[j]->jointPos(head), 0, Person::players[j]->yaw, 0) @@ -3763,7 +3109,7 @@ void doAI(unsigned i) //hearing sounds if (!editorenabled) { if (Person::players[i]->howactive <= typesleeping) - if (numenvsounds > 0 && (tutoriallevel != 1 || cananger) && hostile) + if (numenvsounds > 0 && (!Tutorial::active || cananger) && hostile) for (int j = 0; j < numenvsounds; j++) { float vol = Person::players[i]->howactive == typesleeping ? envsoundvol[j] - 14 : envsoundvol[j]; if (vol > 0 && distsq(&Person::players[i]->coords, &envsound[j]) < @@ -3779,7 +3125,7 @@ void doAI(unsigned i) } if (Person::players[i]->howactive < typesleeping && - ((tutoriallevel != 1 || cananger) && hostile) && + ((!Tutorial::active || cananger) && hostile) && !Person::players[0]->dead && distsq(&Person::players[i]->coords, &Person::players[0]->coords) < 400 && Person::players[i]->occluded < 25) { @@ -3821,7 +3167,7 @@ void doAI(unsigned i) if (abs(Random() % 2) || Animation::animations[Person::players[j]->animTarget].height != lowheight || j != 0) if (distsq(&Person::players[i]->coords, &Person::players[j]->coords) < 400) if (normaldotproduct(Person::players[i]->facing, Person::players[j]->coords - Person::players[i]->coords) > 0) - if ((-1 == checkcollide( + if ((-1 == Object::checkcollide( DoRotation(Person::players[i]->jointPos(head), 0, Person::players[i]->yaw, 0)* Person::players[i]->scale + Person::players[i]->coords, DoRotation(Person::players[j]->jointPos(head), 0, Person::players[j]->yaw, 0)* @@ -3874,9 +3220,9 @@ void doAI(unsigned i) test2.y += 5; XYZ test = Person::players[i]->coords + Person::players[i]->facing; test.y -= 10; - j = checkcollide(test2, test, Person::players[i]->laststanding); + j = Object::checkcollide(test2, test, Person::players[i]->laststanding); if (j == -1) - j = checkcollide(test2, test); + j = Object::checkcollide(test2, test); if (j == -1) { Person::players[i]->velocity = 0; Person::players[i]->setAnimation(Person::players[i]->getStop()); @@ -3939,7 +3285,7 @@ void doAI(unsigned i) if ((Person::players[i]->collided > .8 && Person::players[i]->jumppower >= 5)) Person::players[i]->jumpkeydown = 1; - if (numenvsounds > 0 && ((tutoriallevel != 1 || cananger) && hostile)) + if (numenvsounds > 0 && ((!Tutorial::active || cananger) && hostile)) for (int k = 0; k < numenvsounds; k++) { if (distsq(&Person::players[i]->coords, &envsound[k]) < 2 * (envsoundvol[k] + envsoundvol[k] * (Person::players[i]->creature == rabbittype) * 3)) { Person::players[i]->aitype = attacktypecutoff; @@ -3950,7 +3296,7 @@ void doAI(unsigned i) Person::players[i]->losupdatedelay < 0 && !editorenabled && Person::players[i]->occluded < 2 && - ((tutoriallevel != 1 || cananger) && hostile)) { + ((!Tutorial::active || cananger) && hostile)) { Person::players[i]->losupdatedelay = .2; if (distsq(&Person::players[i]->coords, &Person::players[0]->coords) < 4 && Animation::animations[Person::players[i]->animTarget].height != lowheight) { Person::players[i]->aitype = attacktypecutoff; @@ -3960,7 +3306,7 @@ void doAI(unsigned i) //TODO: factor out canSeePlayer() if (distsq(&Person::players[i]->coords, &Person::players[0]->coords) < 400) if (normaldotproduct(Person::players[i]->facing, Person::players[0]->coords - Person::players[i]->coords) > 0) - if ((checkcollide( + if ((Object::checkcollide( DoRotation(Person::players[i]->jointPos(head), 0, Person::players[i]->yaw, 0)* Person::players[i]->scale + Person::players[i]->coords, DoRotation(Person::players[0]->jointPos(head), 0, Person::players[0]->yaw, 0)* @@ -4034,7 +3380,7 @@ void doAI(unsigned i) XYZ flatfacing = Person::players[Person::players[i]->ally]->coords; facing.y += Person::players[i]->jointPos(head).y * Person::players[i]->scale; flatfacing.y += Person::players[Person::players[i]->ally]->jointPos(head).y * Person::players[Person::players[i]->ally]->scale; - if (-1 != checkcollide(facing, flatfacing)) + if (-1 != Object::checkcollide(facing, flatfacing)) Person::players[i]->lastseentime -= .1; //no available ally, run back to player @@ -4123,7 +3469,7 @@ void doAI(unsigned i) Person::players[i]->lastseentime = 12; - if (!Person::players[0]->dead && ((tutoriallevel != 1 || cananger) && hostile)) + if (!Person::players[0]->dead && ((!Tutorial::active || cananger) && hostile)) if (Person::players[i]->ally < 0 || Person::players[i]->weaponactive != -1 || Person::players[i]->lastchecktime <= 0) { Person::players[i]->aitype = attacktypecutoff; Person::players[i]->lastseentime = 1; @@ -4251,9 +3597,9 @@ void doAI(unsigned i) test2.y += 5; XYZ test = Person::players[i]->coords + Person::players[i]->facing; test.y -= 10; - j = checkcollide(test2, test, Person::players[i]->laststanding); + j = Object::checkcollide(test2, test, Person::players[i]->laststanding); if (j == -1) - j = checkcollide(test2, test); + j = Object::checkcollide(test2, test); if (j == -1) { Person::players[i]->velocity = 0; Person::players[i]->setAnimation(Person::players[i]->getStop()); @@ -4358,7 +3704,7 @@ void doAI(unsigned i) for (unsigned j = 0; j < Person::players.size(); j++) if (j != i && !Person::players[j]->skeleton.free && Person::players[j]->hasvictim && - (tutoriallevel == 1 && reversaltrain || + (Tutorial::active && reversaltrain || Random() % 2 == 0 && difficulty == 2 || Random() % 4 == 0 && difficulty == 1 || Random() % 8 == 0 && difficulty == 0 || @@ -4409,7 +3755,7 @@ void doAI(unsigned i) if (Person::players[i]->jumpkeydown) Person::players[i]->attackkeydown = 0; - if (tutoriallevel == 1) + if (Tutorial::active) if (!canattack) Person::players[i]->attackkeydown = 0; @@ -4419,7 +3765,7 @@ void doAI(unsigned i) facing.y += Person::players[i]->jointPos(head).y * Person::players[i]->scale; flatfacing.y += Person::players[0]->jointPos(head).y * Person::players[0]->scale; if (Person::players[i]->occluded >= 2) - if (-1 != checkcollide(facing, flatfacing)) { + if (-1 != Object::checkcollide(facing, flatfacing)) { if (!Person::players[i]->pause) Person::players[i]->lastseentime -= .2; if (Person::players[i]->lastseentime <= 0 && @@ -4440,7 +3786,7 @@ void doAI(unsigned i) if (Person::players[0]->coords.y > terrain.getHeight(Person::players[0]->coords.x, Person::players[0]->coords.z) + 10) { XYZ test = Person::players[0]->coords; test.y -= 40; - if (-1 == checkcollide(Person::players[0]->coords, test)) + if (-1 == Object::checkcollide(Person::players[0]->coords, test)) Person::players[i]->stunned = 1; } //stunned @@ -4494,10 +3840,6 @@ void Game::Tick() static XYZ facing, flatfacing; static int target; - for (int i = 0; i < 15; i++) { - displaytime[i] += multiplier; - } - Input::Tick(); if (Input::isKeyPressed(SDL_SCANCODE_F6)) { @@ -4529,9 +3871,10 @@ void Game::Tick() } - if (Input::isKeyPressed(SDL_SCANCODE_TAB) && tutoriallevel) { - if (tutorialstage != 51) - tutorialstagetime = tutorialmaxtime; + if (Input::isKeyPressed(SDL_SCANCODE_TAB) && Tutorial::active) { + if (Tutorial::stage != 51) { + Tutorial::stagetime = Tutorial::maxtime; + } emit_sound_np(consolefailsound, 128.); } @@ -4686,7 +4029,7 @@ void Game::Tick() windvar += multiplier; smoketex += multiplier; - tutorialstagetime += multiplier; + Tutorial::stagetime += multiplier; //hotspots static float hotspotvisual[40]; @@ -4718,12 +4061,12 @@ void Game::Tick() } //Tutorial - if (tutoriallevel) { - doTutorial(); + if (Tutorial::active) { + Tutorial::Do(multiplier); } //bonuses - if (tutoriallevel != 1) { + if (!Tutorial::active) { if (bonustime == 0 && bonus != solidhit && bonus != spinecrusher && @@ -4744,7 +4087,7 @@ void Game::Tick() bonusnum[bonus]++; else bonusnum[bonus] += 0.15; - if (tutoriallevel) + if (Tutorial::active) bonusvalue = 0; bonusvalue /= bonusnum[bonus]; bonustotal += bonusvalue; @@ -5092,17 +4435,17 @@ void Game::Tick() Person::players[i]->avoidsomething = 0; //avoid flaming things - for (int j = 0; j < objects.numobjects; j++) - if (objects.onfire[j]) - if (distsq(&Person::players[i]->coords, &objects.position[j]) < sq(objects.scale[j]) * 200) - if ( distsq(&Person::players[i]->coords, &objects.position[j]) < + for (int j = 0; j < Object::objects.size(); j++) + if (Object::objects[j]->onfire) + if (distsq(&Person::players[i]->coords, &Object::objects[j]->position) < sq(Object::objects[j]->scale) * 200) + if ( distsq(&Person::players[i]->coords, &Object::objects[j]->position) < distsq(&Person::players[i]->coords, &Person::players[0]->coords)) { Person::players[i]->collided = 0; Person::players[i]->avoidcollided = 1; if (Person::players[i]->avoidsomething == 0 || - distsq(&Person::players[i]->coords, &objects.position[j]) < + distsq(&Person::players[i]->coords, &Object::objects[j]->position) < distsq(&Person::players[i]->coords, &Person::players[i]->avoidwhere)) { - Person::players[i]->avoidwhere = objects.position[j]; + Person::players[i]->avoidwhere = Object::objects[j]->position; Person::players[i]->avoidsomething = 1; } } @@ -5366,13 +4709,13 @@ void Game::Tick() if (Person::players.size() > 1) for (unsigned j = 0; j < Person::players.size(); j++) { if (i != j) - if (tutoriallevel != 1 || tutorialstage == 49) + if (!Tutorial::active || Tutorial::stage == 49) if (hostile) if (normaldotproduct(Person::players[i]->facing, Person::players[i]->coords - Person::players[j]->coords) < 0 && distsq(&Person::players[i]->coords, &Person::players[j]->coords) < 100 && distsq(&Person::players[i]->coords, &Person::players[j]->coords) > 1.5 && !Person::players[j]->skeleton.free && - -1 == checkcollide(DoRotation(Person::players[j]->jointPos(head), 0, Person::players[j]->yaw, 0)*Person::players[j]->scale + Person::players[j]->coords, DoRotation(Person::players[i]->jointPos(head), 0, Person::players[i]->yaw, 0)*Person::players[i]->scale + Person::players[i]->coords)) { + -1 == Object::checkcollide(DoRotation(Person::players[j]->jointPos(head), 0, Person::players[j]->yaw, 0)*Person::players[j]->scale + Person::players[j]->coords, DoRotation(Person::players[i]->jointPos(head), 0, Person::players[i]->yaw, 0)*Person::players[i]->scale + Person::players[i]->coords)) { if (!Person::players[i]->isFlip()) { Person::players[i]->throwtogglekeydown = 1; Person::players[i]->victim = Person::players[j]; @@ -5884,7 +5227,7 @@ void Game::Tick() } //do stuff - objects.DoStuff(); + Object::DoStuff(); for (int j = numenvsounds - 1; j >= 0; j--) { envsoundlife[j] -= multiplier; @@ -5896,79 +5239,8 @@ void Game::Tick() } OPENAL_SetFrequency(OPENAL_ALL, slomo); - if (tutoriallevel == 1) { - XYZ temp; - XYZ temp2; - XYZ temp3; - XYZ oldtemp; - XYZ oldtemp2; - temp.x = 1011; - temp.y = 84; - temp.z = 491; - temp2.x = 1025; - temp2.y = 75; - temp2.z = 447; - temp3.x = 1038; - temp3.y = 76; - temp3.z = 453; - oldtemp = temp; - oldtemp2 = temp2; - if (tutorialstage >= 51) - if (distsq(&temp, &Person::players[0]->coords) >= distsq(&temp, &temp2) - 1 || distsq(&temp3, &Person::players[0]->coords) < 4) { - OPENAL_StopSound(OPENAL_ALL); // hack...OpenAL renderer isn't stopping music after tutorial goes to level menu... - OPENAL_SetFrequency(OPENAL_ALL); - - emit_stream_np(stream_menutheme); - - gameon = 0; - mainmenu = 5; - - fireSound(); - - flash(); - } - if (tutorialstage < 51) - if (distsq(&temp, &Person::players[0]->coords) >= distsq(&temp, &temp2) - 1 || distsq(&temp3, &Person::players[0]->coords) < 4) { - emit_sound_at(fireendsound, Person::players[0]->coords); - - Person::players[0]->coords = (oldtemp + oldtemp2) / 2; - - flash(); - } - if (tutorialstage >= 14 && tutorialstage < 50) - if (distsq(&temp, &Person::players[1]->coords) >= distsq(&temp, &temp2) - 1 || distsq(&temp3, &Person::players[1]->coords) < 4) { - emit_sound_at(fireendsound, Person::players[1]->coords); - - for (unsigned i = 0; i < Person::players[1]->skeleton.joints.size(); i++) { - if (Random() % 2 == 0) { - if (!Person::players[1]->skeleton.free) - temp2 = (Person::players[1]->coords - Person::players[1]->oldcoords) / multiplier / 2; //velocity/2; - if (Person::players[1]->skeleton.free) - temp2 = Person::players[1]->skeleton.joints[i].velocity * Person::players[1]->scale / 2; - if (!Person::players[1]->skeleton.free) - temp = DoRotation(DoRotation(DoRotation(Person::players[1]->skeleton.joints[i].position, 0, 0, Person::players[1]->tilt), Person::players[1]->tilt2, 0, 0), 0, Person::players[1]->yaw, 0) * Person::players[1]->scale + Person::players[1]->coords; - if (Person::players[1]->skeleton.free) - temp = Person::players[1]->skeleton.joints[i].position * Person::players[1]->scale + Person::players[1]->coords; - Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1); - } - } - - Person::players[1]->coords = (oldtemp + oldtemp2) / 2; - for (unsigned i = 0; i < Person::players[1]->skeleton.joints.size(); i++) { - Person::players[1]->skeleton.joints[i].velocity = 0; - if (Random() % 2 == 0) { - if (!Person::players[1]->skeleton.free) - temp2 = (Person::players[1]->coords - Person::players[1]->oldcoords) / multiplier / 2; //velocity/2; - if (Person::players[1]->skeleton.free) - temp2 = Person::players[1]->skeleton.joints[i].velocity * Person::players[1]->scale / 2; - if (!Person::players[1]->skeleton.free) - temp = DoRotation(DoRotation(DoRotation(Person::players[1]->skeleton.joints[i].position, 0, 0, Person::players[1]->tilt), Person::players[1]->tilt2, 0, 0), 0, Person::players[1]->yaw, 0) * Person::players[1]->scale + Person::players[1]->coords; - if (Person::players[1]->skeleton.free) - temp = Person::players[1]->skeleton.joints[i].position * Person::players[1]->scale + Person::players[1]->coords; - Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1); - } - } - } + if (Tutorial::active) { + Tutorial::DoStuff(multiplier); } @@ -6188,7 +5460,7 @@ void Game::TickOnceAfter() maxalarmed = numalarmed; } - if (changedelay <= 0 && !loading && !editorenabled && gameon && !tutoriallevel && changedelay != -999 && !won) { + if (changedelay <= 0 && !loading && !editorenabled && gameon && !Tutorial::active && changedelay != -999 && !won) { if (Person::players[0]->dead && changedelay <= 0) { changedelay = 1; targetlevel = whichlevel; @@ -6233,7 +5505,7 @@ void Game::TickOnceAfter() Account::active().winLevel(whichlevel, bonustotal - startbonustotal, leveltime); } won = 1; - Account::active().saveFile(Folders::getUserSavePath()); + Account::saveFile(Folders::getUserSavePath()); } } @@ -6331,7 +5603,7 @@ void Game::TickOnceAfter() LoadStuff(); whichchoice = 0; actuallevel = campaignlevels[actuallevel].nextlevel.front(); - visibleloading = 1; + visibleloading = true; stillloading = 1; Loadlevel(campaignlevels[actuallevel].mapname.c_str()); campaign = 1; @@ -6396,20 +5668,20 @@ void Game::TickOnceAfter() viewer = cameraloc - facing * cameradist; colviewer = viewer; coltarget = cameraloc; - objects.SphereCheckPossible(&colviewer, findDistance(&colviewer, &coltarget)); + Object::SphereCheckPossible(&colviewer, findDistance(&colviewer, &coltarget)); if (terrain.patchobjectnum[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz]) for (int j = 0; j < terrain.patchobjectnum[Person::players[0]->whichpatchx][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) + if (Object::objects[i]->model.LineCheckPossible(&colviewer, &coltarget, &col, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1) viewer = col; } if (terrain.patchobjectnum[Person::players[0]->whichpatchx][Person::players[0]->whichpatchz]) for (int j = 0; j < terrain.patchobjectnum[Person::players[0]->whichpatchx][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) { + if (Object::objects[i]->model.SphereCheck(&colviewer, .15, &col, &Object::objects[i]->position, &Object::objects[i]->yaw) != -1) { viewer = colviewer; } }