--- ai.cpp.orig 2003-12-21 19:49:25.148034144 -0600 +++ ai.cpp 2003-12-21 19:20:47.011230640 -0600 @@ -478,92 +478,96 @@ int nolineofsight = 1; - // Do we have line of sight to the VIP? - if (route((int)c.mX, (int)c.mY, (int)Game.characters[c.mTarget].mX, (int)Game.characters[c.mTarget].mY)) - { - nolineofsight = 0; - // Calculate new vector to it - float dist = distance(Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY, c.mX, c.mY); - c.mXi = ((Game.characters[c.mTarget].mX - c.mX) / dist) * c.mSpeed; - c.mYi = ((Game.characters[c.mTarget].mY - c.mY) / dist) * c.mSpeed; - c.mNextWaypoint = -1; - } + // Give the VIP a running start in sudden-death situations + if (c.mTarget != -1) + { + // Do we have line of sight to the VIP? + if (route((int)c.mX, (int)c.mY, (int)Game.characters[c.mTarget].mX, (int)Game.characters[c.mTarget].mY)) + { + nolineofsight = 0; + // Calculate new vector to it + float dist = distance(Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY, c.mX, c.mY); + c.mXi = ((Game.characters[c.mTarget].mX - c.mX) / dist) * c.mSpeed; + c.mYi = ((Game.characters[c.mTarget].mY - c.mY) / dist) * c.mSpeed; + c.mNextWaypoint = -1; + } - if (c.mNextWaypoint == -1) - { - // Caught up with the VIP? - float dist = distance((float)Game.characters[c.mTarget].mX, (float)Game.characters[c.mTarget].mY, c.mX, c.mY); - if (dist < 3) + if (c.mNextWaypoint == -1) { - // arrived safely. - c.mType = -1; - Game.Score -= (int)((float)10000*Game.ScoreMod); // +game over - Game.vip.count--; - Game.baddy.count--; - Game.characters[c.mTarget].mType = -1; + // Caught up with the VIP? + float dist = distance((float)Game.characters[c.mTarget].mX, (float)Game.characters[c.mTarget].mY, c.mX, c.mY); + if (dist < 3) + { + // arrived safely. + c.mType = -1; + Game.Score -= (int)((float)10000*Game.ScoreMod); // +game over + Game.vip.count--; + Game.baddy.count--; + Game.characters[c.mTarget].mType = -1; #ifdef DISPLAY_GAMEOVER_SCREEN -// gameoverscreen(2); - Game.GameOverReason = OESREASON_NEGLIGENT; -// draw_gameoverscreen(Game.Screen); - return; +// gameoverscreen(2); + Game.GameOverReason = OESREASON_NEGLIGENT; +// draw_gameoverscreen(Game.Screen); + return; #endif - } - else - { - if (nolineofsight) + } + else { - // Lost the VIP. Find closest accessible waypoint. - c.mNextWaypoint = 0; - int i; - float dist = distance_wp(0, Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY); - for (i = 1; i < Game.num_waypoints; i++) + if (nolineofsight) { - float newdist = distance_wp(i, Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY); - if (newdist < dist && route(Game.waypoints[i].mX, Game.waypoints[i].mY, (int)c.mX, (int)c.mY)) + // Lost the VIP. Find closest accessible waypoint. + c.mNextWaypoint = 0; + int i; + float dist = distance_wp(0, Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY); + for (i = 1; i < Game.num_waypoints; i++) { - dist = newdist; - c.mNextWaypoint = i; + float newdist = distance_wp(i, Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY); + if (newdist < dist && route(Game.waypoints[i].mX, Game.waypoints[i].mY, (int)c.mX, (int)c.mY)) + { + dist = newdist; + c.mNextWaypoint = i; + } } + // Calculate vector towards the closest waypoint + dist = distance_wp(c.mNextWaypoint, c.mX, c.mY); + c.mXi = ((Game.waypoints[c.mNextWaypoint].mX - c.mX) / dist) * c.mSpeed; + c.mYi = ((Game.waypoints[c.mNextWaypoint].mY - c.mY) / dist) * c.mSpeed; } - // Calculate vector towards the closest waypoint - dist = distance_wp(c.mNextWaypoint, c.mX, c.mY); - c.mXi = ((Game.waypoints[c.mNextWaypoint].mX - c.mX) / dist) * c.mSpeed; - c.mYi = ((Game.waypoints[c.mNextWaypoint].mY - c.mY) / dist) * c.mSpeed; } } - } - else - { - float dist = distance_wp(c.mNextWaypoint, c.mX, c.mY); - // Have we arrived at waypoint? - if (dist < 4) - { - // Find a new waypoint + else + { + float dist = distance_wp(c.mNextWaypoint, c.mX, c.mY); + // Have we arrived at waypoint? + if (dist < 4) + { + // Find a new waypoint - if (nolineofsight) - { - // Can't see the VIP, try to figure out the closest waypoint to target that's connected from here - int next = 0; - dist = distance_wp(Game.waypoints[c.mNextWaypoint].mConnection[0], Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY); - int i; - for (i = 1; i < Game.waypoints[c.mNextWaypoint].mConnections; i++) - { - float newdist = distance_wp(Game.waypoints[c.mNextWaypoint].mConnection[i], Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY); - if (newdist < dist) + if (nolineofsight) + { + // Can't see the VIP, try to figure out the closest waypoint to target that's connected from here + int next = 0; + dist = distance_wp(Game.waypoints[c.mNextWaypoint].mConnection[0], Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY); + int i; + for (i = 1; i < Game.waypoints[c.mNextWaypoint].mConnections; i++) { - dist = newdist; - next = i; + float newdist = distance_wp(Game.waypoints[c.mNextWaypoint].mConnection[i], Game.characters[c.mTarget].mX, Game.characters[c.mTarget].mY); + if (newdist < dist) + { + dist = newdist; + next = i; + } } + // Note: bad guys MAY run in circles. + c.mNextWaypoint = Game.waypoints[c.mNextWaypoint].mConnection[next]; + // Calculate vector.. + dist = distance_wp(c.mNextWaypoint, c.mX, c.mY); + c.mXi = ((Game.waypoints[c.mNextWaypoint].mX - c.mX) / dist) * c.mSpeed; + c.mYi = ((Game.waypoints[c.mNextWaypoint].mY - c.mY) / dist) * c.mSpeed; } - // Note: bad guys MAY run in circles. - c.mNextWaypoint = Game.waypoints[c.mNextWaypoint].mConnection[next]; - // Calculate vector.. - dist = distance_wp(c.mNextWaypoint, c.mX, c.mY); - c.mXi = ((Game.waypoints[c.mNextWaypoint].mX - c.mX) / dist) * c.mSpeed; - c.mYi = ((Game.waypoints[c.mNextWaypoint].mY - c.mY) / dist) * c.mSpeed; - } + } } } }