void SeaMerchant::Impl::resolveState(PlayerCityPtr city, WalkerPtr wlk ) { switch( nextState ) { case stFindDock: { destBuildingPos = TilePos( -1, -1 ); // no destination yet Pathway pathway; // get the list of buildings within reach if( tryDockCount < maxTryDockCount ) { city::Helper helper( city ); DockList docks = helper.find<Dock>( objects::dock ); if( !docks.empty() ) { DockList freeDocks; foreach( dock, docks ) { if( !(*dock)->isBusy() ) { freeDocks.push_back( *dock ); } } if( freeDocks.empty() ) { pathway = findRandomRaid( docks, wlk->pos() ); nextState = stWaitFreeDock; } else { pathway = findNearbyDock( freeDocks, wlk->pos() ); nextState = stRequestGoods; } } } tryDockCount++; if( pathway.isValid() ) { // we found a destination! wlk->setPathway( pathway ); wlk->go(); } else { nextState = stGoOutFromCity; resolveState( city, wlk ); } }
void Wolf::_findNewWay( const TilePos& start ) { WalkerList walkers = _city()->statistic().walkers .find<Walker>( walker::any, config::distance::animalRandrom, start ) .exclude<Wolf>(); Pathway pathway; if( !walkers.empty() ) { WalkerPtr wlk = walkers.random(); pathway = PathwayHelper::create( start, wlk->pos(), PathwayHelper::allTerrain ); } if( !pathway.isValid() ) { pathway = PathwayHelper::randomWay( _city(), start, config::distance::animalRandrom ); } if( pathway.isValid() ) { setPos( start ); setPathway( pathway ); go(); } else { die(); } }
void Wolf::_centerTile() { Animal::_centerTile(); WalkerList walkers = _city()->statistic().walkers .neighbors<Walker>( pos() ) .exclude<Wolf>(); if( !walkers.empty() ) { WalkerPtr wlk = walkers.random(); turn( wlk->pos() ); _setAction( acFight ); //setSpeedMultiplier( 0.0 ); _d->attackPos = wlk->pos(); } }
void RomeSoldier::timeStep(const unsigned long time) { Soldier::timeStep( time ); if( game::Date::isMonthChanged() ) { unsigned int dst2base = pos().distanceFrom( _d->basePos ); if( dst2base > maxDistanceFromBase ) { updateMorale( dst2base * -10 / maxDistanceFromBase ); if( morale() == 0 ) { _duckout(); } } } switch( _subAction() ) { case fightEnemy: { WalkerList enemies = _findEnemiesInRange( attackDistance() ); if( !enemies.empty() ) { WalkerPtr p = enemies.front(); turn( p->pos() ); p->updateHealth( -3 ); p->acceptAction( Walker::acFight, pos() ); } else { bool haveEnemy = _tryAttack(); if( !haveEnemy ) send2patrol(); } } break; case patrol: if( game::Date::current().day() % 2 == 0 ) { _tryAttack(); } break; default: break; } // end switch( _d->action ) }
void RomeArcher::timeStep(const unsigned long time) { Soldier::timeStep( time ); switch( _subAction() ) { case Soldier::fightEnemy: { WalkerList enemies = _findEnemiesInRange( attackDistance() ); if( !enemies.empty() ) { WalkerPtr p = enemies.front(); turn( p->pos() ); if( _animationRef().index() == (int)(_animationRef().frameCount()-1) ) { _fire( p->pos() ); _updateAnimation( time+1 ); } } else { //_check4attack(); send2patrol(); } } break; case Soldier::destroyBuilding: { ConstructionList constructions = _findContructionsInRange( attackDistance() ); if( !constructions.empty() ) { ConstructionPtr b = constructions.front(); turn( b->pos() ); if( _animationRef().index() == (int)(_animationRef().frameCount()-1) ) { _fire( b->pos() ); _updateAnimation( time+1 ); } } else { //_check4attack(); send2patrol(); } } case Soldier::patrol: if( game::Date::current().day() % 2 == 0 ) { _tryAttack(); } break; default: break; } // end switch( _d->action ) }