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);
}