/* $Id: simplebot.cpp,v 1.5 2005/10/16 17:53:05 pohlt Exp $ */ #include "simplebot.hpp" #include "avatar.hpp" #include "global.hpp" #include SimpleBot::SimpleBot() : m_event( Event::EMPTY ), m_count( 0 ) { } void SimpleBot::update() { Vector position = m_avatar->getPos(); std::vector visibleObjects = m_avatar->getVisibleObjects(); // always keep moving if ( position == m_lastPosition ) { if ( m_count > 5 ) { m_count = 0; // try digging if ( !m_event.testAnyActions( Event::DIG ) ) { INFO( "SimpleBot: start digging\n" ); m_event.addAction( Event::DIG ); } else { // turn around and stop digging if ( m_event.testAnyActions( Event::LEFT ) ) { INFO( "SimpleBot: turn right\n" ); m_event.removeAction( Event::LEFT ); m_event.addAction( Event::RIGHT ); } else { INFO( "SimpleBot: turn left\n" ); m_event.removeAction( Event::RIGHT ); m_event.addAction( Event::LEFT ); } INFO( "SimpleBot: stop digging\n" ); m_event.removeAction( Event::DIG ); } } else m_count++; } m_lastPosition = position; // aim to the nearest adversary avatar visible Avatar* nearestAvatar = 0; real nearestDistance = 0.0; for ( unsigned int i = 0; i < visibleObjects.size(); i++ ) { Object* object = visibleObjects[i]; if ( object->isAvatar() ) { Avatar* avatar = dynamic_cast( object ); if ( avatar && avatar->getPlayer()->getPlayerOrTeamID() != m_avatar->getPlayer()->getPlayerOrTeamID() ) { real distance = (avatar->getPos() - m_avatar->getPos()).abs(); if ( !nearestAvatar || distance < nearestDistance ) { nearestAvatar = avatar; nearestDistance = distance; } } } } if ( nearestAvatar ) { // yes, we found an enemy // turn to the side where the enemy is located if ( nearestAvatar->getPosX() > m_avatar->getPosX() ) { m_event.removeAction( Event::LEFT ); m_event.addAction( Event::RIGHT ); } else if ( nearestAvatar->getPosX() < m_avatar->getPosX() ) { m_event.removeAction( Event::RIGHT ); m_event.addAction( Event::LEFT ); } // adjust aiming angle real enemyAngle = ATAN2_REAL( ( nearestAvatar->getPosY() - m_avatar->getPosY() ), ( nearestAvatar->getPosX() - m_avatar->getPosX() ) ) * 180.0 / M_PI + 90.0; INFO( "own angle = %f, enemy angle = %f\n", m_avatar->getAimingAngle(), enemyAngle ); if ( enemyAngle < m_avatar->getAimingAngle() ) { INFO( "Aiming up\n" ); m_event.removeAction( Event::DOWN ); m_event.addAction( Event::UP ); } else if ( enemyAngle > m_avatar->getAimingAngle() ) { INFO( "Aiming down\n" ); m_event.removeAction( Event::UP ); m_event.addAction( Event::DOWN ); } // shoot whenever possible if ( getActiveWeapon()->getCurrentAmmo() == 0 ) { m_event.removeAction( Event::SHOOT ); if ( getActiveWeaponIndex() == 0 ) m_event.setWeapon( 2 ); else m_event.setWeapon( 1 ); } else { m_event.addAction( Event::SHOOT ); } } // respawn if dead if ( !m_avatar->isLiving() ) { INFO( "SimpleBot: respawn\n" ); m_event.addAction( Event::SPAWN ); } else m_event.removeAction( Event::SPAWN ); INFO( "Bot event = %x\n", m_event.get() ); }