- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_O) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
- int closest = findClosestPlayer();
- if (closest >= 0) {
- if (Person::players[closest]->creature == wolftype) {
- headprop = Person::players[closest]->proportionhead.x / 1.1;
- bodyprop = Person::players[closest]->proportionbody.x / 1.1;
- armprop = Person::players[closest]->proportionarms.x / 1.1;
- legprop = Person::players[closest]->proportionlegs.x / 1.1;
- }
-
- if (Person::players[closest]->creature == rabbittype) {
- headprop = Person::players[closest]->proportionhead.x / 1.2;
- bodyprop = Person::players[closest]->proportionbody.x / 1.05;
- armprop = Person::players[closest]->proportionarms.x / 1.00;
- legprop = Person::players[closest]->proportionlegs.x / 1.1;
- }
-
-
- if (Person::players[closest]->creature == rabbittype) {
- Person::players[closest]->skeleton.id = closest;
- Person::players[closest]->skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf", (char *)":Data:Skeleton:Basic Figure Wolf Low", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Wolf.solid", (char *)":Data:Models:Wolf2.solid", (char *)":Data:Models:Wolf3.solid", (char *)":Data:Models:Wolf4.solid", (char *)":Data:Models:Wolf5.solid", (char *)":Data:Models:Wolf6.solid", (char *)":Data:Models:Wolf7.solid", (char *)":Data:Models:Wolflow.solid", (char *)":Data:Models:Belt.solid", 0);
- Person::players[closest]->skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &Person::players[closest]->skeleton.skinText[closest], &Person::players[closest]->skeleton.skinsize);
- Person::players[closest]->whichskin = 0;
- Person::players[closest]->creature = wolftype;
-
- Person::players[closest]->proportionhead = 1.1;
- Person::players[closest]->proportionbody = 1.1;
- Person::players[closest]->proportionarms = 1.1;
- Person::players[closest]->proportionlegs = 1.1;
- Person::players[closest]->proportionlegs.y = 1.1;
- Person::players[closest]->scale = .23 * 5 * Person::players[0]->scale;
-
- Person::players[closest]->damagetolerance = 300;
- } else {
- Person::players[closest]->skeleton.id = closest;
- Person::players[closest]->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);
- Person::players[closest]->skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg", 1, &Person::players[closest]->skeleton.skinText[0], &Person::players[closest]->skeleton.skinsize);
- Person::players[closest]->whichskin = 0;
- Person::players[closest]->creature = rabbittype;
-
- Person::players[closest]->proportionhead = 1.2;
- Person::players[closest]->proportionbody = 1.05;
- Person::players[closest]->proportionarms = 1.00;
- Person::players[closest]->proportionlegs = 1.1;
- Person::players[closest]->proportionlegs.y = 1.05;
- Person::players[closest]->scale = .2 * 5 * Person::players[0]->scale;
-
- Person::players[closest]->damagetolerance = 200;
- }
-
- if (Person::players[closest]->creature == wolftype) {
- Person::players[closest]->proportionhead = 1.1 * headprop;
- Person::players[closest]->proportionbody = 1.1 * bodyprop;
- Person::players[closest]->proportionarms = 1.1 * armprop;
- Person::players[closest]->proportionlegs = 1.1 * legprop;
- }
-
- if (Person::players[closest]->creature == rabbittype) {
- Person::players[closest]->proportionhead = 1.2 * headprop;
- Person::players[closest]->proportionbody = 1.05 * bodyprop;
- Person::players[closest]->proportionarms = 1.00 * armprop;
- Person::players[closest]->proportionlegs = 1.1 * legprop;
- Person::players[closest]->proportionlegs.y = 1.05 * legprop;
- }
-
- }
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_B) && !Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
- slomo = 1 - slomo;
- slomodelay = 1000;
- }
-
-
- if (((Input::isKeyPressed(SDL_SCANCODE_I) && !Input::isKeyDown(SDL_SCANCODE_LSHIFT)))) {
- int closest = -1;
- float closestdist = std::numeric_limits<float>::max();
-
- for (int i = 1; i < Person::players.size(); i++) {
- float distance = distsq(&Person::players[i]->coords, &Person::players[0]->coords);
- if (!Person::players[i]->headless)
- if (distance < closestdist) {
- closestdist = distance;
- closest = i;
- }
- }
-
- XYZ flatfacing2, flatvelocity2;
- XYZ blah;
- if (closest != -1 && distsq(&Person::players[closest]->coords, &Person::players[0]->coords) < 144) {
- blah = Person::players[closest]->coords;
- XYZ headspurtdirection;
- //int i = Person::players[closest]->skeleton.jointlabels[head];
- Joint& headjoint = Person::players[closest]->joint(head);
- for (int k = 0; k < Person::players[closest]->skeleton.num_joints; k++) {
- if (!Person::players[closest]->skeleton.free)
- flatvelocity2 = Person::players[closest]->velocity;
- if (Person::players[closest]->skeleton.free)
- flatvelocity2 = headjoint.velocity;
- if (!Person::players[closest]->skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(headjoint.position, 0, 0, Person::players[closest]->tilt), Person::players[closest]->tilt2, 0, 0), 0, Person::players[closest]->yaw, 0) * Person::players[closest]->scale + Person::players[closest]->coords;
- if (Person::players[closest]->skeleton.free)
- flatfacing2 = headjoint.position * Person::players[closest]->scale + Person::players[closest]->coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- headspurtdirection = headjoint.position - Person::players[closest]->jointPos(neck);
- Normalise(&headspurtdirection);
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, .6, 1);
- flatvelocity2 += headspurtdirection * 8;
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 / 2, 1, 1, 1, .16, 1);
- }
- Sprite::MakeSprite(cloudsprite, flatfacing2, flatvelocity2 * 0, .6, 0, 0, 1, .5);
-
- emit_sound_at(splattersound, blah);
- emit_sound_at(breaksound2, blah, 100.);
-
- if (Person::players[closest]->skeleton.free == 2)
- Person::players[closest]->skeleton.free = 0;
- Person::players[closest]->RagDoll(0);
- Person::players[closest]->dead = 2;
- Person::players[closest]->headless = 1;
- Person::players[closest]->DoBloodBig(3, 165);
-
- camerashake += .3;
- }
- }
-
- if (((Input::isKeyPressed(SDL_SCANCODE_I) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)))) {
- int closest = findClosestPlayer();
- XYZ flatfacing2, flatvelocity2;
- XYZ blah;
- if (closest >= 0 && distsq(&Person::players[closest]->coords, &Person::players[0]->coords) < 144) {
- blah = Person::players[closest]->coords;
- emit_sound_at(splattersound, blah);
- emit_sound_at(breaksound2, blah);
-
- for (int i = 0; i < Person::players[closest]->skeleton.num_joints; i++) {
- if (!Person::players[closest]->skeleton.free)
- flatvelocity2 = Person::players[closest]->velocity;
- if (Person::players[closest]->skeleton.free)
- flatvelocity2 = Person::players[closest]->skeleton.joints[i].velocity;
- if (!Person::players[closest]->skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(Person::players[closest]->skeleton.joints[i].position, 0, 0, Person::players[closest]->tilt), Person::players[closest]->tilt2, 0, 0), 0, Person::players[closest]->yaw, 0) * Person::players[closest]->scale + Person::players[closest]->coords;
- if (Person::players[closest]->skeleton.free)
- flatfacing2 = Person::players[closest]->skeleton.joints[i].position * Person::players[closest]->scale + Person::players[closest]->coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2, 1, 1, 1, .3, 1);
- Sprite::MakeSprite(cloudsprite, flatfacing2, flatvelocity2 * 0, .6, 0, 0, 1, .5);
- }
-
- for (int i = 0; i < Person::players[closest]->skeleton.num_joints; i++) {
- if (!Person::players[closest]->skeleton.free)
- flatvelocity2 = Person::players[closest]->velocity;
- if (Person::players[closest]->skeleton.free)
- flatvelocity2 = Person::players[closest]->skeleton.joints[i].velocity;
- if (!Person::players[closest]->skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(Person::players[closest]->skeleton.joints[i].position, 0, 0, Person::players[closest]->tilt), Person::players[closest]->tilt2, 0, 0), 0, Person::players[closest]->yaw, 0) * Person::players[closest]->scale + Person::players[closest]->coords;
- if (Person::players[closest]->skeleton.free)
- flatfacing2 = Person::players[closest]->skeleton.joints[i].position * Person::players[closest]->scale + Person::players[closest]->coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2, 1, 1, 1, .4, 1);
- }
-
- for (int i = 0; i < Person::players[closest]->skeleton.num_joints; i++) {
- if (!Person::players[closest]->skeleton.free)
- flatvelocity2 = Person::players[closest]->velocity;
- if (Person::players[closest]->skeleton.free)
- flatvelocity2 = Person::players[closest]->skeleton.joints[i].velocity;
- if (!Person::players[closest]->skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(Person::players[closest]->skeleton.joints[i].position, 0, 0, Person::players[closest]->tilt), Person::players[closest]->tilt2, 0, 0), 0, Person::players[closest]->yaw, 0) * Person::players[closest]->scale + Person::players[closest]->coords;
- if (Person::players[closest]->skeleton.free)
- flatfacing2 = Person::players[closest]->skeleton.joints[i].position * Person::players[closest]->scale + Person::players[closest]->coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, .4, 1);
- }
-
- for (int i = 0; i < Person::players[closest]->skeleton.num_joints; i++) {
- if (!Person::players[closest]->skeleton.free)
- flatvelocity2 = Person::players[closest]->velocity;
- if (Person::players[closest]->skeleton.free)
- flatvelocity2 = Person::players[closest]->skeleton.joints[i].velocity;
- if (!Person::players[closest]->skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(Person::players[closest]->skeleton.joints[i].position, 0, 0, Person::players[closest]->tilt), Person::players[closest]->tilt2, 0, 0), 0, Person::players[closest]->yaw, 0) * Person::players[closest]->scale + Person::players[closest]->coords;
- if (Person::players[closest]->skeleton.free)
- flatfacing2 = Person::players[closest]->skeleton.joints[i].position * Person::players[closest]->scale + Person::players[closest]->coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, .4, 1);
- }
-
- XYZ temppos;
- for (int j = 0; j < Person::players.size(); j++) {
- if (j != closest) {
- if (distsq(&Person::players[j]->coords, &Person::players[closest]->coords) < 25) {
- Person::players[j]->DoDamage((25 - distsq(&Person::players[j]->coords, &Person::players[closest]->coords)) * 60);
- if (Person::players[j]->skeleton.free == 2)
- Person::players[j]->skeleton.free = 1;
- Person::players[j]->skeleton.longdead = 0;
- Person::players[j]->RagDoll(0);
- for (int i = 0; i < Person::players[j]->skeleton.num_joints; i++) {
- temppos = Person::players[j]->skeleton.joints[i].position + Person::players[j]->coords;
- if (distsq(&temppos, &Person::players[closest]->coords) < 25) {
- flatvelocity2 = temppos - Person::players[closest]->coords;
- Normalise(&flatvelocity2);
- Person::players[j]->skeleton.joints[i].velocity += flatvelocity2 * ((20 - distsq(&temppos, &Person::players[closest]->coords)) * 20);
- }
- }
- }
- }
- }
-
- Person::players[closest]->DoDamage(10000);
- Person::players[closest]->RagDoll(0);
- Person::players[closest]->dead = 2;
- Person::players[closest]->coords = 20;
- Person::players[closest]->skeleton.free = 2;
-
- camerashake += .6;
-
- }
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_F)) {
- Person::players[0]->onfire = 1 - Person::players[0]->onfire;
- if (Person::players[0]->onfire) {
- Person::players[0]->CatchFire();
- }
- if (!Person::players[0]->onfire) {
- emit_sound_at(fireendsound, Person::players[0]->coords);
- pause_sound(stream_firesound);
- }
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_N) && !Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- //if(!Person::players[0]->skeleton.free)Person::players[0]->damage+=500;
- Person::players[0]->RagDoll(0);
- //Person::players[0]->spurt=1;
- //Person::players[0]->DoDamage(1000);
-
- emit_sound_at(whooshsound, Person::players[0]->coords, 128.);
- }
-
- if (Input::isKeyPressed(SDL_SCANCODE_N) && Input::isKeyDown(SDL_SCANCODE_LCTRL)) {
- for (int i = 0; i < objects.numobjects; i++) {
- if (objects.type[i] == treeleavestype) {
- objects.scale[i] *= .9;
- }
- }
- }
-
- 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 (int k = 0; k < Person::players.size(); k++)
- for (int 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 (int 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 && (/*Person::players[k]->jumptogglekeydown*/1 == 1 || Person::players[k]->aitype != playercontrolled))
- 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 = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[k], 0);
- lowpoint = Person::players[k]->coords;
- lowpoint.y += (float)j / 13;
- lowpointtarget = lowpoint + facing * 1.3;
- 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;
- }
-}
-
-void doAttacks()
-{
- static XYZ relative;
- static int randattack;
- static bool playerrealattackkeydown = 0;
-
- if (!Input::isKeyDown(attackkey))
- oldattackkey = 0;
- if (oldattackkey)
- Person::players[0]->attackkeydown = 0;
- if (oldattackkey)
- playerrealattackkeydown = 0;
- if (!oldattackkey)
- playerrealattackkeydown = Input::isKeyDown(attackkey);
- if ((Person::players[0]->parriedrecently <= 0 ||
- Person::players[0]->weaponactive == -1) &&
- (!oldattackkey ||
- (realthreat &&
- Person::players[0]->lastattack != swordslashanim &&
- Person::players[0]->lastattack != knifeslashstartanim &&
- Person::players[0]->lastattack != staffhitanim &&
- Person::players[0]->lastattack != staffspinhitanim)))
- Person::players[0]->attackkeydown = Input::isKeyDown(attackkey);
- if (Input::isKeyDown(attackkey) &&
- !oldattackkey &&
- !Person::players[0]->backkeydown) {
- for (int k = 0; k < Person::players.size(); k++) {
- if ((Person::players[k]->animTarget == swordslashanim ||
- Person::players[k]->animTarget == staffhitanim ||
- Person::players[k]->animTarget == staffspinhitanim) &&
- Person::players[0]->animCurrent != dodgebackanim &&
- !Person::players[k]->skeleton.free)
- Person::players[k]->Reverse();
- }
- }
-
- if (!hostile || indialogue != -1)
- Person::players[0]->attackkeydown = 0;
-
- for (int k = 0; k < Person::players.size(); k++) {
- if (indialogue != -1)
- Person::players[k]->attackkeydown = 0;
- if (Person::players[k]->animTarget != rabbitrunninganim && Person::players[k]->animTarget != wolfrunninganim) {
- if (Person::players[k]->aitype != playercontrolled)
- Person::players[k]->victim = Person::players[0];
- //attack key pressed
- if (Person::players[k]->attackkeydown) {
- //dodge backward
- if (Person::players[k]->backkeydown &&
- Person::players[k]->animTarget != backhandspringanim &&
- (Person::players[k]->isIdle() ||
- Person::players[k]->isStop() ||
- Person::players[k]->isRun() ||
- Person::players[k]->animTarget == walkanim)) {
- if (Person::players[k]->jumppower <= 1) {
- Person::players[k]->jumppower -= 2;
- } else {
- for (int i = 0; i < Person::players.size(); i++) {
- if (i == k)
- continue;
- if (Person::players[i]->animTarget == swordslashanim ||
- Person::players[i]->animTarget == knifeslashstartanim ||
- Person::players[i]->animTarget == staffhitanim ||
- Person::players[i]->animTarget == staffspinhitanim)
- if (distsq(&Person::players[k]->coords, &Person::players[i]->coords) < 6.5 && !Person::players[i]->skeleton.free) {
- Person::players[k]->setAnimation(dodgebackanim);
- Person::players[k]->targetyaw = roughDirectionTo(Person::players[k]->coords, Person::players[i]->coords);
- Person::players[k]->targettilt2 = pitchTo(Person::players[k]->coords, Person::players[i]->coords);
- }
- }
- if (Person::players[k]->animTarget != dodgebackanim) {
- if (k == 0)
- numflipped++;
- Person::players[k]->setAnimation(backhandspringanim);
- Person::players[k]->targetyaw = -yaw + 180;
- if (Person::players[k]->leftkeydown)
- Person::players[k]->targetyaw -= 45;
- if (Person::players[k]->rightkeydown)
- Person::players[k]->targetyaw += 45;
- Person::players[k]->yaw = Person::players[k]->targetyaw;
- Person::players[k]->jumppower -= 2;
- }
- }
- }
- //attack
- if (!animation[Person::players[k]->animTarget].attack &&
- !Person::players[k]->backkeydown &&
- (Person::players[k]->isIdle() ||
- Person::players[k]->isRun() ||
- Person::players[k]->animTarget == walkanim ||
- Person::players[k]->animTarget == sneakanim ||
- Person::players[k]->isCrouch())) {
- const int attackweapon = Person::players[k]->weaponactive == -1 ? 0 : weapons[Person::players[k]->weaponids[Person::players[k]->weaponactive]].getType();
- //normal attacks (?)
- Person::players[k]->hasvictim = 0;
- if (Person::players.size() > 1)
- for (int i = 0; i < Person::players.size(); i++) {
- if (i == k || !(k == 0 || i == 0))
- continue;
- if (!Person::players[k]->hasvictim)
- if (animation[Person::players[k]->animTarget].attack != reversal) {
- //choose an attack
- const float distance = distsq(&Person::players[k]->coords, &Person::players[i]->coords);
- if (distance < 4.5 &&
- !Person::players[i]->skeleton.free &&
- Person::players[i]->howactive < typedead1 &&
- Person::players[i]->animTarget != jumpreversedanim &&
- Person::players[i]->animTarget != rabbitkickreversedanim &&
- Person::players[i]->animTarget != rabbitkickanim &&
- Person::players[k]->animTarget != rabbitkickanim &&
- Person::players[i]->animTarget != getupfrombackanim &&
- (Person::players[i]->animTarget != staggerbackhighanim &&
- (Person::players[i]->animTarget != staggerbackhardanim ||
- animation[staggerbackhardanim].label[Person::players[i]->frameTarget] == 6)) &&
- Person::players[i]->animTarget != jumpdownanim &&
- Person::players[i]->animTarget != jumpupanim &&
- Person::players[i]->animTarget != getupfromfrontanim) {
- Person::players[k]->victim = Person::players[i];
- Person::players[k]->hasvictim = 1;
- if (Person::players[k]->aitype == playercontrolled) { //human player
- //sweep
- if (distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- Person::players[k]->crouchkeydown &&
- animation[Person::players[i]->animTarget].height != lowheight)
- Person::players[k]->animTarget = sweepanim;
- //winduppunch
- else if (distance < 1.5 * sq(Person::players[k]->scale * 5) &&
- animation[Person::players[i]->animTarget].height != lowheight &&
- !Person::players[k]->forwardkeydown &&
- !Person::players[k]->leftkeydown &&
- !Person::players[k]->rightkeydown &&
- !Person::players[k]->crouchkeydown &&
- !attackweapon &&
- !reversaltrain)
- Person::players[k]->animTarget = winduppunchanim;
- //upunch
- else if (distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- animation[Person::players[i]->animTarget].height != lowheight &&
- !Person::players[k]->forwardkeydown &&
- !Person::players[k]->leftkeydown &&
- !Person::players[k]->rightkeydown &&
- !Person::players[k]->crouchkeydown &&
- !attackweapon)
- Person::players[k]->animTarget = upunchanim;
- //knifefollow
- else if (distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- Person::players[i]->staggerdelay > 0 &&
- attackweapon == knife &&
- Person::players[i]->bloodloss > Person::players[i]->damagetolerance / 2)
- Person::players[k]->animTarget = knifefollowanim;
- //knifeslashstart
- else if (distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- animation[Person::players[i]->animTarget].height != lowheight &&
- !Person::players[k]->forwardkeydown &&
- !Person::players[k]->leftkeydown &&
- !Person::players[k]->rightkeydown &&
- !Person::players[k]->crouchkeydown &&
- attackweapon == knife &&
- Person::players[k]->weaponmissdelay <= 0)
- Person::players[k]->animTarget = knifeslashstartanim;
- //swordslash
- else if (distance < 4.5 * sq(Person::players[k]->scale * 5) &&
- animation[Person::players[i]->animTarget].height != lowheight &&
- !Person::players[k]->crouchkeydown &&
- attackweapon == sword &&
- Person::players[k]->weaponmissdelay <= 0)
- Person::players[k]->animTarget = swordslashanim;
- //staffhit
- else if (distance < 4.5 * sq(Person::players[k]->scale * 5) &&
- animation[Person::players[i]->animTarget].height != lowheight &&
- !Person::players[k]->crouchkeydown &&
- attackweapon == staff &&
- Person::players[k]->weaponmissdelay <= 0 &&
- !Person::players[k]->leftkeydown &&
- !Person::players[k]->rightkeydown &&
- !Person::players[k]->forwardkeydown)
- Person::players[k]->animTarget = staffhitanim;
- //staffspinhit
- else if (distance < 4.5 * sq(Person::players[k]->scale * 5) &&
- animation[Person::players[i]->animTarget].height != lowheight &&
- !Person::players[k]->crouchkeydown &&
- attackweapon == staff &&
- Person::players[k]->weaponmissdelay <= 0)
- Person::players[k]->animTarget = staffspinhitanim;
- //spinkick
- else if (distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- animation[Person::players[i]->animTarget].height != lowheight)
- Person::players[k]->animTarget = spinkickanim;
- //lowkick
- else if (distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- animation[Person::players[i]->animTarget].height == lowheight &&
- animation[Person::players[k]->animTarget].attack != normalattack)
- Person::players[k]->animTarget = lowkickanim;
- } else { //AI player
- if (distance < 4.5 * sq(Person::players[k]->scale * 5)) {
- randattack = abs(Random() % 5);
- if (!attackweapon && distance < 2.5 * sq(Person::players[k]->scale * 5)) {
- //sweep
- if (randattack == 0 && animation[Person::players[i]->animTarget].height != lowheight)
- Person::players[k]->animTarget = sweepanim;
- //upunch
- else if (randattack == 1 && animation[Person::players[i]->animTarget].height != lowheight &&
- !attackweapon)
- Person::players[k]->animTarget = upunchanim;
- //spinkick
- else if (randattack == 2 && animation[Person::players[i]->animTarget].height != lowheight)
- Person::players[k]->animTarget = spinkickanim;
- //lowkick
- else if (animation[Person::players[i]->animTarget].height == lowheight)
- Person::players[k]->animTarget = lowkickanim;
- }
- if (attackweapon) {
- //sweep
- if ((tutoriallevel != 1 || !attackweapon) &&
- distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- randattack == 0 &&
- animation[Person::players[i]->animTarget].height != lowheight)
- Person::players[k]->animTarget = sweepanim;
- //knifeslashstart
- else if (distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- attackweapon == knife &&
- Person::players[k]->weaponmissdelay <= 0)
- Person::players[k]->animTarget = knifeslashstartanim;
- //swordslash
- else if (!(Person::players[0]->victim == Person::players[i] &&
- Person::players[0]->hasvictim &&
- Person::players[0]->animTarget == swordslashanim) &&
- attackweapon == sword &&
- Person::players[k]->weaponmissdelay <= 0)
- Person::players[k]->animTarget = swordslashanim;
- //staffhit
- else if (!(Person::players[0]->victim == Person::players[i] &&
- Person::players[0]->hasvictim &&
- Person::players[0]->animTarget == swordslashanim) &&
- attackweapon == staff &&
- Person::players[k]->weaponmissdelay <= 0 &&
- randattack < 3)
- Person::players[k]->animTarget = staffhitanim;
- //staffspinhit
- else if (!(Person::players[0]->victim == Person::players[i] &&
- Person::players[0]->hasvictim &&
- Person::players[0]->animTarget == swordslashanim) &&
- attackweapon == staff &&
- Person::players[k]->weaponmissdelay <= 0 &&
- randattack >= 3)
- Person::players[k]->animTarget = staffspinhitanim;
- //spinkick
- else if ((tutoriallevel != 1 || !attackweapon) &&
- distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- randattack == 1 &&
- animation[Person::players[i]->animTarget].height != lowheight)
- Person::players[k]->animTarget = spinkickanim;
- //lowkick
- else if (distance < 2.5 * sq(Person::players[k]->scale * 5) &&
- animation[Person::players[i]->animTarget].height == lowheight &&
- animation[Person::players[k]->animTarget].attack != normalattack)
- Person::players[k]->animTarget = lowkickanim;
- }
- }
- }
- //upunch becomes wolfslap
- if (Person::players[k]->animTarget == upunchanim && Person::players[k]->creature == wolftype)
- Person::players[k]->animTarget = wolfslapanim;
- }
- //sneak attacks
- if ((k == 0) && (tutoriallevel != 1 || tutorialstage == 22) &&
- Person::players[i]->howactive < typedead1 &&
- distance < 1.5 * sq(Person::players[k]->scale * 5) &&
- !Person::players[i]->skeleton.free &&
- Person::players[i]->animTarget != getupfrombackanim &&
- Person::players[i]->animTarget != getupfromfrontanim &&
- (Person::players[i]->stunned > 0 && Person::players[k]->madskills ||
- Person::players[i]->surprised > 0 ||
- Person::players[i]->aitype == passivetype ||
- attackweapon && Person::players[i]->stunned > 0) &&
- normaldotproduct(Person::players[i]->facing, Person::players[i]->coords - Person::players[k]->coords) > 0) {
- //sneakattack
- if (!attackweapon) {
- Person::players[k]->animCurrent = sneakattackanim;
- Person::players[k]->animTarget = sneakattackanim;
- Person::players[i]->animCurrent = sneakattackedanim;
- Person::players[i]->animTarget = sneakattackedanim;
- Person::players[k]->oldcoords = Person::players[k]->coords;
- Person::players[k]->coords = Person::players[i]->coords;
- }
- //knifesneakattack
- if (attackweapon == knife) {
- Person::players[k]->animCurrent = knifesneakattackanim;
- Person::players[k]->animTarget = knifesneakattackanim;
- Person::players[i]->animCurrent = knifesneakattackedanim;
- Person::players[i]->animTarget = knifesneakattackedanim;
- Person::players[i]->oldcoords = Person::players[i]->coords;
- Person::players[i]->coords = Person::players[k]->coords;
- }
- //swordsneakattack
- if (attackweapon == sword) {
- Person::players[k]->animCurrent = swordsneakattackanim;
- Person::players[k]->animTarget = swordsneakattackanim;
- Person::players[i]->animCurrent = swordsneakattackedanim;
- Person::players[i]->animTarget = swordsneakattackedanim;
- Person::players[i]->oldcoords = Person::players[i]->coords;
- Person::players[i]->coords = Person::players[k]->coords;
- }
- if (attackweapon != staff) {
- Person::players[k]->victim = Person::players[i];
- Person::players[k]->hasvictim = 1;
- Person::players[i]->targettilt2 = 0;
- Person::players[i]->frameTarget = 1;
- Person::players[i]->frameCurrent = 0;
- Person::players[i]->target = 0;
- Person::players[i]->velocity = 0;
- Person::players[k]->targettilt2 = Person::players[i]->targettilt2;
- Person::players[k]->frameCurrent = Person::players[i]->frameCurrent;
- Person::players[k]->frameTarget = Person::players[i]->frameTarget;
- Person::players[k]->target = Person::players[i]->target;
- Person::players[k]->velocity = 0;
- Person::players[k]->targetyaw = Person::players[i]->yaw;
- Person::players[k]->yaw = Person::players[i]->yaw;
- Person::players[i]->targetyaw = Person::players[i]->yaw;
- }
- }
- if (animation[Person::players[k]->animTarget].attack == normalattack &&
- Person::players[k]->victim == Person::players[i] &&
- (!Person::players[i]->skeleton.free)) {
- oldattackkey = 1;
- Person::players[k]->frameTarget = 0;
- Person::players[k]->target = 0;
-
- Person::players[k]->targetyaw = roughDirectionTo(Person::players[k]->coords, Person::players[i]->coords);
- Person::players[k]->targettilt2 = pitchTo(Person::players[k]->coords, Person::players[i]->coords);
- Person::players[k]->lastattack3 = Person::players[k]->lastattack2;
- Person::players[k]->lastattack2 = Person::players[k]->lastattack;
- Person::players[k]->lastattack = Person::players[k]->animTarget;
- }
- if (Person::players[k]->animTarget == knifefollowanim &&
- Person::players[k]->victim == Person::players[i]) {
- oldattackkey = 1;
- Person::players[k]->targetyaw = roughDirectionTo(Person::players[k]->coords, Person::players[i]->coords);
- Person::players[k]->targettilt2 = pitchTo(Person::players[k]->coords, Person::players[i]->coords);
- Person::players[k]->victim = Person::players[i];
- Person::players[k]->hasvictim = 1;
- Person::players[i]->animTarget = knifefollowedanim;
- Person::players[i]->animCurrent = knifefollowedanim;
- Person::players[i]->targettilt2 = 0;
- Person::players[i]->targettilt2 = Person::players[k]->targettilt2;
- Person::players[i]->frameTarget = 1;
- Person::players[i]->frameCurrent = 0;
- Person::players[i]->target = 0;
- Person::players[i]->velocity = 0;
- Person::players[k]->animCurrent = knifefollowanim;
- Person::players[k]->animTarget = knifefollowanim;
- Person::players[k]->targettilt2 = Person::players[i]->targettilt2;
- Person::players[k]->frameCurrent = Person::players[i]->frameCurrent;
- Person::players[k]->frameTarget = Person::players[i]->frameTarget;
- Person::players[k]->target = Person::players[i]->target;
- Person::players[k]->velocity = 0;
- Person::players[k]->oldcoords = Person::players[k]->coords;
- Person::players[i]->coords = Person::players[k]->coords;
- Person::players[i]->targetyaw = Person::players[k]->targetyaw;
- Person::players[i]->yaw = Person::players[k]->targetyaw;
- Person::players[k]->yaw = Person::players[k]->targetyaw;
- Person::players[i]->yaw = Person::players[k]->targetyaw;
- }
- }
- }
- const bool hasstaff = attackweapon == staff;
- if (k == 0 && Person::players.size() > 1)
- for (int i = 0; i < Person::players.size(); i++) {
- if (i == k)
- continue;
- if ((playerrealattackkeydown || Person::players[i]->dead || !hasstaff) &&
- animation[Person::players[k]->animTarget].attack == neutral) {
- const float distance = distsq(&Person::players[k]->coords, &Person::players[i]->coords);
- if (!Person::players[i]->dead || !realthreat || (!attackweapon && Person::players[k]->crouchkeydown))
- if (Person::players[i]->skeleton.free)
- if (distance < 3.5 * sq(Person::players[k]->scale * 5) &&
- (Person::players[i]->dead ||
- Person::players[i]->skeleton.longdead > 1000 ||
- Person::players[k]->isRun() ||
- hasstaff ||
- (attackweapon &&
- (Person::players[i]->skeleton.longdead > 2000 ||
- Person::players[i]->damage > Person::players[i]->damagetolerance / 8 ||
- Person::players[i]->bloodloss > Person::players[i]->damagetolerance / 2) &&
- 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) {
- //crouchstab
- if (Person::players[k]->crouchkeydown && attackweapon == knife && distance < 1.5 * sq(Person::players[k]->scale * 5))
- Person::players[k]->animTarget = crouchstabanim;
- //swordgroundstab
- if (Person::players[k]->crouchkeydown && distance < 1.5 * sq(Person::players[k]->scale * 5) && attackweapon == sword)
- Person::players[k]->animTarget = swordgroundstabanim;
- //staffgroundsmash
- if (distance < 3.5 * sq(Person::players[k]->scale * 5) && attackweapon == staff)
- Person::players[k]->animTarget = staffgroundsmashanim;
- }
- if (distance < 2.5 &&
- Person::players[k]->crouchkeydown &&
- Person::players[k]->animTarget != crouchstabanim &&
- !attackweapon &&
- Person::players[i]->dead &&
- Person::players[i]->skeleton.free &&
- Person::players[i]->skeleton.longdead > 1000) {
- Person::players[k]->animTarget = killanim;
- //TODO: refactor this out, what does it do?
- for (int j = 0; j < terrain.numdecals; j++) {
- if ((terrain.decaltype[j] == blooddecal || terrain.decaltype[j] == blooddecalslow) &&
- 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);
- }
- }
- }
- if (!Person::players[i]->dead || musictype != 2)
- if (distance < 3.5 &&
- (Person::players[k]->isRun() || Person::players[k]->isIdle() && Person::players[k]->attackkeydown) &&
- Person::players[k]->staggerdelay <= 0 &&
- (Person::players[i]->dead ||
- Person::players[i]->skeleton.longdead < 300 &&
- Person::players[k]->lastattack != spinkickanim &&
- Person::players[i]->skeleton.free) &&
- (!Person::players[i]->dead || musictype != stream_fighttheme)) {
- Person::players[k]->animTarget = dropkickanim;
- for (int j = 0; j < terrain.numdecals; j++) {
- if ((terrain.decaltype[j] == blooddecal || terrain.decaltype[j] == blooddecalslow) &&
- 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);
- }
- }
- }
- }
- }
- if (animation[Person::players[k]->animTarget].attack == normalattack &&
- Person::players[k]->victim == Person::players[i] &&
- (!Person::players[i]->skeleton.free ||
- Person::players[k]->animTarget == killanim ||
- Person::players[k]->animTarget == crouchstabanim ||
- Person::players[k]->animTarget == swordgroundstabanim ||
- Person::players[k]->animTarget == staffgroundsmashanim ||
- Person::players[k]->animTarget == dropkickanim)) {
- oldattackkey = 1;
- Person::players[k]->frameTarget = 0;
- Person::players[k]->target = 0;
-
- XYZ targetpoint = Person::players[i]->coords;
- if (Person::players[k]->animTarget == crouchstabanim ||
- Person::players[k]->animTarget == swordgroundstabanim ||
- Person::players[k]->animTarget == staffgroundsmashanim) {
- targetpoint += (Person::players[i]->jointPos(abdomen) +
- Person::players[i]->jointPos(neck)) / 2 *
- Person::players[i]->scale;
- }
- Person::players[k]->targetyaw = roughDirectionTo(Person::players[k]->coords, targetpoint);
- Person::players[k]->targettilt2 = pitchTo(Person::players[k]->coords, targetpoint);
-
- if (Person::players[k]->animTarget == crouchstabanim || Person::players[k]->animTarget == swordgroundstabanim) {
- Person::players[k]->targetyaw += (float)(abs(Random() % 100) - 50) / 4;
- }
-
- if (Person::players[k]->animTarget == staffgroundsmashanim)
- Person::players[k]->targettilt2 += 10;
-
- Person::players[k]->lastattack3 = Person::players[k]->lastattack2;
- Person::players[k]->lastattack2 = Person::players[k]->lastattack;
- Person::players[k]->lastattack = Person::players[k]->animTarget;
-
- if (Person::players[k]->animTarget == swordgroundstabanim) {
- Person::players[k]->targetyaw += 30;
- }
- }
- }
- }
- if (!Person::players[k]->hasvictim) {
- //find victim
- for (int i = 0; i < Person::players.size(); i++) {
- if (i == k || !(i == 0 || k == 0))
- continue;
- if (!Person::players[i]->skeleton.free) {
- if (Person::players[k]->hasvictim) {
- if (distsq(&Person::players[k]->coords, &Person::players[i]->coords) <
- distsq(&Person::players[k]->coords, &Person::players[k]->victim->coords))
- Person::players[k]->victim = Person::players[i];
- } else {
- Person::players[k]->victim = Person::players[i];
- Person::players[k]->hasvictim = 1;
- }
- }
- }
- }
- if (Person::players[k]->aitype == playercontrolled)
- //rabbit kick
- if (Person::players[k]->attackkeydown &&
- Person::players[k]->isRun() &&
- Person::players[k]->wasRun() &&
- ((Person::players[k]->hasvictim &&
- distsq(&Person::players[k]->coords, &Person::players[k]->victim->coords) < 12 * sq(Person::players[k]->scale * 5) &&
- distsq(&Person::players[k]->coords, &Person::players[k]->victim->coords) > 7 * sq(Person::players[k]->scale * 5) &&
- !Person::players[k]->victim->skeleton.free &&
- Person::players[k]->victim->animTarget != getupfrombackanim &&
- Person::players[k]->victim->animTarget != getupfromfrontanim &&
- animation[Person::players[k]->victim->animTarget].height != lowheight &&
- Person::players[k]->aitype != playercontrolled && //wat???
- normaldotproduct(Person::players[k]->facing, Person::players[k]->victim->coords - Person::players[k]->coords) > 0 &&
- Person::players[k]->rabbitkickenabled) ||
- Person::players[k]->jumpkeydown)) {
- oldattackkey = 1;
- Person::players[k]->setAnimation(rabbitkickanim);
- }
- //update counts
- if (animation[Person::players[k]->animTarget].attack && k == 0) {
- numattacks++;
- switch (attackweapon) {
- case 0:
- numunarmedattack++;
- break;
- case knife:
- numknifeattack++;
- break;
- case sword:
- numswordattack++;
- break;
- case staff:
- numstaffattack++;
- break;
- }
- }
- }
- }
- }
- }
-}
-
-void doPlayerCollisions()
-{
- static XYZ rotatetarget;
- static float collisionradius;
- if (Person::players.size() > 1)
- for (int k = 0; k < Person::players.size(); k++)
- for (int i = k + 1; i < Person::players.size(); i++) {
- //neither player is part of a reversal
- if ((animation[Person::players[i]->animTarget].attack != reversed &&
- animation[Person::players[i]->animTarget].attack != reversal &&
- animation[Person::players[k]->animTarget].attack != reversed &&
- animation[Person::players[k]->animTarget].attack != reversal) || (i != 0 && k != 0))
- if ((animation[Person::players[i]->animCurrent].attack != reversed &&
- animation[Person::players[i]->animCurrent].attack != reversal &&
- animation[Person::players[k]->animCurrent].attack != reversed &&
- animation[Person::players[k]->animCurrent].attack != reversal) || (i != 0 && k != 0))
- //neither is sleeping
- if (Person::players[i]->howactive <= typesleeping && Person::players[k]->howactive <= typesleeping)
- if (Person::players[i]->howactive != typesittingwall && Person::players[k]->howactive != typesittingwall)
- //in same patch, neither is climbing
- if (Person::players[i]->whichpatchx == Person::players[k]->whichpatchx &&
- Person::players[i]->whichpatchz == Person::players[k]->whichpatchz &&
- Person::players[k]->skeleton.oldfree == Person::players[k]->skeleton.free &&
- Person::players[i]->skeleton.oldfree == Person::players[i]->skeleton.free &&
- Person::players[i]->animTarget != climbanim &&
- Person::players[i]->animTarget != hanganim &&
- Person::players[k]->animTarget != climbanim &&
- Person::players[k]->animTarget != hanganim)
- //players are close (bounding box test)
- if (Person::players[i]->coords.y > Person::players[k]->coords.y - 3)
- if (Person::players[i]->coords.y < Person::players[k]->coords.y + 3)
- if (Person::players[i]->coords.x > Person::players[k]->coords.x - 3)
- if (Person::players[i]->coords.x < Person::players[k]->coords.x + 3)
- if (Person::players[i]->coords.z > Person::players[k]->coords.z - 3)
- if (Person::players[i]->coords.z < Person::players[k]->coords.z + 3) {
- //spread fire from player to player
- if (distsq(&Person::players[i]->coords, &Person::players[k]->coords)
- < 3 * sq((Person::players[i]->scale + Person::players[k]->scale) * 2.5)) {
- if (Person::players[i]->onfire || Person::players[k]->onfire) {
- if (!Person::players[i]->onfire)
- Person::players[i]->CatchFire();
- if (!Person::players[k]->onfire)
- Person::players[k]->CatchFire();
- }
- }
-
- XYZ tempcoords1 = Person::players[i]->coords;
- XYZ tempcoords2 = Person::players[k]->coords;
- if (!Person::players[i]->skeleton.oldfree)
- tempcoords1.y += Person::players[i]->jointPos(abdomen).y * Person::players[i]->scale;
- if (!Person::players[k]->skeleton.oldfree)
- tempcoords2.y += Person::players[k]->jointPos(abdomen).y * Person::players[k]->scale;
- collisionradius = 1.2 * sq((Person::players[i]->scale + Person::players[k]->scale) * 2.5);
- if (Person::players[0]->hasvictim)
- if (Person::players[0]->animTarget == rabbitkickanim && (k == 0 || i == 0) && !Person::players[0]->victim->skeleton.free)
- collisionradius = 3;
- if ((!Person::players[i]->skeleton.oldfree || !Person::players[k]->skeleton.oldfree) &&
- (distsq(&tempcoords1, &tempcoords2) < collisionradius ||
- distsq(&Person::players[i]->coords, &Person::players[k]->coords) < collisionradius)) {
- //jump down on a dead body
- if (k == 0 || i == 0) {
- int l = i ? i : k;
- if (Person::players[0]->animTarget == jumpdownanim &&
- !Person::players[0]->skeleton.oldfree &&
- !Person::players[0]->skeleton.free &&
- Person::players[l]->skeleton.oldfree &&
- Person::players[l]->skeleton.free &&
- Person::players[l]->dead &&
- Person::players[0]->lastcollide <= 0 &&
- fabs(Person::players[l]->coords.y - Person::players[0]->coords.y) < .2 &&
- distsq(&Person::players[0]->coords, &Person::players[l]->coords) < .7 * sq((Person::players[l]->scale + Person::players[0]->scale) * 2.5)) {
- Person::players[0]->coords.y = Person::players[l]->coords.y;
- Person::players[l]->velocity = Person::players[0]->velocity;
- Person::players[l]->skeleton.free = 0;
- Person::players[l]->yaw = 0;
- Person::players[l]->RagDoll(0);
- Person::players[l]->DoDamage(20);
- camerashake += .3;
- Person::players[l]->skeleton.longdead = 0;
- Person::players[0]->lastcollide = 1;
- }
- }
-
- if ( (Person::players[i]->skeleton.oldfree == 1 && findLengthfast(&Person::players[i]->velocity) > 1) ||
- (Person::players[k]->skeleton.oldfree == 1 && findLengthfast(&Person::players[k]->velocity) > 1) ||
- (Person::players[i]->skeleton.oldfree == 0 && Person::players[k]->skeleton.oldfree == 0)) {
- rotatetarget = Person::players[k]->velocity - Person::players[i]->velocity;
- if ((Person::players[i]->animTarget != getupfrombackanim && Person::players[i]->animTarget != getupfromfrontanim ||
- Person::players[i]->skeleton.free) &&
- (Person::players[k]->animTarget != getupfrombackanim && Person::players[k]->animTarget != getupfromfrontanim ||
- Person::players[k]->skeleton.free))
- if ((((k != 0 && findLengthfast(&rotatetarget) > 150 ||
- k == 0 && findLengthfast(&rotatetarget) > 50 && Person::players[0]->rabbitkickragdoll) &&
- normaldotproduct(rotatetarget, Person::players[k]->coords - Person::players[i]->coords) > 0) &&
- (k == 0 ||
- k != 0 && Person::players[i]->skeleton.oldfree == 1 && animation[Person::players[k]->animCurrent].attack == neutral ||
- /*i!=0&&*/Person::players[k]->skeleton.oldfree == 1 && animation[Person::players[i]->animCurrent].attack == neutral)) ||
- (Person::players[i]->animTarget == jumpupanim || Person::players[i]->animTarget == jumpdownanim || Person::players[i]->isFlip()) &&
- (Person::players[k]->animTarget == jumpupanim || Person::players[k]->animTarget == jumpdownanim || Person::players[k]->isFlip()) &&
- k == 0 && !Person::players[i]->skeleton.oldfree && !Person::players[k]->skeleton.oldfree) {
- //If hit by body
- if ( (i != 0 || Person::players[i]->skeleton.free) &&
- (k != 0 || Person::players[k]->skeleton.free) ||
- (animation[Person::players[i]->animTarget].height == highheight &&
- animation[Person::players[k]->animTarget].height == highheight)) {
- if (tutoriallevel != 1) {
- emit_sound_at(heavyimpactsound, Person::players[i]->coords);
- }
-
- Person::players[i]->RagDoll(0);
- if (Person::players[i]->damage > Person::players[i]->damagetolerance - findLengthfast(&rotatetarget) / 4 && !Person::players[i]->dead) {
- award_bonus(0, aimbonus);
- }
- Person::players[i]->DoDamage(findLengthfast(&rotatetarget) / 4);
- Person::players[k]->RagDoll(0);
- if (Person::players[k]->damage > Person::players[k]->damagetolerance - findLengthfast(&rotatetarget) / 4 && !Person::players[k]->dead) {
- award_bonus(0, aimbonus); // Huh, again?
- }
- Person::players[k]->DoDamage(findLengthfast(&rotatetarget) / 4);
-
- for (int j = 0; j < Person::players[i]->skeleton.num_joints; j++) {
- Person::players[i]->skeleton.joints[j].velocity = Person::players[i]->skeleton.joints[j].velocity / 5 + Person::players[k]->velocity;
- }
- for (int j = 0; j < Person::players[k]->skeleton.num_joints; j++) {
- Person::players[k]->skeleton.joints[j].velocity = Person::players[k]->skeleton.joints[j].velocity / 5 + Person::players[i]->velocity;
- }
-
- }
- }
- if ( (animation[Person::players[i]->animTarget].attack == neutral ||
- animation[Person::players[i]->animTarget].attack == normalattack) &&
- (animation[Person::players[k]->animTarget].attack == neutral ||
- animation[Person::players[k]->animTarget].attack == normalattack)) {
- //If bumped
- if (Person::players[i]->skeleton.oldfree == 0 && Person::players[k]->skeleton.oldfree == 0) {
- if (distsq(&Person::players[k]->coords, &Person::players[i]->coords) < .5 * sq((Person::players[i]->scale + Person::players[k]->scale) * 2.5)) {
- rotatetarget = Person::players[k]->coords - Person::players[i]->coords;
- Normalise(&rotatetarget);
- Person::players[k]->coords = (Person::players[k]->coords + Person::players[i]->coords) / 2;
- Person::players[i]->coords = Person::players[k]->coords - rotatetarget * fast_sqrt(.6) / 2
- * sq((Person::players[i]->scale + Person::players[k]->scale) * 2.5);
- Person::players[k]->coords += rotatetarget * fast_sqrt(.6) / 2 * sq((Person::players[i]->scale + Person::players[k]->scale) * 2.5);
- if (Person::players[k]->howactive == typeactive || hostile)
- if (Person::players[k]->isIdle()) {
- if (Person::players[k]->howactive < typesleeping)
- Person::players[k]->setAnimation(Person::players[k]->getStop());
- else if (Person::players[k]->howactive == typesleeping)
- Person::players[k]->setAnimation(getupfromfrontanim);
- if (!editorenabled)
- Person::players[k]->howactive = typeactive;
- }
- if (Person::players[i]->howactive == typeactive || hostile)
- if (Person::players[i]->isIdle()) {
- if (Person::players[i]->howactive < typesleeping)
- Person::players[i]->setAnimation(Person::players[k]->getStop());
- else
- Person::players[i]->setAnimation(getupfromfrontanim);
- if (!editorenabled)
- Person::players[i]->howactive = typeactive;
- }
- }
- //jump down on player
- if (hostile) {
- if (k == 0 && i != 0 && Person::players[k]->animTarget == jumpdownanim &&
- !Person::players[i]->isCrouch() &&
- Person::players[i]->animTarget != rollanim &&
- !Person::players[k]->skeleton.oldfree && !
- Person::players[k]->skeleton.free &&
- Person::players[k]->lastcollide <= 0 &&
- Person::players[k]->velocity.y < -10) {
- Person::players[i]->velocity = Person::players[k]->velocity;
- Person::players[k]->velocity = Person::players[k]->velocity * -.5;
- Person::players[k]->velocity.y = Person::players[i]->velocity.y;
- Person::players[i]->DoDamage(20);
- Person::players[i]->RagDoll(0);
- Person::players[k]->lastcollide = 1;
- award_bonus(k, AboveBonus);
- }
- if (i == 0 && k != 0 && Person::players[i]->animTarget == jumpdownanim &&
- !Person::players[k]->isCrouch() &&
- Person::players[k]->animTarget != rollanim &&
- !Person::players[i]->skeleton.oldfree &&
- !Person::players[i]->skeleton.free &&
- Person::players[i]->lastcollide <= 0 &&
- Person::players[i]->velocity.y < -10) {
- Person::players[k]->velocity = Person::players[i]->velocity;
- Person::players[i]->velocity = Person::players[i]->velocity * -.3;
- Person::players[i]->velocity.y = Person::players[k]->velocity.y;
- Person::players[k]->DoDamage(20);
- Person::players[k]->RagDoll(0);
- Person::players[i]->lastcollide = 1;
- award_bonus(i, AboveBonus);
- }
- }
- }
- }
- }
- Person::players[i]->CheckKick();
- Person::players[k]->CheckKick();
- }
- }
- }
-}
-
-void doAI(int i)
-{
- static bool connected;
- if (Person::players[i]->aitype != playercontrolled && indialogue == -1) {
- Person::players[i]->jumpclimb = 0;
- //disable movement in editor
- if (editorenabled)
- Person::players[i]->stunned = 1;
-
- Person::players[i]->pause = 0;
- if (distsqflat(&Person::players[0]->coords, &Person::players[i]->coords) < 30 &&
- Person::players[0]->coords.y > Person::players[i]->coords.y + 2 &&
- !Person::players[0]->onterrain)
- Person::players[i]->pause = 1;
-
- //pathfinding
- if (Person::players[i]->aitype == pathfindtype) {
- if (Person::players[i]->finalpathfindpoint == -1) {
- float closestdistance;
- float tempdist;
- int closest;
- XYZ colpoint;
- closest = -1;
- closestdistance = -1;
- for (int j = 0; j < numpathpoints; j++)
- if (closest == -1 || distsq(&Person::players[i]->finalfinaltarget, &pathpoint[j]) < closestdistance) {
- closestdistance = distsq(&Person::players[i]->finalfinaltarget, &pathpoint[j]);
- closest = j;
- Person::players[i]->finaltarget = pathpoint[j];
- }
- Person::players[i]->finalpathfindpoint = closest;
- for (int j = 0; j < numpathpoints; j++)
- for (int k = 0; k < numpathpointconnect[j]; k++) {
- DistancePointLine(&Person::players[i]->finalfinaltarget, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist, &colpoint );
- if (sq(tempdist) < closestdistance)
- if (findDistance(&colpoint, &pathpoint[j]) + findDistance(&colpoint, &pathpoint[pathpointconnect[j][k]]) <
- findDistance(&pathpoint[j], &pathpoint[pathpointconnect[j][k]]) + .1) {
- closestdistance = sq(tempdist);
- closest = j;
- Person::players[i]->finaltarget = colpoint;
- }
- }
- Person::players[i]->finalpathfindpoint = closest;
-
- }
- if (Person::players[i]->targetpathfindpoint == -1) {
- float closestdistance;
- float tempdist;
- int closest;
- XYZ colpoint;
- closest = -1;
- closestdistance = -1;
- if (Person::players[i]->lastpathfindpoint == -1) {
- for (int j = 0; j < numpathpoints; j++) {
- if (j != Person::players[i]->lastpathfindpoint)
- if (closest == -1 || (distsq(&Person::players[i]->coords, &pathpoint[j]) < closestdistance)) {
- closestdistance = distsq(&Person::players[i]->coords, &pathpoint[j]);
- closest = j;
- }
- }
- Person::players[i]->targetpathfindpoint = closest;
- for (int j = 0; j < numpathpoints; j++)
- if (j != Person::players[i]->lastpathfindpoint)
- for (int k = 0; k < numpathpointconnect[j]; k++) {
- DistancePointLine(&Person::players[i]->coords, &pathpoint[j], &pathpoint[pathpointconnect[j][k]], &tempdist, &colpoint );
- if (sq(tempdist) < closestdistance) {
- if (findDistance(&colpoint, &pathpoint[j]) + findDistance(&colpoint, &pathpoint[pathpointconnect[j][k]]) <
- findDistance(&pathpoint[j], &pathpoint[pathpointconnect[j][k]]) + .1) {
- closestdistance = sq(tempdist);
- closest = j;
- }
- }