void Disorder::timeStep( const unsigned int time ) { if( GameDate::isYearChanged() ) { _d->rioterInLastYear = _d->rioterInThisYear; _d->rioterInThisYear = 0; } if( !GameDate::isWeekChanged() ) return; Helper helper( _city() ); HouseList houses = helper.find<House>( building::house ); WalkerList walkers = _city()->walkers( walker::protestor ); HouseList criminalizedHouse; _d->currentCrimeLevel = 0; _d->maxCrimeLevel = 0; foreach( house, houses ) { int crimeLvl = (*house)->getServiceValue( Service::crime )+1; if( crimeLvl >= _d->minCrimeLevel ) { criminalizedHouse.push_back( *house ); } _d->currentCrimeLevel += crimeLvl; _d->maxCrimeLevel = std::max<int>( _d->maxCrimeLevel, crimeLvl ); }
HouseList HouseManager::filterHouses(uint32 townId) { HouseList ret; for(const HousePtr& house : m_houses) if(house->getTownId() == townId) ret.push_back(house); return ret; }
void Disorder::Impl::weekUpdate( unsigned int time, PlayerCityPtr rcity ) { HouseList houses = rcity->statistic().houses.find(); const WalkerList& walkers = rcity->statistic().walkers.find( walker::protestor ); HouseList criminalizedHouse; crime.level.current = 0; crime.level.maximum = 0; for( auto house : houses ) { int currentValue = house->getServiceValue( Service::crime )+1; if( currentValue >= crime.level.minimum ) { criminalizedHouse.push_back( house ); } crime.level.current += currentValue; crime.level.maximum = std::max<int>( crime.level.maximum, currentValue ); } if( houses.size() > 0 ) crime.level.current /= houses.size(); if( criminalizedHouse.size() > walkers.size() ) { HousePtr house = criminalizedHouse.random(); int hCrimeLevel = house->getServiceValue( Service::crime ); int sentiment = rcity->sentiment(); int randomValue = math::random( crime::maxValue ); if (sentiment >= minSentiment4protest ) { if ( randomValue >= sentiment + 20 ) { if ( hCrimeLevel > crime::level4protestor ) { generateProtestor( rcity, house ); } } } else if ( sentiment >= minSentiment4mugger ) { if ( randomValue >= sentiment + 40 ) { if ( hCrimeLevel >= crime::level4mugger ) { generateMugger( rcity, house ); } else if ( hCrimeLevel > crime::level4protestor ) { generateProtestor( rcity, house ); } } } else if( sentiment < minSentiment4mugger ) { if ( randomValue >= sentiment + 50 ) { if ( hCrimeLevel >= crime::level4rioter ) { generateRioter( rcity, house ); } else if ( hCrimeLevel >= crime::level4mugger ) { generateMugger( rcity, house ); } else if ( hCrimeLevel > crime::level4protestor ) { generateProtestor( rcity, house ); } } } } }