void nobBaseWarehouse::HandleProduceHelperEvent() { // Nur bei unter 100 Trägern, weitere "produzieren" if(inventory[JOB_HELPER] < 100) { inventory.Add(JOB_HELPER); GameClientPlayer& owner = gwg->GetPlayer(player); owner.IncreaseInventoryJob(JOB_HELPER, 1); if(inventory[JOB_HELPER] == 1) { // Wenn vorher keine Träger da waren, müssen alle unbesetzen Wege gucken, ob sie nen Weg hierher finden, könnte ja sein, dass vorher nich genug Träger da waren owner.FindWarehouseForAllRoads(); // evtl Träger mit Werkzeug kombiniert -> neuer Beruf owner.FindWarehouseForAllJobs(JOB_NOTHING); } } else if(inventory[JOB_HELPER] > 100) { // Bei Überbevölkerung Träger vernichten inventory.Remove(JOB_HELPER); gwg->GetPlayer(player).DecreaseInventoryJob(JOB_HELPER, 1); } producinghelpers_event = em->AddEvent(this, PRODUCE_HELPERS_GF + RANDOM.Rand(__FILE__, __LINE__, GetObjId(), PRODUCE_HELPERS_RANDOM_GF), 1); // Evtl. genau der Gehilfe, der zum Rekrutieren notwendig ist TryRecruiting(); // Evtl die Typen gleich wieder auslagern, falls erforderlich CheckOuthousing(1, JOB_HELPER); }
void nobBaseWarehouse::HandleRecrutingEvent() { // Wir wollen so viele der Soldaten rekrutieren, // wie in den military_settings angegeben. // Wird evtl gerundet, dann fair nach Zufall ;) ). unsigned max_recruits; max_recruits = std::min(inventory[GD_SWORD], inventory[GD_SHIELDROMANS]); max_recruits = std::min(inventory[GD_BEER], max_recruits); max_recruits = std::min(inventory[JOB_HELPER], max_recruits); GameClientPlayer& owner = gwg->GetPlayer(player); const unsigned recruiting_ratio = owner.militarySettings_[0]; unsigned real_recruits = max_recruits * recruiting_ratio / MILITARY_SETTINGS_SCALE[0]; // Wurde abgerundet? unsigned remainingRecruits = real_recruits * recruiting_ratio % MILITARY_SETTINGS_SCALE[0]; if(remainingRecruits != 0 && unsigned(RANDOM.Rand(__FILE__, __LINE__, GetObjId(), MILITARY_SETTINGS_SCALE[0] - 1)) < remainingRecruits) ++real_recruits; else if(real_recruits == 0) return; // Nothing to do inventory.Add(JOB_PRIVATE, real_recruits); owner.IncreaseInventoryJob(JOB_PRIVATE, real_recruits); inventory.Remove(JOB_HELPER, real_recruits); owner.DecreaseInventoryJob(JOB_HELPER, real_recruits); inventory.Remove(GD_SWORD, real_recruits); owner.DecreaseInventoryWare(GD_SWORD, real_recruits); inventory.Remove(GD_SHIELDROMANS, real_recruits); owner.DecreaseInventoryWare(GD_SHIELDROMANS, real_recruits); inventory.Remove(GD_BEER, real_recruits); owner.DecreaseInventoryWare(GD_BEER, real_recruits); // Evtl. versuchen nächsten zu rekrutieren TryRecruiting(); // If there were no soliders before if(inventory[JOB_PRIVATE] == real_recruits) { // Check reserve this->RefreshReserve(0); // And check if we need the new ones (if any left) e.g. for military buildings if(inventory[JOB_PRIVATE] > 0) owner.NewSoldiersAvailable(inventory[JOB_PRIVATE]); } }
/// Prüft verschiedene Sachen, falls ein neuer Mensch das Haus betreten hat void nobBaseWarehouse::CheckJobsForNewFigure(const Job job) { // Evtl ging ein Gehilfe rein --> versuchen zu rekrutieren if(job == JOB_HELPER) TryRecruiting(); if(job >= JOB_PRIVATE && job <= JOB_GENERAL) { // Reserve prüfen RefreshReserve(job - JOB_PRIVATE); if(inventory[job] > 0) { // Truppen prüfen in allen Häusern gwg->GetPlayer(player).NewSoldiersAvailable(inventory[job]); } } else { if(job == JOB_PACKDONKEY) { // Straße für Esel suchen noRoadNode* goal; if(RoadSegment* road = gwg->GetPlayer(player).FindRoadForDonkey(this, &goal)) road->GotDonkey(OrderDonkey(road, goal)); } else { // Evtl. Abnehmer für die Figur wieder finden GameClientPlayer& owner = gwg->GetPlayer(player); owner.FindWarehouseForAllJobs(job); // Wenns ein Träger war, auch Wege prüfen if(job == JOB_HELPER && inventory[JOB_HELPER] == 1) { // evtl als Träger auf Straßen schicken owner.FindWarehouseForAllRoads(); // evtl Träger mit Werkzeug kombiniert -> neuer Beruf owner.FindWarehouseForAllJobs(JOB_NOTHING); } } } // Evtl den Typen gleich wieder auslagern, falls erforderlich CheckOuthousing(true, job); }
/// Prüft verschiedene Verwendungszwecke für eine neuangekommende Ware void nobBaseWarehouse::CheckUsesForNewWare(const GoodType gt) { // Wenn es ein Werkzeug war, evtl neuen Job suchen, der jetzt erzeugt werden könnte.. if(gt >= GD_TONGS && gt <= GD_BOAT) { for(unsigned i = 0; i < 30; ++i) { if(JOB_CONSTS[i].tool == gt) gwg->GetPlayer(player).FindWarehouseForAllJobs(Job(i)); } } // Wars Baumaterial? Dann den Baustellen Bescheid sagen if(gt == GD_BOARDS || gt == GD_STONES) gwg->GetPlayer(player).FindMaterialForBuildingSites(); // Evtl wurden Bier oder Waffen reingetragen --> versuchen zu rekrutieren TryRecruiting(); // Evtl die Ware gleich wieder auslagern, falls erforderlich CheckOuthousing(false, gt); }
nobHQ::nobHQ(const MapPoint pos, const unsigned char player, const Nation nation, const bool isTent) : nobBaseWarehouse(BLD_HEADQUARTERS, pos, player, nation), isTent_(isTent) { // StartWaren setzen switch(gwg->GetGGS().startWares) { // sehr wenig case 0: inventory.visual.goods[GD_BEER] = 0; inventory.visual.goods[GD_TONGS] = 1; inventory.visual.goods[GD_HAMMER] = 4; inventory.visual.goods[GD_AXE] = 1; inventory.visual.goods[GD_SAW] = 0; inventory.visual.goods[GD_PICKAXE] = 0; inventory.visual.goods[GD_SHOVEL] = 1; inventory.visual.goods[GD_CRUCIBLE] = 1; inventory.visual.goods[GD_RODANDLINE] = 1; //?? inventory.visual.goods[GD_SCYTHE] = 2; //?? inventory.visual.goods[GD_WATEREMPTY] = 0; inventory.visual.goods[GD_WATER] = 0; inventory.visual.goods[GD_CLEAVER] = 0; inventory.visual.goods[GD_ROLLINGPIN] = 1; inventory.visual.goods[GD_BOW] = 0; inventory.visual.goods[GD_BOAT] = 0; inventory.visual.goods[GD_SWORD] = 0; inventory.visual.goods[GD_IRON] = 0; inventory.visual.goods[GD_FLOUR] = 0; inventory.visual.goods[GD_FISH] = 1; inventory.visual.goods[GD_BREAD] = 2; inventory.visual.goods[GD_SHIELDROMANS] = 0; inventory.visual.goods[GD_WOOD] = 6; inventory.visual.goods[GD_BOARDS] = 11; inventory.visual.goods[GD_STONES] = 17; inventory.visual.goods[GD_SHIELDVIKINGS] = 0; inventory.visual.goods[GD_SHIELDAFRICANS] = 0; inventory.visual.goods[GD_GRAIN] = 0; inventory.visual.goods[GD_COINS] = 0; inventory.visual.goods[GD_GOLD] = 0; inventory.visual.goods[GD_IRONORE] = 4; inventory.visual.goods[GD_COAL] = 4; inventory.visual.goods[GD_MEAT] = 0; inventory.visual.goods[GD_HAM] = 0; inventory.visual.goods[GD_SHIELDJAPANESE] = 0; inventory.visual.people[JOB_HELPER] = 13; inventory.visual.people[JOB_WOODCUTTER] = 2; inventory.visual.people[JOB_FISHER] = 0; inventory.visual.people[JOB_FORESTER] = 1; inventory.visual.people[JOB_CARPENTER] = 1; inventory.visual.people[JOB_STONEMASON] = 1; inventory.visual.people[JOB_HUNTER] = 1; inventory.visual.people[JOB_FARMER] = 0; inventory.visual.people[JOB_MILLER] = 0; inventory.visual.people[JOB_BAKER] = 0; inventory.visual.people[JOB_BUTCHER] = 0; inventory.visual.people[JOB_MINER] = 2; inventory.visual.people[JOB_BREWER] = 0; inventory.visual.people[JOB_PIGBREEDER] = 0; inventory.visual.people[JOB_DONKEYBREEDER] = 0; inventory.visual.people[JOB_IRONFOUNDER] = 0; inventory.visual.people[JOB_MINTER] = 0; inventory.visual.people[JOB_METALWORKER] = 0; inventory.visual.people[JOB_ARMORER] = 1; inventory.visual.people[JOB_BUILDER] = 2; inventory.visual.people[JOB_PLANER] = 1; inventory.visual.people[JOB_PRIVATE] = 13; inventory.visual.people[JOB_PRIVATEFIRSTCLASS] = 0; inventory.visual.people[JOB_SERGEANT] = 0; inventory.visual.people[JOB_OFFICER] = 0; inventory.visual.people[JOB_GENERAL] = 0; inventory.visual.people[JOB_GEOLOGIST] = 2; inventory.visual.people[JOB_SHIPWRIGHT] = 0; inventory.visual.people[JOB_SCOUT] = 1; inventory.visual.people[JOB_PACKDONKEY] = 2; break; // Wenig case 1: inventory.visual.goods[GD_BEER] = 0; inventory.visual.goods[GD_TONGS] = 0; inventory.visual.goods[GD_HAMMER] = 8; inventory.visual.goods[GD_AXE] = 3; inventory.visual.goods[GD_SAW] = 1; inventory.visual.goods[GD_PICKAXE] = 1; inventory.visual.goods[GD_SHOVEL] = 2; inventory.visual.goods[GD_CRUCIBLE] = 2; inventory.visual.goods[GD_RODANDLINE] = 3; inventory.visual.goods[GD_SCYTHE] = 4; inventory.visual.goods[GD_WATEREMPTY] = 0; inventory.visual.goods[GD_WATER] = 0; inventory.visual.goods[GD_CLEAVER] = 1; inventory.visual.goods[GD_ROLLINGPIN] = 1; inventory.visual.goods[GD_BOW] = 1; inventory.visual.goods[GD_BOAT] = 6; inventory.visual.goods[GD_SWORD] = 0; inventory.visual.goods[GD_IRON] = 0; inventory.visual.goods[GD_FLOUR] = 0; inventory.visual.goods[GD_FISH] = 2; inventory.visual.goods[GD_BREAD] = 4; inventory.visual.goods[GD_SHIELDROMANS] = 0; inventory.visual.goods[GD_WOOD] = 12; inventory.visual.goods[GD_BOARDS] = 22; inventory.visual.goods[GD_STONES] = 34; inventory.visual.goods[GD_SHIELDVIKINGS] = 0; inventory.visual.goods[GD_SHIELDAFRICANS] = 0; inventory.visual.goods[GD_GRAIN] = 0; inventory.visual.goods[GD_COINS] = 0; inventory.visual.goods[GD_GOLD] = 0; inventory.visual.goods[GD_IRONORE] = 8; inventory.visual.goods[GD_COAL] = 8; inventory.visual.goods[GD_MEAT] = 3; inventory.visual.goods[GD_HAM] = 0; inventory.visual.goods[GD_SHIELDJAPANESE] = 0; inventory.visual.people[JOB_HELPER] = 26; inventory.visual.people[JOB_WOODCUTTER] = 4; inventory.visual.people[JOB_FISHER] = 0; inventory.visual.people[JOB_FORESTER] = 2; inventory.visual.people[JOB_CARPENTER] = 2; inventory.visual.people[JOB_STONEMASON] = 2; inventory.visual.people[JOB_HUNTER] = 1; inventory.visual.people[JOB_FARMER] = 0; inventory.visual.people[JOB_MILLER] = 0; inventory.visual.people[JOB_BAKER] = 0; inventory.visual.people[JOB_BUTCHER] = 0; inventory.visual.people[JOB_MINER] = 5; inventory.visual.people[JOB_BREWER] = 0; inventory.visual.people[JOB_PIGBREEDER] = 0; inventory.visual.people[JOB_DONKEYBREEDER] = 0; inventory.visual.people[JOB_IRONFOUNDER] = 0; inventory.visual.people[JOB_MINTER] = 0; inventory.visual.people[JOB_METALWORKER] = 1; inventory.visual.people[JOB_ARMORER] = 2; inventory.visual.people[JOB_BUILDER] = 5; inventory.visual.people[JOB_PLANER] = 3; inventory.visual.people[JOB_PRIVATE] = 26; inventory.visual.people[JOB_PRIVATEFIRSTCLASS] = 0; inventory.visual.people[JOB_SERGEANT] = 0; inventory.visual.people[JOB_OFFICER] = 0; inventory.visual.people[JOB_GENERAL] = 0; inventory.visual.people[JOB_GEOLOGIST] = 3; inventory.visual.people[JOB_SHIPWRIGHT] = 0; inventory.visual.people[JOB_SCOUT] = 1; inventory.visual.people[JOB_PACKDONKEY] = 4; break; // Mittel case 2: inventory.visual.goods[GD_BEER] = 6; inventory.visual.goods[GD_TONGS] = 0; inventory.visual.goods[GD_HAMMER] = 16; inventory.visual.goods[GD_AXE] = 6; inventory.visual.goods[GD_SAW] = 2; inventory.visual.goods[GD_PICKAXE] = 2; inventory.visual.goods[GD_SHOVEL] = 4; inventory.visual.goods[GD_CRUCIBLE] = 4; inventory.visual.goods[GD_RODANDLINE] = 6; inventory.visual.goods[GD_SCYTHE] = 8; inventory.visual.goods[GD_WATEREMPTY] = 0; inventory.visual.goods[GD_WATER] = 0; inventory.visual.goods[GD_CLEAVER] = 2; inventory.visual.goods[GD_ROLLINGPIN] = 2; inventory.visual.goods[GD_BOW] = 2; inventory.visual.goods[GD_BOAT] = 12; inventory.visual.goods[GD_SWORD] = 6; inventory.visual.goods[GD_IRON] = 0; inventory.visual.goods[GD_FLOUR] = 0; inventory.visual.goods[GD_FISH] = 4; inventory.visual.goods[GD_BREAD] = 8; inventory.visual.goods[GD_SHIELDROMANS] = 6; inventory.visual.goods[GD_WOOD] = 24; inventory.visual.goods[GD_BOARDS] = 44; inventory.visual.goods[GD_STONES] = 68; inventory.visual.goods[GD_SHIELDVIKINGS] = 0; inventory.visual.goods[GD_SHIELDAFRICANS] = 0; inventory.visual.goods[GD_GRAIN] = 0; inventory.visual.goods[GD_COINS] = 0; inventory.visual.goods[GD_GOLD] = 0; inventory.visual.goods[GD_IRONORE] = 16; inventory.visual.goods[GD_COAL] = 16; inventory.visual.goods[GD_MEAT] = 6; inventory.visual.goods[GD_HAM] = 0; inventory.visual.goods[GD_SHIELDJAPANESE] = 0; inventory.visual.people[JOB_HELPER] = 52; inventory.visual.people[JOB_WOODCUTTER] = 8; inventory.visual.people[JOB_FISHER] = 0; inventory.visual.people[JOB_FORESTER] = 4; inventory.visual.people[JOB_CARPENTER] = 4; inventory.visual.people[JOB_STONEMASON] = 4; inventory.visual.people[JOB_HUNTER] = 2; inventory.visual.people[JOB_FARMER] = 0; inventory.visual.people[JOB_MILLER] = 0; inventory.visual.people[JOB_BAKER] = 0; inventory.visual.people[JOB_BUTCHER] = 0; inventory.visual.people[JOB_MINER] = 10; inventory.visual.people[JOB_BREWER] = 0; inventory.visual.people[JOB_PIGBREEDER] = 0; inventory.visual.people[JOB_DONKEYBREEDER] = 0; inventory.visual.people[JOB_IRONFOUNDER] = 0; inventory.visual.people[JOB_MINTER] = 0; inventory.visual.people[JOB_METALWORKER] = 2; inventory.visual.people[JOB_ARMORER] = 4; inventory.visual.people[JOB_BUILDER] = 10; inventory.visual.people[JOB_PLANER] = 6; inventory.visual.people[JOB_PRIVATE] = 46; inventory.visual.people[JOB_PRIVATEFIRSTCLASS] = 0; inventory.visual.people[JOB_SERGEANT] = 0; inventory.visual.people[JOB_OFFICER] = 0; inventory.visual.people[JOB_GENERAL] = 0; inventory.visual.people[JOB_GEOLOGIST] = 6; inventory.visual.people[JOB_SHIPWRIGHT] = 0; inventory.visual.people[JOB_SCOUT] = 2; inventory.visual.people[JOB_PACKDONKEY] = 8; break; // Viel case 3: inventory.visual.goods[GD_BEER] = 12; inventory.visual.goods[GD_TONGS] = 0; inventory.visual.goods[GD_HAMMER] = 32; inventory.visual.goods[GD_AXE] = 12; inventory.visual.goods[GD_SAW] = 4; inventory.visual.goods[GD_PICKAXE] = 4; inventory.visual.goods[GD_SHOVEL] = 8; inventory.visual.goods[GD_CRUCIBLE] = 8; inventory.visual.goods[GD_RODANDLINE] = 12; inventory.visual.goods[GD_SCYTHE] = 16; inventory.visual.goods[GD_WATEREMPTY] = 0; inventory.visual.goods[GD_WATER] = 0; inventory.visual.goods[GD_CLEAVER] = 4; inventory.visual.goods[GD_ROLLINGPIN] = 4; inventory.visual.goods[GD_BOW] = 4; inventory.visual.goods[GD_BOAT] = 24; inventory.visual.goods[GD_SWORD] = 12; inventory.visual.goods[GD_IRON] = 0; inventory.visual.goods[GD_FLOUR] = 0; inventory.visual.goods[GD_FISH] = 8; inventory.visual.goods[GD_BREAD] = 16; inventory.visual.goods[GD_SHIELDROMANS] = 12; inventory.visual.goods[GD_WOOD] = 48; inventory.visual.goods[GD_BOARDS] = 88; inventory.visual.goods[GD_STONES] = 136; inventory.visual.goods[GD_SHIELDVIKINGS] = 0; inventory.visual.goods[GD_SHIELDAFRICANS] = 0; inventory.visual.goods[GD_GRAIN] = 0; inventory.visual.goods[GD_COINS] = 0; inventory.visual.goods[GD_GOLD] = 0; inventory.visual.goods[GD_IRONORE] = 32; inventory.visual.goods[GD_COAL] = 32; inventory.visual.goods[GD_MEAT] = 12; inventory.visual.goods[GD_HAM] = 0; inventory.visual.goods[GD_SHIELDJAPANESE] = 0; inventory.visual.people[JOB_HELPER] = 104; inventory.visual.people[JOB_WOODCUTTER] = 16; inventory.visual.people[JOB_FISHER] = 0; inventory.visual.people[JOB_FORESTER] = 8; inventory.visual.people[JOB_CARPENTER] = 8; inventory.visual.people[JOB_STONEMASON] = 8; inventory.visual.people[JOB_HUNTER] = 4; inventory.visual.people[JOB_FARMER] = 0; inventory.visual.people[JOB_MILLER] = 0; inventory.visual.people[JOB_BAKER] = 0; inventory.visual.people[JOB_BUTCHER] = 0; inventory.visual.people[JOB_MINER] = 20; inventory.visual.people[JOB_BREWER] = 0; inventory.visual.people[JOB_PIGBREEDER] = 0; inventory.visual.people[JOB_DONKEYBREEDER] = 0; inventory.visual.people[JOB_IRONFOUNDER] = 0; inventory.visual.people[JOB_MINTER] = 0; inventory.visual.people[JOB_METALWORKER] = 4; inventory.visual.people[JOB_ARMORER] = 8; inventory.visual.people[JOB_BUILDER] = 20; inventory.visual.people[JOB_PLANER] = 12; inventory.visual.people[JOB_PRIVATE] = 92; inventory.visual.people[JOB_PRIVATEFIRSTCLASS] = 0; inventory.visual.people[JOB_SERGEANT] = 0; inventory.visual.people[JOB_OFFICER] = 0; inventory.visual.people[JOB_GENERAL] = 0; inventory.visual.people[JOB_GEOLOGIST] = 12; inventory.visual.people[JOB_SHIPWRIGHT] = 0; inventory.visual.people[JOB_SCOUT] = 4; inventory.visual.people[JOB_PACKDONKEY] = 16; break; } inventory.real = inventory.visual; // Aktuellen Warenbestand zur aktuellen Inventur dazu addieren AddToInventory(); // Take 1 as the reserve per rank for(unsigned i = 0; i <= gwg->GetGGS().GetMaxMilitaryRank(); ++i) { reserve_soldiers_claimed_visual[i] = reserve_soldiers_claimed_real[i] = 1; RefreshReserve(i); } // Evtl. liegen am Anfang Waffen im HQ, sodass rekrutiert werden muss TryRecruiting(); // ins Militärquadrat einfügen gwg->GetMilitarySquares().Add(this); gwg->RecalcTerritory(*this, TerritoryChangeReason::Build); }