- if (Person::players[i]->lastseentime <= 0) {
- Person::players[i]->aitype = searchtype;
- Person::players[i]->lastchecktime = 12;
- Person::players[i]->lastseen = Person::players[j]->coords;
- Person::players[i]->lastseentime = 12;
- }
- }
- }
- }
- }
- //alerted surprise
- if (Person::players[i]->aitype == attacktypecutoff && musictype != 2) {
- if (Person::players[i]->creature != wolftype) {
- Person::players[i]->stunned = .6;
- Person::players[i]->surprised = .6;
- }
- if (Person::players[i]->creature == wolftype) {
- Person::players[i]->stunned = .47;
- Person::players[i]->surprised = .47;
- }
- numseen++;
- }
- }
-
- //search for player
- int j;
- if (Person::players[i]->aitype == searchtype) {
- Person::players[i]->aiupdatedelay -= multiplier;
- Person::players[i]->losupdatedelay -= multiplier;
- if (!Person::players[i]->pause)
- Person::players[i]->lastseentime -= multiplier;
- Person::players[i]->lastchecktime -= multiplier;
-
- if (Person::players[i]->isRun() && !Person::players[i]->onground) {
- if (Person::players[i]->coords.y > terrain.getHeight(Person::players[i]->coords.x, Person::players[i]->coords.z) + 10) {
- XYZ test2 = Person::players[i]->coords + Person::players[i]->facing;
- test2.y += 5;
- XYZ test = Person::players[i]->coords + Person::players[i]->facing;
- test.y -= 10;
- j = checkcollide(test2, test, Person::players[i]->laststanding);
- if (j == -1)
- j = checkcollide(test2, test);
- if (j == -1) {
- Person::players[i]->velocity = 0;
- Person::players[i]->setAnimation(Person::players[i]->getStop());
- Person::players[i]->targetyaw += 180;
- Person::players[i]->stunned = .5;
- //Person::players[i]->aitype=passivetype;
- Person::players[i]->aitype = pathfindtype;
- Person::players[i]->finalfinaltarget = Person::players[i]->waypoints[Person::players[i]->waypoint];
- Person::players[i]->finalpathfindpoint = -1;
- Person::players[i]->targetpathfindpoint = -1;
- Person::players[i]->lastpathfindpoint = -1;
- Person::players[i]->lastpathfindpoint2 = -1;
- Person::players[i]->lastpathfindpoint3 = -1;
- Person::players[i]->lastpathfindpoint4 = -1;
- } else
- Person::players[i]->laststanding = j;
- }
- }
- //check out last seen location
- if (Person::players[i]->aiupdatedelay < 0) {
- Person::players[i]->targetyaw = roughDirectionTo(Person::players[i]->coords, Person::players[i]->lastseen);
- Person::players[i]->lookyaw = Person::players[i]->targetyaw;
- Person::players[i]->aiupdatedelay = .05;
- Person::players[i]->forwardkeydown = 1;
-
- if (distsqflat(&Person::players[i]->coords, &Person::players[i]->lastseen) < 1 * sq(Person::players[i]->scale * 5) || Person::players[i]->lastchecktime < 0) {
- Person::players[i]->forwardkeydown = 0;
- Person::players[i]->aiupdatedelay = 1;
- Person::players[i]->lastseen.x += (float(Random() % 100) - 50) / 25;
- Person::players[i]->lastseen.z += (float(Random() % 100) - 50) / 25;
- Person::players[i]->lastchecktime = 3;
- }
-
- Person::players[i]->leftkeydown = 0;
- Person::players[i]->backkeydown = 0;
- Person::players[i]->rightkeydown = 0;
- Person::players[i]->crouchkeydown = 0;
- Person::players[i]->attackkeydown = 0;
- Person::players[i]->throwkeydown = 0;
-
- if (Person::players[i]->avoidcollided > .8 && !Person::players[i]->jumpkeydown && Person::players[i]->collided < .8) {
- if (!Person::players[i]->avoidsomething)
- Person::players[i]->targetyaw += 90 * (Person::players[i]->whichdirection * 2 - 1);
- else {
- XYZ leftpos, rightpos;
- float leftdist, rightdist;
- leftpos = Person::players[i]->coords + DoRotation(Person::players[i]->facing, 0, 90, 0);
- rightpos = Person::players[i]->coords - DoRotation(Person::players[i]->facing, 0, 90, 0);
- leftdist = distsq(&leftpos, &Person::players[i]->avoidwhere);
- rightdist = distsq(&rightpos, &Person::players[i]->avoidwhere);
- if (leftdist < rightdist)
- Person::players[i]->targetyaw += 90;
- else
- Person::players[i]->targetyaw -= 90;
- }
- }
- }
- if (Person::players[i]->collided < 1 || Person::players[i]->animTarget != jumpupanim)
- Person::players[i]->jumpkeydown = 0;
- if ((Person::players[i]->collided > .8 && Person::players[i]->jumppower >= 5))
- Person::players[i]->jumpkeydown = 1;
-
- if (numenvsounds > 0 && ((tutoriallevel != 1 || cananger) && hostile))
- for (int k = 0; k < numenvsounds; k++) {
- if (distsq(&Person::players[i]->coords, &envsound[k]) < 2 * (envsoundvol[k] + envsoundvol[k] * (Person::players[i]->creature == rabbittype) * 3)) {
- Person::players[i]->aitype = attacktypecutoff;
- }
- }
-
- if (!Person::players[0]->dead &&
- Person::players[i]->losupdatedelay < 0 &&
- !editorenabled &&
- Person::players[i]->occluded < 2 &&
- ((tutoriallevel != 1 || cananger) && hostile)) {
- Person::players[i]->losupdatedelay = .2;
- if (distsq(&Person::players[i]->coords, &Person::players[0]->coords) < 4 && Animation::animations[Person::players[i]->animTarget].height != lowheight) {
- Person::players[i]->aitype = attacktypecutoff;
- Person::players[i]->lastseentime = 1;
- }
- if (abs(Random() % 2) || Animation::animations[Person::players[i]->animTarget].height != lowheight)
- //TODO: factor out canSeePlayer()
- if (distsq(&Person::players[i]->coords, &Person::players[0]->coords) < 400)
- if (normaldotproduct(Person::players[i]->facing, Person::players[0]->coords - Person::players[i]->coords) > 0)
- if ((checkcollide(
- DoRotation(Person::players[i]->jointPos(head), 0, Person::players[i]->yaw, 0)*
- Person::players[i]->scale + Person::players[i]->coords,
- DoRotation(Person::players[0]->jointPos(head), 0, Person::players[0]->yaw, 0)*
- Person::players[0]->scale + Person::players[0]->coords) == -1) ||
- (Person::players[0]->animTarget == hanganim && normaldotproduct(
- Person::players[0]->facing, Person::players[i]->coords - Person::players[0]->coords) < 0)) {
- /* //TODO: changed j to 0 on a whim, make sure this is correct
- (Person::players[j]->animTarget==hanganim&&normaldotproduct(
- Person::players[j]->facing,Person::players[i]->coords-Person::players[j]->coords)<0)
- */
- Person::players[i]->aitype = attacktypecutoff;
- Person::players[i]->lastseentime = 1;
- }
- }
- //player escaped
- if (Person::players[i]->lastseentime < 0) {
- //Person::players[i]->aitype=passivetype;
- numescaped++;
- Person::players[i]->aitype = pathfindtype;
- Person::players[i]->finalfinaltarget = Person::players[i]->waypoints[Person::players[i]->waypoint];
- Person::players[i]->finalpathfindpoint = -1;
- Person::players[i]->targetpathfindpoint = -1;
- Person::players[i]->lastpathfindpoint = -1;
- Person::players[i]->lastpathfindpoint2 = -1;
- Person::players[i]->lastpathfindpoint3 = -1;
- Person::players[i]->lastpathfindpoint4 = -1;
- }
- }
-
- if (Person::players[i]->aitype != gethelptype)
- Person::players[i]->runninghowlong = 0;
-
- //get help from buddies
- if (Person::players[i]->aitype == gethelptype) {
- Person::players[i]->runninghowlong += multiplier;
- Person::players[i]->aiupdatedelay -= multiplier;
-
- if (Person::players[i]->aiupdatedelay < 0 || Person::players[i]->ally == 0) {
- Person::players[i]->aiupdatedelay = .2;
-
- //find closest ally
- //TODO: factor out closest search somehow
- if (!Person::players[i]->ally) {
- int closest = -1;
- float closestdist = -1;
- for (unsigned k = 0; k < Person::players.size(); k++) {
- if (k != i && k != 0 && !Person::players[k]->dead &&
- Person::players[k]->howactive < typedead1 &&
- !Person::players[k]->skeleton.free &&
- Person::players[k]->aitype == passivetype) {
- float distance = distsq(&Person::players[i]->coords, &Person::players[k]->coords);
- if (closestdist == -1 || distance < closestdist) {
- closestdist = distance;
- closest = k;
- }
- closest = k;
- }
- }
- if (closest != -1)
- Person::players[i]->ally = closest;
- else
- Person::players[i]->ally = 0;
- Person::players[i]->lastseen = Person::players[0]->coords;
- Person::players[i]->lastseentime = 12;
- }
-
-
- Person::players[i]->lastchecktime = 12;
-
- XYZ facing = Person::players[i]->coords;
- XYZ flatfacing = Person::players[Person::players[i]->ally]->coords;
- facing.y += Person::players[i]->jointPos(head).y * Person::players[i]->scale;
- flatfacing.y += Person::players[Person::players[i]->ally]->jointPos(head).y * Person::players[Person::players[i]->ally]->scale;
- if (-1 != checkcollide(facing, flatfacing))
- Person::players[i]->lastseentime -= .1;
-
- //no available ally, run back to player
- if (Person::players[i]->ally <= 0 ||
- Person::players[Person::players[i]->ally]->skeleton.free ||
- Person::players[Person::players[i]->ally]->aitype != passivetype ||
- Person::players[i]->lastseentime <= 0) {
- Person::players[i]->aitype = searchtype;
- Person::players[i]->lastseentime = 12;
- }
-
- //seek out ally
- if (Person::players[i]->ally > 0) {
- Person::players[i]->targetyaw = roughDirectionTo(Person::players[i]->coords, Person::players[Person::players[i]->ally]->coords);
- Person::players[i]->lookyaw = Person::players[i]->targetyaw;
- Person::players[i]->aiupdatedelay = .05;
- Person::players[i]->forwardkeydown = 1;
-
- if (distsqflat(&Person::players[i]->coords, &Person::players[Person::players[i]->ally]->coords) < 3) {
- Person::players[i]->aitype = searchtype;
- Person::players[i]->lastseentime = 12;
- Person::players[Person::players[i]->ally]->aitype = searchtype;
- if (Person::players[Person::players[i]->ally]->lastseentime < Person::players[i]->lastseentime) {
- Person::players[Person::players[i]->ally]->lastseen = Person::players[i]->lastseen;
- Person::players[Person::players[i]->ally]->lastseentime = Person::players[i]->lastseentime;
- Person::players[Person::players[i]->ally]->lastchecktime = Person::players[i]->lastchecktime;
- }
- }
-
- if (Person::players[i]->avoidcollided > .8 && !Person::players[i]->jumpkeydown && Person::players[i]->collided < .8) {
- if (!Person::players[i]->avoidsomething)
- Person::players[i]->targetyaw += 90 * (Person::players[i]->whichdirection * 2 - 1);
- else {
- XYZ leftpos, rightpos;
- float leftdist, rightdist;
- leftpos = Person::players[i]->coords + DoRotation(Person::players[i]->facing, 0, 90, 0);
- rightpos = Person::players[i]->coords - DoRotation(Person::players[i]->facing, 0, 90, 0);
- leftdist = distsq(&leftpos, &Person::players[i]->avoidwhere);
- rightdist = distsq(&rightpos, &Person::players[i]->avoidwhere);
- if (leftdist < rightdist)
- Person::players[i]->targetyaw += 90;
- else
- Person::players[i]->targetyaw -= 90;
- }
- }
- }
-
- Person::players[i]->leftkeydown = 0;
- Person::players[i]->backkeydown = 0;
- Person::players[i]->rightkeydown = 0;
- Person::players[i]->crouchkeydown = 0;
- Person::players[i]->attackkeydown = 0;
- }
- if (Person::players[i]->collided < 1 || Person::players[i]->animTarget != jumpupanim)
- Person::players[i]->jumpkeydown = 0;
- if (Person::players[i]->collided > .8 && Person::players[i]->jumppower >= 5)
- Person::players[i]->jumpkeydown = 1;
- }
-
- //retreiving a weapon on the ground
- if (Person::players[i]->aitype == getweapontype) {
- Person::players[i]->aiupdatedelay -= multiplier;
- Person::players[i]->lastchecktime -= multiplier;
-
- if (Person::players[i]->aiupdatedelay < 0) {
- Person::players[i]->aiupdatedelay = .2;
-
- //ALLY IS WEPON
- if (Person::players[i]->ally < 0) {
- int closest = -1;
- float closestdist = -1;
- for (unsigned k = 0; k < weapons.size(); k++)
- if (weapons[k].owner == -1) {
- float distance = distsq(&Person::players[i]->coords, &weapons[k].position);
- if (closestdist == -1 || distance < closestdist) {
- closestdist = distance;
- closest = k;
- }
- closest = k;
- }
- if (closest != -1)
- Person::players[i]->ally = closest;
- else
- Person::players[i]->ally = -1;
- }
-
- Person::players[i]->lastseentime = 12;
-
- if (!Person::players[0]->dead && ((tutoriallevel != 1 || cananger) && hostile))
- if (Person::players[i]->ally < 0 || Person::players[i]->weaponactive != -1 || Person::players[i]->lastchecktime <= 0) {
- Person::players[i]->aitype = attacktypecutoff;
- Person::players[i]->lastseentime = 1;
- }
- if (!Person::players[0]->dead)
- if (Person::players[i]->ally >= 0) {
- if (weapons[Person::players[i]->ally].owner != -1 ||
- distsq(&Person::players[i]->coords, &weapons[Person::players[i]->ally].position) > 16) {
- Person::players[i]->aitype = attacktypecutoff;
- Person::players[i]->lastseentime = 1;
- }
- //TODO: factor these out as moveToward()
- Person::players[i]->targetyaw = roughDirectionTo(Person::players[i]->coords, weapons[Person::players[i]->ally].position);
- Person::players[i]->lookyaw = Person::players[i]->targetyaw;
- Person::players[i]->aiupdatedelay = .05;
- Person::players[i]->forwardkeydown = 1;
-
-
- if (Person::players[i]->avoidcollided > .8 && !Person::players[i]->jumpkeydown && Person::players[i]->collided < .8) {
- if (!Person::players[i]->avoidsomething)
- Person::players[i]->targetyaw += 90 * (Person::players[i]->whichdirection * 2 - 1);
- else {
- XYZ leftpos, rightpos;
- float leftdist, rightdist;
- leftpos = Person::players[i]->coords + DoRotation(Person::players[i]->facing, 0, 90, 0);
- rightpos = Person::players[i]->coords - DoRotation(Person::players[i]->facing, 0, 90, 0);
- leftdist = distsq(&leftpos, &Person::players[i]->avoidwhere);
- rightdist = distsq(&rightpos, &Person::players[i]->avoidwhere);
- if (leftdist < rightdist)
- Person::players[i]->targetyaw += 90;
- else
- Person::players[i]->targetyaw -= 90;
- }
- }
- }
-
- Person::players[i]->leftkeydown = 0;
- Person::players[i]->backkeydown = 0;
- Person::players[i]->rightkeydown = 0;
- Person::players[i]->attackkeydown = 0;
- Person::players[i]->throwkeydown = 1;
- Person::players[i]->crouchkeydown = 0;
- if (Person::players[i]->animTarget != crouchremoveknifeanim &&
- Person::players[i]->animTarget != removeknifeanim)
- Person::players[i]->throwtogglekeydown = 0;
- Person::players[i]->drawkeydown = 0;
- }
- if (Person::players[i]->collided < 1 || Person::players[i]->animTarget != jumpupanim)
- Person::players[i]->jumpkeydown = 0;
- if ((Person::players[i]->collided > .8 && Person::players[i]->jumppower >= 5))
- Person::players[i]->jumpkeydown = 1;
- }
-
- if (Person::players[i]->aitype == attacktypecutoff) {
- Person::players[i]->aiupdatedelay -= multiplier;
- //dodge or reverse rabbit kicks, knife throws, flips
- if (Person::players[i]->damage < Person::players[i]->damagetolerance * 2 / 3)
- if ((Person::players[0]->animTarget == rabbitkickanim ||
- Person::players[0]->animTarget == knifethrowanim ||
- (Person::players[0]->isFlip() &&
- normaldotproduct(Person::players[0]->facing, Person::players[0]->coords - Person::players[i]->coords) < 0)) &&
- !Person::players[0]->skeleton.free &&
- (Person::players[i]->aiupdatedelay < .1)) {
- Person::players[i]->attackkeydown = 0;
- if (Person::players[i]->isIdle())
- Person::players[i]->crouchkeydown = 1;
- if (Person::players[0]->animTarget != rabbitkickanim && Person::players[0]->weaponactive != -1) {
- if (weapons[Person::players[0]->weaponids[0]].getType() == knife) {
- if (Person::players[i]->isIdle() || Person::players[i]->isCrouch() || Person::players[i]->isRun() || Person::players[i]->isFlip()) {
- if (abs(Random() % 2) == 0)
- Person::players[i]->setAnimation(backhandspringanim);
- else
- Person::players[i]->setAnimation(rollanim);
- Person::players[i]->targetyaw += 90 * (abs(Random() % 2) * 2 - 1);
- Person::players[i]->wentforweapon = 0;
- }
- if (Person::players[i]->animTarget == jumpupanim || Person::players[i]->animTarget == jumpdownanim)
- Person::players[i]->setAnimation(flipanim);
- }
- }
- Person::players[i]->forwardkeydown = 0;
- Person::players[i]->aiupdatedelay = .02;
- }
- //get confused by flips
- if (Person::players[0]->isFlip() &&
- !Person::players[0]->skeleton.free &&
- Person::players[0]->animTarget != walljumprightkickanim &&
- Person::players[0]->animTarget != walljumpleftkickanim) {
- if (distsq(&Person::players[0]->coords, &Person::players[i]->coords) < 25)
- if ((1 - Person::players[i]->damage / Person::players[i]->damagetolerance) > .5)
- Person::players[i]->stunned = 1;
- }
- //go for weapon on the ground
- if (Person::players[i]->wentforweapon < 3)
- for (unsigned k = 0; k < weapons.size(); k++)
- if (Person::players[i]->creature != wolftype)
- if (Person::players[i]->num_weapons == 0 &&
- weapons[k].owner == -1 &&
- weapons[i].velocity.x == 0 &&
- weapons[i].velocity.z == 0 &&
- weapons[i].velocity.y == 0) {
- if (distsq(&Person::players[i]->coords, &weapons[k].position) < 16) {
- Person::players[i]->wentforweapon++;
- Person::players[i]->lastchecktime = 6;
- Person::players[i]->aitype = getweapontype;
- Person::players[i]->ally = -1;