-
- if (Input::isKeyPressed(SDL_SCANCODE_M) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
- editorenabled = 1 - editorenabled;
- if (editorenabled) {
- Person::players[0]->damagetolerance = 100000;
- } else {
- Person::players[0]->damagetolerance = 200;
- }
- Person::players[0]->damage = 0; // these lines were in both if and else, but I think they would better fit in the if
- Person::players[0]->permanentdamage = 0;
- Person::players[0]->superpermanentdamage = 0;
- Person::players[0]->bloodloss = 0;
- Person::players[0]->deathbleeding = 0;
- }
-
- //skip level
- if (whichlevel != -2 && Input::isKeyPressed(SDL_SCANCODE_K) && Input::isKeyDown(SDL_SCANCODE_LSHIFT) && !editorenabled) {
- targetlevel++;
- if (targetlevel > numchallengelevels - 1)
- targetlevel = 0;
- loading = 1;
- leveltime = 5;
- }
-
- if (editorenabled) {
- if (Input::isKeyPressed(SDL_SCANCODE_DELETE) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
- int closest = findClosestPlayer();
- if (closest >= 0) {
- Person::players.erase(Person::players.begin()+closest);
- }
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_DELETE) && Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- int closest = findClosestObject();
- if (closest >= 0)
- objects.position[closest].y -= 500;
- }
-
- 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;
- boxcoords.z = Person::players[0]->coords.z;
- boxcoords.y = Person::players[0]->coords.y - 3;
- if (editortype == bushtype)
- boxcoords.y = Person::players[0]->coords.y - .5;
- if (editortype == firetype)
- boxcoords.y = Person::players[0]->coords.y - .5;
- //objects.MakeObject(abs(Random()%3),boxcoords,Random()%360);
- float temprotat, temprotat2;
- temprotat = editoryaw;
- temprotat2 = editorpitch;
- if (temprotat < 0 || editortype == bushtype)
- temprotat = Random() % 360;
- if (temprotat2 < 0)
- temprotat2 = Random() % 360;
-
- objects.MakeObject(editortype, boxcoords, (int)temprotat - ((int)temprotat) % 30, (int)temprotat2, editorsize);
- if (editortype == treetrunktype)
- objects.MakeObject(treeleavestype, boxcoords, Random() % 360 * (temprotat2 < 2) + (int)editoryaw - ((int)editoryaw) % 30, editorpitch, editorsize);
- }
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_P) && Input::isKeyDown(SDL_SCANCODE_LSHIFT) && !Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- Person::players.push_back(shared_ptr<Person>(new Person()));
-
- Person::players.back()->scale = .2 * 5 * Person::players[0]->scale;
- Person::players.back()->creature = rabbittype;
- Person::players.back()->howactive = editoractive;
- Person::players.back()->skeleton.id = Person::players.size()-1;
- Person::players.back()->skeleton.Load((char *)":Data:Skeleton:Basic Figure", (char *)":Data:Skeleton:Basic Figurelow", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Body.solid", (char *)":Data:Models:Body2.solid", (char *)":Data:Models:Body3.solid", (char *)":Data:Models:Body4.solid", (char *)":Data:Models:Body5.solid", (char *)":Data:Models:Body6.solid", (char *)":Data:Models:Body7.solid", (char *)":Data:Models:Bodylow.solid", (char *)":Data:Models:Belt.solid", 1);
-
- int k = abs(Random() % 2) + 1;
- if (k == 0) {
- Person::players.back()->skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg", 1, &Person::players.back()->skeleton.skinText[0], &Person::players.back()->skeleton.skinsize);
- Person::players.back()->whichskin = 0;
- } else if (k == 1) {
- Person::players.back()->skeleton.drawmodel.textureptr.load(":Data:Textures:Fur.jpg", 1, &Person::players.back()->skeleton.skinText[0], &Person::players.back()->skeleton.skinsize);
- Person::players.back()->whichskin = 1;
- } else {
- Person::players.back()->skeleton.drawmodel.textureptr.load(":Data:Textures:Fur2.jpg", 1, &Person::players.back()->skeleton.skinText[0], &Person::players.back()->skeleton.skinsize);
- Person::players.back()->whichskin = 2;
- }
-
- Person::players.back()->skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png", 1, 1);
- Person::players.back()->power = 1;
- Person::players.back()->speedmult = 1;
- Person::players.back()->animCurrent = bounceidleanim;
- Person::players.back()->animTarget = bounceidleanim;
- Person::players.back()->frameCurrent = 0;
- Person::players.back()->frameTarget = 1;
- Person::players.back()->target = 0;
- Person::players.back()->bled = 0;
- Person::players.back()->speed = 1 + (float)(Random() % 100) / 1000;
-
- Person::players.back()->targetyaw = Person::players[0]->targetyaw;
- Person::players.back()->yaw = Person::players[0]->yaw;
-
- Person::players.back()->velocity = 0;
- Person::players.back()->coords = Person::players[0]->coords;
- Person::players.back()->oldcoords = Person::players.back()->coords;
- Person::players.back()->realoldcoords = Person::players.back()->coords;
-
- Person::players.back()->id = Person::players.size()-1;
- Person::players.back()->updatedelay = 0;
- Person::players.back()->normalsupdatedelay = 0;
-
- Person::players.back()->aitype = passivetype;
-
- if (Person::players[0]->creature == wolftype) {
- headprop = Person::players[0]->proportionhead.x / 1.1;
- bodyprop = Person::players[0]->proportionbody.x / 1.1;
- armprop = Person::players[0]->proportionarms.x / 1.1;
- legprop = Person::players[0]->proportionlegs.x / 1.1;
- }
-
- if (Person::players[0]->creature == rabbittype) {
- headprop = Person::players[0]->proportionhead.x / 1.2;
- bodyprop = Person::players[0]->proportionbody.x / 1.05;
- armprop = Person::players[0]->proportionarms.x / 1.00;
- legprop = Person::players[0]->proportionlegs.x / 1.1;
- }
-
- if (Person::players.back()->creature == wolftype) {
- Person::players.back()->proportionhead = 1.1 * headprop;
- Person::players.back()->proportionbody = 1.1 * bodyprop;
- Person::players.back()->proportionarms = 1.1 * armprop;
- Person::players.back()->proportionlegs = 1.1 * legprop;
- }
-
- if (Person::players.back()->creature == rabbittype) {
- Person::players.back()->proportionhead = 1.2 * headprop;
- Person::players.back()->proportionbody = 1.05 * bodyprop;
- Person::players.back()->proportionarms = 1.00 * armprop;
- Person::players.back()->proportionlegs = 1.1 * legprop;
- Person::players.back()->proportionlegs.y = 1.05 * legprop;
- }
-
- Person::players.back()->headless = 0;
- Person::players.back()->onfire = 0;
-
- if (cellophane) {
- Person::players.back()->proportionhead.z = 0;
- Person::players.back()->proportionbody.z = 0;
- Person::players.back()->proportionarms.z = 0;
- Person::players.back()->proportionlegs.z = 0;
- }
-
- Person::players.back()->tempanimation.Load((char *)"Tempanim", 0, 0);
-
- Person::players.back()->damagetolerance = 200;
-
- Person::players.back()->protectionhead = Person::players[0]->protectionhead;
- Person::players.back()->protectionhigh = Person::players[0]->protectionhigh;
- Person::players.back()->protectionlow = Person::players[0]->protectionlow;
- Person::players.back()->armorhead = Person::players[0]->armorhead;
- Person::players.back()->armorhigh = Person::players[0]->armorhigh;
- Person::players.back()->armorlow = Person::players[0]->armorlow;
- Person::players.back()->metalhead = Person::players[0]->metalhead;
- Person::players.back()->metalhigh = Person::players[0]->metalhigh;
- Person::players.back()->metallow = Person::players[0]->metallow;
-
- Person::players.back()->immobile = Person::players[0]->immobile;
-
- Person::players.back()->numclothes = Person::players[0]->numclothes;
- if (Person::players.back()->numclothes)
- for (int i = 0; i < Person::players.back()->numclothes; i++) {
- strcpy(Person::players.back()->clothes[i], Person::players[0]->clothes[i]);
- Person::players.back()->clothestintr[i] = Person::players[0]->clothestintr[i];
- Person::players.back()->clothestintg[i] = Person::players[0]->clothestintg[i];
- Person::players.back()->clothestintb[i] = Person::players[0]->clothestintb[i];
- tintr = Person::players.back()->clothestintr[i];
- tintg = Person::players.back()->clothestintg[i];
- tintb = Person::players.back()->clothestintb[i];
- AddClothes((char *)Person::players.back()->clothes[i], &Person::players.back()->skeleton.skinText[0]);
- }
- if (Person::players.back()->numclothes) {
- Person::players.back()->DoMipmaps();
- }
-
- Person::players.back()->power = Person::players[0]->power;
- Person::players.back()->speedmult = Person::players[0]->speedmult;
-
- Person::players.back()->damage = 0;
- Person::players.back()->permanentdamage = 0;
- Person::players.back()->superpermanentdamage = 0;
- Person::players.back()->deathbleeding = 0;
- Person::players.back()->bleeding = 0;
- Person::players.back()->numwaypoints = 0;
- Person::players.back()->waypoint = 0;
- Person::players.back()->jumppath = 0;
- Person::players.back()->weaponstuck = -1;
- Person::players.back()->weaponactive = -1;
- Person::players.back()->num_weapons = 0;
- Person::players.back()->bloodloss = 0;
- Person::players.back()->dead = 0;
-
- Person::players.back()->loaded = 1;
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_P) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
- if (Person::players.back()->numwaypoints < 90) {
- Person::players.back()->waypoints[Person::players.back()->numwaypoints] = Person::players[0]->coords;
- Person::players.back()->waypointtype[Person::players.back()->numwaypoints] = editorpathtype;
- Person::players.back()->numwaypoints++;
- }
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_P) && Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- if (numpathpoints < 30) {
- bool connected, alreadyconnected;
- connected = 0;
- if (numpathpoints > 1)
- for (int i = 0; i < numpathpoints; i++) {
- if (distsq(&pathpoint[i], &Person::players[0]->coords) < .5 && i != pathpointselected && !connected) {
- alreadyconnected = 0;
- for (int j = 0; j < numpathpointconnect[pathpointselected]; j++) {
- if (pathpointconnect[pathpointselected][j] == i)
- alreadyconnected = 1;
- }
- if (!alreadyconnected) {
- numpathpointconnect[pathpointselected]++;
- connected = 1;
- pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected] - 1] = i;
- }
- }
- }
- if (!connected) {
- numpathpoints++;
- pathpoint[numpathpoints - 1] = Person::players[0]->coords;
- numpathpointconnect[numpathpoints - 1] = 0;
- if (numpathpoints > 1 && pathpointselected != -1) {
- numpathpointconnect[pathpointselected]++;
- pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected] - 1] = numpathpoints - 1;
- }
- pathpointselected = numpathpoints - 1;
- }
- }
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_PERIOD)) {
- pathpointselected++;
- 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--;
- pathpoint[pathpointselected] = pathpoint[numpathpoints];
- numpathpointconnect[pathpointselected] = numpathpointconnect[numpathpoints];
- for (int i = 0; i < numpathpointconnect[pathpointselected]; i++) {
- pathpointconnect[pathpointselected][i] = pathpointconnect[numpathpoints][i];
- }
- for (int i = 0; i < numpathpoints; i++) {
- for (int j = 0; j < numpathpointconnect[i]; j++) {
- if (pathpointconnect[i][j] == pathpointselected) {
- pathpointconnect[i][j] = pathpointconnect[i][numpathpointconnect[i] - 1];
- numpathpointconnect[i]--;
- }
- if (pathpointconnect[i][j] == numpathpoints) {
- pathpointconnect[i][j] = pathpointselected;
- }
- }
- }
- pathpointselected = numpathpoints - 1;
- }
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_LEFT) && Input::isKeyDown(SDL_SCANCODE_LSHIFT) && !Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- editortype--;
- if (editortype == treeleavestype || editortype == 10)
- editortype--;
- if (editortype < 0)
- editortype = firetype;
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_RIGHT) && Input::isKeyDown(SDL_SCANCODE_LSHIFT) && !Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- editortype++;
- if (editortype == treeleavestype || editortype == 10)
- editortype++;
- if (editortype > firetype)
- editortype = 0;
- }
-
- if (Input::isKeyDown(SDL_SCANCODE_LEFT) && !Input::isKeyDown(SDL_SCANCODE_LSHIFT) && !Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- editoryaw -= multiplier * 100;
- if (editoryaw < -.01)
- editoryaw = -.01;
- }
-
- if (Input::isKeyDown(SDL_SCANCODE_RIGHT) && !Input::isKeyDown(SDL_SCANCODE_LSHIFT) && !Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- editoryaw += multiplier * 100;
- }
-
- if (Input::isKeyDown(SDL_SCANCODE_UP) && !Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- editorsize += multiplier;
- }
-
- if (Input::isKeyDown(SDL_SCANCODE_DOWN) && !Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- editorsize -= multiplier;
- if (editorsize < .1)
- editorsize = .1;
- }
-
-
- if (Input::isKeyPressed(SDL_SCANCODE_LEFT) && Input::isKeyDown(SDL_SCANCODE_LSHIFT) && Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- mapradius -= multiplier * 10;
- }
-
- 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;
- }
-
- if (Input::isKeyDown(SDL_SCANCODE_DOWN) && Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- editorpitch -= multiplier * 100;
- if (editorpitch < -.01)
- editorpitch = -.01;
- }
- if (Input::isKeyPressed(SDL_SCANCODE_DELETE) && objects.numobjects && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
- int closest = findClosestObject();
- if (closest >= 0)
- objects.DeleteObject(closest);
- }
- }
- }
-}
-
-void doJumpReversals()
-{
- 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 &&
- Person::players[i]->skeleton.oldfree == 0 &&
- (Person::players[i]->animTarget == jumpupanim ||
- 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))) {
- 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
- if (Person::players[i]->animTarget == jumpupanim &&
- Person::players[k]->animTarget != getupfrombackanim &&
- 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[i]->victim = Person::players[k];
- Person::players[i]->velocity = 0;
- Person::players[i]->animCurrent = jumpreversedanim;
- Person::players[i]->animTarget = jumpreversedanim;
- Person::players[i]->frameCurrent = 0;
- Person::players[i]->frameTarget = 1;
- Person::players[i]->targettilt2 = 0;
- Person::players[k]->victim = Person::players[i];
- Person::players[k]->velocity = 0;
- Person::players[k]->animCurrent = jumpreversalanim;
- Person::players[k]->animTarget = jumpreversalanim;
- Person::players[k]->frameCurrent = 0;
- Person::players[k]->frameTarget = 1;
- Person::players[k]->targettilt2 = 0;
- if (Person::players[i]->coords.y < Person::players[k]->coords.y + 1) {
- Person::players[i]->animCurrent = rabbitkickreversedanim;
- Person::players[i]->animTarget = rabbitkickreversedanim;
- Person::players[i]->frameCurrent = 1;
- Person::players[i]->frameTarget = 2;
- Person::players[k]->animCurrent = rabbitkickreversalanim;
- Person::players[k]->animTarget = rabbitkickreversalanim;
- Person::players[k]->frameCurrent = 1;
- Person::players[k]->frameTarget = 2;
- }
- Person::players[i]->target = 0;
- Person::players[k]->oldcoords = Person::players[k]->coords;
- Person::players[i]->coords = Person::players[k]->coords;
- Person::players[k]->targetyaw = Person::players[i]->targetyaw;
- Person::players[k]->yaw = Person::players[i]->targetyaw;
- if (Person::players[k]->aitype == attacktypecutoff)
- Person::players[k]->stunned = .5;
- }
- if (Person::players[k]->animTarget == jumpupanim &&
- Person::players[i]->animTarget != getupfrombackanim &&
- Person::players[i]->animTarget != getupfromfrontanim &&
- animation[Person::players[i]->animTarget].height == middleheight &&
- normaldotproduct(Person::players[k]->velocity, Person::players[i]->coords - Person::players[k]->coords) < 0 &&
- ((Person::players[i]->aitype == playercontrolled && Person::players[i]->attackkeydown) ||
- Person::players[i]->aitype != playercontrolled)) {
- Person::players[k]->victim = Person::players[i];
- Person::players[k]->velocity = 0;
- Person::players[k]->animCurrent = jumpreversedanim;
- Person::players[k]->animTarget = jumpreversedanim;
- Person::players[k]->frameCurrent = 0;
- Person::players[k]->frameTarget = 1;
- Person::players[k]->targettilt2 = 0;
- Person::players[i]->victim = Person::players[k];
- Person::players[i]->velocity = 0;
- Person::players[i]->animCurrent = jumpreversalanim;
- Person::players[i]->animTarget = jumpreversalanim;
- Person::players[i]->frameCurrent = 0;
- Person::players[i]->frameTarget = 1;
- Person::players[i]->targettilt2 = 0;
- if (Person::players[k]->coords.y < Person::players[i]->coords.y + 1) {
- Person::players[k]->animTarget = rabbitkickreversedanim;
- Person::players[k]->animCurrent = rabbitkickreversedanim;
- Person::players[i]->animCurrent = rabbitkickreversalanim;
- Person::players[i]->animTarget = rabbitkickreversalanim;
- Person::players[k]->frameCurrent = 1;
- Person::players[k]->frameTarget = 2;
- Person::players[i]->frameCurrent = 1;
- Person::players[i]->frameTarget = 2;
- }
- Person::players[k]->target = 0;
- Person::players[i]->oldcoords = Person::players[i]->coords;
- Person::players[k]->coords = Person::players[i]->coords;
- Person::players[i]->targetyaw = Person::players[k]->targetyaw;
- Person::players[i]->yaw = Person::players[k]->targetyaw;
- if (Person::players[i]->aitype == attacktypecutoff)
- Person::players[i]->stunned = .5;
- }
- }
- }
- }
-}
-
-void doAerialAcrobatics()
-{
- static XYZ facing, flatfacing;
- for (unsigned k = 0; k < Person::players.size(); k++) {
- Person::players[k]->turnspeed = 500;
-
- if ((Person::players[k]->isRun() &&
- ((Person::players[k]->targetyaw != rabbitrunninganim &&
- Person::players[k]->targetyaw != wolfrunninganim) ||
- Person::players[k]->frameTarget == 4)) ||
- Person::players[k]->animTarget == removeknifeanim ||
- Person::players[k]->animTarget == crouchremoveknifeanim ||
- Person::players[k]->animTarget == flipanim ||
- Person::players[k]->animTarget == fightsidestep ||
- Person::players[k]->animTarget == walkanim) {
- Person::players[k]->yaw = stepTowardf(Person::players[k]->yaw, Person::players[k]->targetyaw, multiplier * Person::players[k]->turnspeed);
- }
-
-
- if (Person::players[k]->isStop() ||
- Person::players[k]->isLanding() ||
- Person::players[k]->animTarget == staggerbackhighanim ||
- (Person::players[k]->animTarget == sneakanim && Person::players[k]->animCurrent == sneakanim) ||
- Person::players[k]->animTarget == staggerbackhardanim ||
- Person::players[k]->animTarget == backhandspringanim ||
- Person::players[k]->animTarget == dodgebackanim ||
- Person::players[k]->animTarget == rollanim ||
- (animation[Person::players[k]->animTarget].attack &&
- Person::players[k]->animTarget != rabbitkickanim &&
- (Person::players[k]->animTarget != crouchstabanim || Person::players[k]->hasvictim) &&
- (Person::players[k]->animTarget != swordgroundstabanim || Person::players[k]->hasvictim))) {
- Person::players[k]->yaw = stepTowardf(Person::players[k]->yaw, Person::players[k]->targetyaw, multiplier * Person::players[k]->turnspeed * 2);
- }
-
- if (Person::players[k]->animTarget == sneakanim && Person::players[k]->animCurrent != sneakanim) {
- 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)<viewdistance*viewdistance))*/
- Person::players[k]->DoStuff();
- if (Person::players[k]->immobile && k != 0)
- Person::players[k]->coords = Person::players[k]->realoldcoords;
-
- //if player's position has changed (?)
- if (distsq(&Person::players[k]->coords, &Person::players[k]->realoldcoords) > 0 &&
- !Person::players[k]->skeleton.free &&
- Person::players[k]->animTarget != climbanim &&
- Person::players[k]->animTarget != hanganim) {
- XYZ lowpoint, lowpointtarget, lowpoint2, lowpointtarget2, lowpoint3, lowpointtarget3, lowpoint4, lowpointtarget4, lowpoint5, lowpointtarget5, lowpoint6, lowpointtarget6, lowpoint7, lowpointtarget7, colpoint, colpoint2;
- int whichhit;
- bool tempcollide = 0;
-
- if (Person::players[k]->collide < -.3)
- Person::players[k]->collide = -.3;
- if (Person::players[k]->collide > 1)
- Person::players[k]->collide = 1;
- Person::players[k]->collide -= multiplier * 30;
-
- //clip to terrain
- Person::players[k]->coords.y = max(Person::players[k]->coords.y, terrain.getHeight(Person::players[k]->coords.x, Person::players[k]->coords.z));
-
- 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) {
- lowpoint = Person::players[k]->coords;
- if (Person::players[k]->animTarget != jumpupanim &&
- Person::players[k]->animTarget != jumpdownanim &&
- !Person::players[k]->isFlip())
- lowpoint.y += 1.25;
- else
- lowpoint.y += 1.3;
- 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) {
- flatfacing = lowpoint - Person::players[k]->coords;
- Person::players[k]->coords = lowpoint;
- Person::players[k]->coords.y -= 1.3;
- Person::players[k]->collide = 1;
- tempcollide = 1;
- //wall jumps
- //TODO: refactor four similar blocks
- if (Person::players[k]->aitype == playercontrolled &&
- (Person::players[k]->animTarget == jumpupanim ||
- Person::players[k]->animTarget == jumpdownanim ||
- Person::players[k]->isFlip()) &&
- !Person::players[k]->jumptogglekeydown &&
- 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) {
- 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);
- Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
- if (lowpointtarget.z < 0)
- Person::players[k]->yaw = 180 - Person::players[k]->yaw;
- Person::players[k]->targetyaw = Person::players[k]->yaw;
- Person::players[k]->lowyaw = Person::players[k]->yaw;
- if (k == 0)
- numwallflipped++;
- } 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) {
- 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);
- Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
- if (lowpointtarget.z < 0)
- Person::players[k]->yaw = 180 - Person::players[k]->yaw;
- Person::players[k]->targetyaw = Person::players[k]->yaw;
- Person::players[k]->lowyaw = Person::players[k]->yaw;
- if (k == 0)
- numwallflipped++;
- } 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) {
- 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);
- Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
- if (lowpointtarget.z < 0)
- Person::players[k]->yaw = 180 - Person::players[k]->yaw;
- Person::players[k]->targetyaw = Person::players[k]->yaw;
- Person::players[k]->lowyaw = Person::players[k]->yaw;
- if (k == 0)
- numwallflipped++;
- } 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) {
- 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);
- Person::players[k]->yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
- if (lowpointtarget.z < 0)
- Person::players[k]->yaw = 180 - Person::players[k]->yaw;
- Person::players[k]->yaw += 180;
- Person::players[k]->targetyaw = Person::players[k]->yaw;
- Person::players[k]->lowyaw = Person::players[k]->yaw;
- if (k == 0)
- numwallflipped++;
- }
- }
- }
- }
- }
- }
- } else if (objects.type[i] == 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) {
- Person::players[k]->coords = colpoint;
- Person::players[k]->collide = 1;
- tempcollide = 1;
-
- if (Person::players[k]->animTarget == jumpdownanim || Person::players[k]->isFlip()) {
- //flipped into a rock
- if (Person::players[k]->isFlip() && animation[Person::players[k]->animTarget].label[Person::players[k]->frameTarget] == 7)
- Person::players[k]->RagDoll(0);
-
- if (Person::players[k]->animTarget == jumpupanim) {
- Person::players[k]->jumppower = -4;
- Person::players[k]->animTarget = Person::players[k]->getIdle();
- }
- Person::players[k]->target = 0;
- Person::players[k]->frameTarget = 0;
- Person::players[k]->onterrain = 1;
-
- if (Person::players[k]->id == 0) {
- pause_sound(whooshsound);
- OPENAL_SetVolume(channels[whooshsound], 0);
- }
-
- //landing
- if ((Person::players[k]->animTarget == jumpdownanim || Person::players[k]->isFlip()) && !Person::players[k]->wasLanding()) {
- if (Person::players[k]->isFlip())
- Person::players[k]->jumppower = -4;
- Person::players[k]->animTarget = Person::players[k]->getLanding();
- emit_sound_at(landsound, Person::players[k]->coords, 128.);
- if (k == 0) {
- envsound[numenvsounds] = Person::players[k]->coords;
- envsoundvol[numenvsounds] = 16;
- envsoundlife[numenvsounds] = .4;
- numenvsounds++;
- }
-
- }
- }
- }
- }
- }
-
- 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;
- 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 (Person::players[k]->animTarget != jumpupanim &&
- Person::players[k]->animTarget != jumpdownanim &&
- Person::players[k]->onterrain)
- Person::players[k]->avoidcollided = 1;
- Person::players[k]->coords = lowpoint;
- Person::players[k]->coords.y -= 1.35;
- Person::players[k]->collide = 1;
-
- if ((Person::players[k]->grabdelay <= 0 || Person::players[k]->aitype != playercontrolled) &&
- (Person::players[k]->animCurrent != climbanim &&
- Person::players[k]->animCurrent != hanganim &&
- !Person::players[k]->isWallJump() ||
- 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]);
- 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]);
- if (whichhit != -1) {
- lowpoint = Person::players[k]->coords;
- lowpoint.y += .1;
- lowpointtarget = lowpoint + facing * 1.4;
- lowpoint2 = lowpoint;
- lowpointtarget2 = lowpointtarget;
- lowpoint3 = lowpoint;
- lowpointtarget3 = lowpointtarget;
- lowpoint4 = lowpoint;
- lowpointtarget4 = lowpointtarget;
- lowpoint5 = lowpoint;
- lowpointtarget5 = lowpointtarget;
- lowpoint6 = lowpoint;
- lowpointtarget6 = lowpointtarget;
- lowpoint7 = lowpoint;
- lowpointtarget7 = lowpoint;
- lowpoint2.x += .1;
- lowpointtarget2.x += .1;
- lowpoint3.z += .1;
- lowpointtarget3.z += .1;
- lowpoint4.x -= .1;
- lowpointtarget4.x -= .1;
- lowpoint5.z -= .1;
- lowpointtarget5.z -= .1;
- lowpoint6.y += 45 / 13;
- 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)
- 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)
- 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 (j <= 6 || j <= 25 && Person::players[k]->animTarget == jumpdownanim)
- break;
- if (Person::players[k]->animTarget == jumpupanim || Person::players[k]->animTarget == jumpdownanim) {
- lowpoint = Person::players[k]->coords;
- 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.y = lowpointtarget.y - .07;
- Person::players[k]->currentoffset = (flatfacing - Person::players[k]->coords) / Person::players[k]->scale;
-
- if (j > 10 || !Person::players[k]->isRun()) {
- if (Person::players[k]->animTarget == jumpdownanim || Person::players[k]->animTarget == jumpupanim) {
- if (k == 0)
- pause_sound(whooshsound);
- }
- emit_sound_at(jumpsound, Person::players[k]->coords, 128.);
-
- lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 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;
- Person::players[k]->targetyaw = Person::players[k]->yaw;
- Person::players[k]->lowyaw = Person::players[k]->yaw;
-
- //Person::players[k]->velocity=lowpointtarget*.03;
- Person::players[k]->velocity = 0;
-
- //climb ledge (?)
- if (Person::players[k]->animTarget == jumpupanim) {
- Person::players[k]->animTarget = climbanim;
- Person::players[k]->jumppower = 0;
- Person::players[k]->jumpclimb = 1;
- }
- Person::players[k]->transspeed = 6;
- Person::players[k]->target = 0;
- Person::players[k]->frameTarget = 1;
- //hang ledge (?)
- if (j > 25) {
- Person::players[k]->setAnimation(hanganim);
- Person::players[k]->jumppower = 0;
- }
- }
- break;
- }
- }
- }
- }
- }
- }
- }
- }
- if (Person::players[k]->collide <= 0) {
- //in the air
- if (!Person::players[k]->onterrain &&
- Person::players[k]->animTarget != jumpupanim &&
- Person::players[k]->animTarget != jumpdownanim &&
- Person::players[k]->animTarget != climbanim &&
- Person::players[k]->animTarget != hanganim &&
- !Person::players[k]->isWallJump() &&
- !Person::players[k]->isFlip()) {
- if (Person::players[k]->animCurrent != climbanim &&
- Person::players[k]->animCurrent != tempanim &&
- Person::players[k]->animTarget != backhandspringanim &&
- (Person::players[k]->animTarget != rollanim ||
- Person::players[k]->frameTarget < 2 ||
- Person::players[k]->frameTarget > 6)) {
- //stagger off ledge (?)
- if (Person::players[k]->animTarget == staggerbackhighanim || Person::players[k]->animTarget == staggerbackhardanim)
- Person::players[k]->RagDoll(0);
- Person::players[k]->setAnimation(jumpdownanim);
-
- if (!k)
- emit_sound_at(whooshsound, Person::players[k]->coords, 128.);
- }
- //gravity
- Person::players[k]->velocity.y += gravity;
- }
- }
- }
- Person::players[k]->realoldcoords = Person::players[k]->coords;
- }
-}