Expr operator==(Expr e1, Expr e2) { std::string sep(1, blk::Block::fill); blk::Expr right = beside( text(sep + "=" + sep), e2 ); return move_ref(beside( e1, right ), e1->column() + 2, std::max(e1->row(), e2->row())); }
Input AIManager::driveToPoint(int playerNum, vec3 pos) { lastDriveToPos = pos; reversing[playerNum] = false; Entity* ai = state->getPlayer(playerNum); vec3 aiPos = ai->getPos(); Input input = Input(); input.forward = carSpeed; input.backward = 0; input.turnL = 0; input.turnR = 0; input.tiltBackward = 0; input.tiltForward = 0; input.spinL = 0; input.spinR = 0; input.rollL = 0; input.rollR = 0; float dot = facing(ai, pos); float side = beside(ai, pos); // If not facing towards point if (dot < 0.95f) { // Turn if (side < 0) { input.turnR = -side; } else { input.turnL = side; } } prevPosition[playerNum] = aiPos; //AI has a powerup if (state->getPlayer(playerNum)->getCurrentPowerup() != -1) { if (state->getPlayer(playerNum)->getCurrentPowerup() != POWERUPS::BOMB){ input.powerup = true; } else { double dist = abs(length(state->getPlayer(playerNum)->getPos() - state->getGoldenBuggy()->getPos())); if (dist <= 5) { //Use the bomb powerup if the AI is close to the golden buggy input.powerup = true; } } } return input; }
// Returns positive if target is to the right of object // Negative for left // Returns a value between -1 and 1 float AIManager::beside(Entity* object, Entity* target) { vec3 targetPos = target->getPos(); return beside(object, targetPos); }
Input AIManager::testAIEvade(int playerNum) { Entity* ai = state->getPlayer(playerNum); vec3 aiPos = ai->getPos(); Entity* player = NULL; float shortestLength = 0; for (unsigned int i = 0; i < state->numberOfPlayers(); i++) { if (i != playerNum) { Entity* indexedPlayer = state->getPlayer(i); vec3 playerPos = indexedPlayer->getPos(); vec3 distance = playerPos - aiPos; float len = length(distance); if (len < shortestLength || player == NULL) { shortestLength = len; player = indexedPlayer; } } } Input input = Input(); input.forward = carSpeed; input.backward = 0; input.turnL = 0; input.turnR = 0; input.tiltBackward = 0; input.tiltForward = 0; input.spinL = 0; input.spinR = 0; input.rollL = 0; input.rollR = 0; float dot = facing(ai, player); float side = beside(ai, player); float distance = length(aiPos - player->getPos()); float speed = ((PlayerInfo*)ai)->getFSpeed(); // If facing car and very close if (dot >= 0.8 && distance <= 10) { // Go backwards input.forward = 0.0f; input.backward = carSpeed; // if still moving forwards if (!reversing[playerNum] && speed > 0) { // Do not turn as direction of turning will be changing soon input.turnL = 0; input.turnR = 0; } // If moving backwards else if ((!reversing[playerNum] && speed <= 0) || reversing[playerNum]) { reversing[playerNum] = true; // Turn if (side > 0) { input.turnL = dot; } else { input.turnR = dot; } } } else if (dot > -0.9) { // If still moving backwards, do not turn as turning direction will be changing soon if (reversing[playerNum] && speed < 0) { input.turnL = 0; input.turnR = 0; } // If moving forwards else if ((reversing[playerNum] && speed >= 0) || !reversing[playerNum]) { reversing[playerNum] = false; // Turn if (side > 0) { input.turnR = side; } else { input.turnL = -side; } } } prevPosition[playerNum] = aiPos; return input; }
Input AIManager::recover(int playerNum) { // If recovery just started if (collisionRecoveryCounter == 0) { // Reverse direction reversing[playerNum] = !reversing[playerNum]; } Input input = Input(); if (reversing[playerNum]) { input.forward = 0; input.backward = carSpeed; } else { input.forward = carSpeed; input.backward = 0; } input.turnL = 0; input.turnR = 0; input.tiltBackward = 0; input.tiltForward = 0; input.spinL = 0; input.spinR = 0; input.rollL = 0; input.rollR = 0; float dot = facing(state->getPlayer(playerNum), infoAtCollision.getPos()); float side = beside(state->getPlayer(playerNum), infoAtCollision.getPos()); if (dot > 1) { dot = 1.0f; } else if (dot < -1) { dot = -1; } else if (dot != dot) { dot = 1; } if (side > 1) { side = 1.0f; } else if (side < -1) { side = -1; } else if (side != side) { side = 1; } if (reversing[playerNum]) { if (side > 0) { input.turnL = dot; } else { input.turnR = dot; } } else { if (side > 0) { input.turnR = dot; } else { input.turnL = dot; } } if (timer.getTimeSince(collisionStartTime) >= 0.9f) { input.jump = true; } return input; }
Input AIManager::testAIChase(unsigned int aiNum){ /* Notes about AI stuff point vec=hispos-prevpos; // vec is the 1-frame position difference vec=vec*N; // we project N frames into the future point futurepos=hispos+vec; // and build the future projection reaim(mypos,myyaw,futurepos); mypos.x = mypos.x + cos(myyaw) * speed; mypos.z = mypos.z + sin(myyaw) * speed; */ vec3 goldenBuggyLoc = state->getGoldenBuggy()->getPos(); prevPosition[aiNum] = goldenBuggyLoc; vec3 myPos = state->getPlayer(aiNum)->getPos(); vec3 vec = goldenBuggyLoc - prevPosition[aiNum]; vec = vec * vec3(30, 30, 30); // we project N frames into the future vec3 futurepos = goldenBuggyLoc + vec; double dX_chaseAI = myPos.x; double dY_chaseAI = myPos.y; double dZ_chaseAI = myPos.z; double yaw_chaseAI = atan2(dZ_chaseAI, dX_chaseAI); double dX_golden = goldenBuggyLoc.x; double dY_golden = goldenBuggyLoc.y; double dZ_golden = goldenBuggyLoc.z; double yaw_golden = atan2(dZ_golden, dX_golden); Input input = Input(); input.forward = 0.5f; input.backward = 0; input.turnL = 0; input.turnR = 0; input.tiltBackward = 0; input.tiltForward = 0; input.spinL = 0; input.spinR = 0; input.rollL = 0; input.rollR = 0; Entity* ai = state->getPlayer(aiNum); Entity* goldenBuggy = state->getGoldenBuggy(); float dot = facing(ai, goldenBuggy); if (dot < 0.9){ if (dot > 0){ float result = beside(ai, goldenBuggy); if (result > 0){ input.turnR = -result; } else{ input.turnL = result; } } else { float result = beside(ai, goldenBuggy); if (result > 0){ input.turnR = -result; } else{ input.turnL = result; } } } if (state->getPlayer(aiNum)->getCurrentPowerup() != -1) { if (state->getPlayer(aiNum)->getCurrentPowerup() != POWERUPS::BOMB) { input.powerup = true; } else { double dist = abs(length(state->getPlayer(aiNum)->getPos() - state->getGoldenBuggy()->getPos())); if (dist <= 5) { //Use the bomb powerup if the AI is close to the golden buggy input.powerup = true; } } } return input; }
inline bool includes(const sqr<T,N>& a, const vec<T,N>& b) { return not beside(a, b); }
/*! Check if \p a \em overlaps \p b. */ template<class T, std::size_t N> inline bool overlap(const cring<T>& a, const box<T,N>& b) { return not beside(a, b); }
/*! Check if \p a \em includes \p b. */ template<class T, std::size_t N> inline pure bool includes(const cring<T>& a, const vec<T,N>& b) { return not beside(a, b); }