64
64
const unsigned short RECRUITE_GF = 200;
65
65
const unsigned short RECRUITE_RANDOM_GF = 200;
67
nobBaseWarehouse::nobBaseWarehouse(const BuildingType type,const unsigned short x, const unsigned short y,const unsigned char player,const Nation nation)
68
: nobBaseMilitary(type,x,y,player,nation), fetch_double_protection(false), producinghelpers_event(em->AddEvent(this,PRODUCE_HELPERS_GF+RANDOM.Rand(__FILE__,__LINE__,obj_id,PRODUCE_HELPERS_RANDOM_GF),1)), recruiting_event(0),
69
empty_event(0), store_event(0)
67
nobBaseWarehouse::nobBaseWarehouse(const BuildingType type, const unsigned short x, const unsigned short y, const unsigned char player, const Nation nation)
68
: nobBaseMilitary(type, x, y, player, nation), fetch_double_protection(false), producinghelpers_event(em->AddEvent(this, PRODUCE_HELPERS_GF + RANDOM.Rand(__FILE__, __LINE__, obj_id, PRODUCE_HELPERS_RANDOM_GF), 1)), recruiting_event(0),
69
empty_event(0), store_event(0)
72
for(unsigned i = 0;i<5;++i)
73
reserve_soldiers_available[i] =
74
reserve_soldiers_claimed_visual[i] =
75
reserve_soldiers_claimed_real[i] = 0;
72
for(unsigned i = 0; i < 5; ++i)
73
reserve_soldiers_available[i] =
74
reserve_soldiers_claimed_visual[i] =
75
reserve_soldiers_claimed_real[i] = 0;
78
78
nobBaseWarehouse::~nobBaseWarehouse()
80
// Waiting Wares löschen
81
for(list<Ware*>::iterator it = waiting_wares.begin();it.valid();++it)
80
// Waiting Wares löschen
81
for(list<Ware*>::iterator it = waiting_wares.begin(); it.valid(); ++it)
85
85
void nobBaseWarehouse::Destroy_nobBaseWarehouse()
87
// Aus der Warenhausliste entfernen
88
gwg->GetPlayer(player)->RemoveWarehouse(this);
89
// Den Waren und Figuren Bescheid sagen, die zu uns auf den Weg sind, dass wir nun nicht mehr existieren
90
for(std::list<noFigure*>::iterator it = dependent_figures.begin();it != dependent_figures.end();++it)
92
for(list<Ware*>::iterator it = dependent_wares.begin();it.valid();++it)
93
(*it)->GoalDestroyed();
95
// ggf. Events abmelden
96
em->RemoveEvent(recruiting_event);
97
em->RemoveEvent(producinghelpers_event);
98
em->RemoveEvent(empty_event);
99
em->RemoveEvent(store_event);
101
// Waiting Wares löschen
102
for(list<Ware*>::iterator it = waiting_wares.begin();it.valid();++it)
104
(*it)->WareLost(player);
108
waiting_wares.clear();
110
// restliche Warenbestände von der Inventur wieder abziehen
111
for(unsigned int i = 0; i < WARE_TYPES_COUNT; ++i)
112
gwg->GetPlayer(player)->DecreaseInventoryWare(GoodType(i),real_goods.goods[i]);
114
//for(unsigned int i = 0; i < 30; ++i)
115
// gwg->GetPlayer(player)->DecreaseInventoryJob(Job(i),real_goods.people[i]);
117
// Objekt, das die flüchtenden Leute nach und nach ausspuckt, erzeugen
118
new BurnedWarehouse(x,y,player,real_goods.people);
120
Destroy_nobBaseMilitary();
124
void nobBaseWarehouse::Serialize_nobBaseWarehouse(SerializedGameData * sgd) const
126
Serialize_nobBaseMilitary(sgd);
128
sgd->PushObjectList(waiting_wares,true);
129
sgd->PushBool(fetch_double_protection);
130
sgd->PushObjectList(dependent_figures,false);
131
sgd->PushObjectList(dependent_wares,true);
132
sgd->PushObject(producinghelpers_event,true);
133
sgd->PushObject(recruiting_event,true);
134
sgd->PushObject(empty_event,true);
135
sgd->PushObject(store_event,true);
137
for(unsigned i = 0;i<5;++i)
139
// Nur das Reale, nicht das visuelle speichern, das wäre sinnlos!, beim Laden ist das visuelle = realem
140
sgd->PushUnsignedInt(reserve_soldiers_available[i]);
141
sgd->PushUnsignedInt(reserve_soldiers_claimed_real[i]);
144
for(unsigned i = 0;i<WARE_TYPES_COUNT;++i)
146
sgd->PushUnsignedInt(goods.goods[i]);
147
sgd->PushUnsignedInt(real_goods.goods[i]);
148
sgd->PushUnsignedChar(inventory_settings_real.wares[i]);
150
for(unsigned i = 0;i<JOB_TYPES_COUNT;++i)
152
sgd->PushUnsignedInt(goods.people[i]);
153
sgd->PushUnsignedInt(real_goods.people[i]);
154
sgd->PushUnsignedChar(inventory_settings_real.figures[i]);
158
nobBaseWarehouse::nobBaseWarehouse(SerializedGameData * sgd, const unsigned obj_id) : nobBaseMilitary(sgd,obj_id)
160
sgd->PopObjectList(waiting_wares,GOT_WARE);
161
fetch_double_protection = sgd->PopBool();
162
sgd->PopObjectList(dependent_figures,GOT_UNKNOWN);
163
sgd->PopObjectList(dependent_wares,GOT_WARE);
165
producinghelpers_event = sgd->PopObject<EventManager::Event>(GOT_EVENT);
166
recruiting_event = sgd->PopObject<EventManager::Event>(GOT_EVENT);
167
empty_event = sgd->PopObject<EventManager::Event>(GOT_EVENT);
168
store_event = sgd->PopObject<EventManager::Event>(GOT_EVENT);
170
for(unsigned i = 0;i<5;++i)
172
reserve_soldiers_available[i] = sgd->PopUnsignedInt();
173
reserve_soldiers_claimed_visual[i] = reserve_soldiers_claimed_real[i] = sgd->PopUnsignedInt();
176
for(unsigned i = 0;i<WARE_TYPES_COUNT;++i)
178
goods.goods[i] = sgd->PopUnsignedInt();
179
real_goods.goods[i] = sgd->PopUnsignedInt();
180
inventory_settings_real.wares[i] = inventory_settings_visual.wares[i] = sgd->PopUnsignedChar();
182
for(unsigned i = 0;i<JOB_TYPES_COUNT;++i)
184
goods.people[i] = sgd->PopUnsignedInt();
185
real_goods.people[i] = sgd->PopUnsignedInt();
186
inventory_settings_real.figures[i] = inventory_settings_visual.figures[i] = sgd->PopUnsignedChar();
191
void nobBaseWarehouse::OrderCarrier(noRoadNode* const goal, RoadSegment * workplace)
193
workplace->setCarrier(0, new nofCarrier((workplace->GetRoadType() == RoadSegment::RT_BOAT) ? nofCarrier::CT_BOAT : nofCarrier::CT_NORMAL, x, y, player, workplace, goal));
195
if(!UseFigureAtOnce(workplace->getCarrier(0), goal))
196
AddLeavingFigure(workplace->getCarrier(0));
198
--real_goods.people[JOB_HELPER];
199
if((workplace->GetRoadType() == RoadSegment::RT_BOAT))
200
--real_goods.goods[GD_BOAT];
202
// Evtl. kein Gehilfe mehr, sodass das Rekrutieren gestoppt werden muss
87
// Aus der Warenhausliste entfernen
88
gwg->GetPlayer(player)->RemoveWarehouse(this);
89
// Den Waren und Figuren Bescheid sagen, die zu uns auf den Weg sind, dass wir nun nicht mehr existieren
90
for(std::list<noFigure*>::iterator it = dependent_figures.begin(); it != dependent_figures.end(); ++it)
92
for(list<Ware*>::iterator it = dependent_wares.begin(); it.valid(); ++it)
93
(*it)->GoalDestroyed();
95
// ggf. Events abmelden
96
em->RemoveEvent(recruiting_event);
97
em->RemoveEvent(producinghelpers_event);
98
em->RemoveEvent(empty_event);
99
em->RemoveEvent(store_event);
101
// Waiting Wares löschen
102
for(list<Ware*>::iterator it = waiting_wares.begin(); it.valid(); ++it)
104
(*it)->WareLost(player);
108
waiting_wares.clear();
110
// restliche Warenbestände von der Inventur wieder abziehen
111
for(unsigned int i = 0; i < WARE_TYPES_COUNT; ++i)
112
gwg->GetPlayer(player)->DecreaseInventoryWare(GoodType(i), real_goods.goods[i]);
114
//for(unsigned int i = 0; i < 30; ++i)
115
// gwg->GetPlayer(player)->DecreaseInventoryJob(Job(i),real_goods.people[i]);
117
// Objekt, das die flüchtenden Leute nach und nach ausspuckt, erzeugen
118
new BurnedWarehouse(x, y, player, real_goods.people);
120
Destroy_nobBaseMilitary();
124
void nobBaseWarehouse::Serialize_nobBaseWarehouse(SerializedGameData* sgd) const
126
Serialize_nobBaseMilitary(sgd);
128
sgd->PushObjectList(waiting_wares, true);
129
sgd->PushBool(fetch_double_protection);
130
sgd->PushObjectList(dependent_figures, false);
131
sgd->PushObjectList(dependent_wares, true);
132
sgd->PushObject(producinghelpers_event, true);
133
sgd->PushObject(recruiting_event, true);
134
sgd->PushObject(empty_event, true);
135
sgd->PushObject(store_event, true);
137
for(unsigned i = 0; i < 5; ++i)
139
// Nur das Reale, nicht das visuelle speichern, das wäre sinnlos!, beim Laden ist das visuelle = realem
140
sgd->PushUnsignedInt(reserve_soldiers_available[i]);
141
sgd->PushUnsignedInt(reserve_soldiers_claimed_real[i]);
144
for(unsigned i = 0; i < WARE_TYPES_COUNT; ++i)
146
sgd->PushUnsignedInt(goods.goods[i]);
147
sgd->PushUnsignedInt(real_goods.goods[i]);
148
sgd->PushUnsignedChar(inventory_settings_real.wares[i]);
150
for(unsigned i = 0; i < JOB_TYPES_COUNT; ++i)
152
sgd->PushUnsignedInt(goods.people[i]);
153
sgd->PushUnsignedInt(real_goods.people[i]);
154
sgd->PushUnsignedChar(inventory_settings_real.figures[i]);
158
nobBaseWarehouse::nobBaseWarehouse(SerializedGameData* sgd, const unsigned obj_id) : nobBaseMilitary(sgd, obj_id)
160
sgd->PopObjectList(waiting_wares, GOT_WARE);
161
fetch_double_protection = sgd->PopBool();
162
sgd->PopObjectList(dependent_figures, GOT_UNKNOWN);
163
sgd->PopObjectList(dependent_wares, GOT_WARE);
165
producinghelpers_event = sgd->PopObject<EventManager::Event>(GOT_EVENT);
166
recruiting_event = sgd->PopObject<EventManager::Event>(GOT_EVENT);
167
empty_event = sgd->PopObject<EventManager::Event>(GOT_EVENT);
168
store_event = sgd->PopObject<EventManager::Event>(GOT_EVENT);
170
for(unsigned i = 0; i < 5; ++i)
172
reserve_soldiers_available[i] = sgd->PopUnsignedInt();
173
reserve_soldiers_claimed_visual[i] = reserve_soldiers_claimed_real[i] = sgd->PopUnsignedInt();
176
for(unsigned i = 0; i < WARE_TYPES_COUNT; ++i)
178
goods.goods[i] = sgd->PopUnsignedInt();
179
real_goods.goods[i] = sgd->PopUnsignedInt();
180
inventory_settings_real.wares[i] = inventory_settings_visual.wares[i] = sgd->PopUnsignedChar();
182
for(unsigned i = 0; i < JOB_TYPES_COUNT; ++i)
184
goods.people[i] = sgd->PopUnsignedInt();
185
real_goods.people[i] = sgd->PopUnsignedInt();
186
inventory_settings_real.figures[i] = inventory_settings_visual.figures[i] = sgd->PopUnsignedChar();
191
void nobBaseWarehouse::OrderCarrier(noRoadNode* const goal, RoadSegment* workplace)
193
workplace->setCarrier(0, new nofCarrier((workplace->GetRoadType() == RoadSegment::RT_BOAT) ? nofCarrier::CT_BOAT : nofCarrier::CT_NORMAL, x, y, player, workplace, goal));
195
if(!UseFigureAtOnce(workplace->getCarrier(0), goal))
196
AddLeavingFigure(workplace->getCarrier(0));
198
--real_goods.people[JOB_HELPER];
199
if((workplace->GetRoadType() == RoadSegment::RT_BOAT))
200
--real_goods.goods[GD_BOAT];
202
// Evtl. kein Gehilfe mehr, sodass das Rekrutieren gestoppt werden muss
206
206
bool nobBaseWarehouse::OrderJob(const Job job, noRoadNode* const goal, const bool allow_recruiting)
208
// Job überhaupt hier vorhanden
209
if(!real_goods.people[job])
211
// Evtl das Werkzeug der Person vorhanden sowie ein Träger?
212
bool tool_available = (JOB_CONSTS[job].tool == GD_NOTHING) ? true : (real_goods.goods[JOB_CONSTS[job].tool]!=0);
213
if(!(real_goods.people[JOB_HELPER] && tool_available) || !allow_recruiting)
215
// nein --> dann tschüss
220
noFigure * fig = CreateJob(job,x,y,player,goal);
221
// Wenn Figur nicht sofort von abgeleiteter Klasse verwenet wird, fügen wir die zur Leave-Liste hinzu
222
if(!UseFigureAtOnce(fig,goal))
223
AddLeavingFigure(fig);
226
// Ziel Bescheid sagen, dass dortin ein neuer Arbeiter kommt (bei Flaggen als das anders machen)
227
if(goal->GetType() == NOP_FLAG)
232
static_cast<noBaseBuilding*>(goal)->GotWorker(job,fig);
235
if(real_goods.people[job])
236
--real_goods.people[job];
239
// ansonsten muss er erst noch "rekrutiert" werden
240
if(JOB_CONSTS[job].tool != GD_NOTHING)
242
--real_goods.goods[JOB_CONSTS[job].tool];
243
--goods.goods[JOB_CONSTS[job].tool];
244
gwg->GetPlayer(player)->DecreaseInventoryWare(JOB_CONSTS[job].tool,1);
247
--real_goods.people[JOB_HELPER];
248
--goods.people[JOB_HELPER];
249
gwg->GetPlayer(player)->DecreaseInventoryJob(JOB_HELPER,1);
251
// erhöhen, da er ja dann rauskommt und es bei den visuellen wieder abgezogen wird!
253
gwg->GetPlayer(player)->IncreaseInventoryJob(job,1);
257
// Evtl. kein Gehilfe mehr da, sodass das Rekrutieren gestoppt werden muss
208
// Job überhaupt hier vorhanden
209
if(!real_goods.people[job])
211
// Evtl das Werkzeug der Person vorhanden sowie ein Träger?
212
bool tool_available = (JOB_CONSTS[job].tool == GD_NOTHING) ? true : (real_goods.goods[JOB_CONSTS[job].tool] != 0);
213
if(!(real_goods.people[JOB_HELPER] && tool_available) || !allow_recruiting)
215
// nein --> dann tschüss
220
noFigure* fig = CreateJob(job, x, y, player, goal);
221
// Wenn Figur nicht sofort von abgeleiteter Klasse verwenet wird, fügen wir die zur Leave-Liste hinzu
222
if(!UseFigureAtOnce(fig, goal))
223
AddLeavingFigure(fig);
226
// Ziel Bescheid sagen, dass dortin ein neuer Arbeiter kommt (bei Flaggen als das anders machen)
227
if(goal->GetType() == NOP_FLAG)
232
static_cast<noBaseBuilding*>(goal)->GotWorker(job, fig);
235
if(real_goods.people[job])
236
--real_goods.people[job];
239
// ansonsten muss er erst noch "rekrutiert" werden
240
if(JOB_CONSTS[job].tool != GD_NOTHING)
242
--real_goods.goods[JOB_CONSTS[job].tool];
243
--goods.goods[JOB_CONSTS[job].tool];
244
gwg->GetPlayer(player)->DecreaseInventoryWare(JOB_CONSTS[job].tool, 1);
247
--real_goods.people[JOB_HELPER];
248
--goods.people[JOB_HELPER];
249
gwg->GetPlayer(player)->DecreaseInventoryJob(JOB_HELPER, 1);
251
// erhöhen, da er ja dann rauskommt und es bei den visuellen wieder abgezogen wird!
253
gwg->GetPlayer(player)->IncreaseInventoryJob(job, 1);
257
// Evtl. kein Gehilfe mehr da, sodass das Rekrutieren gestoppt werden muss
263
nofCarrier * nobBaseWarehouse::OrderDonkey(RoadSegment * road,noRoadNode * const goal_flag)
263
nofCarrier* nobBaseWarehouse::OrderDonkey(RoadSegment* road, noRoadNode* const goal_flag)
265
// Ãberhaupt ein Esel vorhanden?
266
if(!real_goods.people[JOB_PACKDONKEY])
270
AddLeavingFigure(donkey = new nofCarrier(nofCarrier::CT_DONKEY,x,y,player,road,goal_flag));
271
--real_goods.people[JOB_PACKDONKEY];
265
// Ãberhaupt ein Esel vorhanden?
266
if(!real_goods.people[JOB_PACKDONKEY])
270
AddLeavingFigure(donkey = new nofCarrier(nofCarrier::CT_DONKEY, x, y, player, road, goal_flag));
271
--real_goods.people[JOB_PACKDONKEY];
277
277
void nobBaseWarehouse::HandleBaseEvent(const unsigned int id)
286
// Falls eine Bestellung storniert wurde
287
if(!leave_house.size() && !waiting_wares.size())
293
// Fight or something in front of the house and we are not defending?
294
if (!gwg->IsRoadNodeForFigures(gwg->GetXA(x,y,4), gwg->GetYA(x,y,4), 4))
299
// try to find a defender and make him leave the house first
300
for(std::list<noFigure*>::iterator it = leave_house.begin();it!=leave_house.end();++it)
302
if (((*it)->GetGOT() == GOT_NOF_AGGRESSIVEDEFENDER) ||
303
((*it)->GetGOT() == GOT_NOF_DEFENDER))
305
// remove defender from list, insert him again in front of all others
306
leave_house.push_front(*it);
307
leave_house.erase(it);
315
// no defender found? trigger next leaving event :)
324
// Figuren kommen zuerst raus
325
if(leave_house.size())
327
noFigure * fig = *leave_house.begin();
329
gwg->AddFigure(fig,x,y);
331
/// Aktive Soldaten laufen nicht im Wegenetz, die das Haus verteidigen!
332
if(fig->GetGOT() != GOT_NOF_AGGRESSIVEDEFENDER &&
333
fig->GetGOT() != GOT_NOF_DEFENDER)
334
// ansonsten alle anderen müssen aber wissen, auf welcher StraÃe sie zu Beginn laufen
335
fig->InitializeRoadWalking(routes[4],0,true);
338
// Bei Lagerhausarbeitern das nicht abziehen!
339
if(!fig->MemberOfWarehouse())
341
// War das ein Boot-Träger?
342
if(fig->GetJobType() == JOB_BOATCARRIER)
344
// Träger abziehen einzeln
345
--goods.people[JOB_HELPER];
346
// Boot abziehen einzeln
347
--goods.goods[GD_BOAT];
350
--goods.people[(*leave_house.begin())->GetJobType()];
352
if(fig->GetGOT() == GOT_NOF_TRADEDONKEY)
354
// Trade donkey carrying wares?
355
--goods.goods[static_cast<nofTradeDonkey*>(fig)->GetCarriedWare()];
359
leave_house.pop_front();
363
// Ist noch Platz an der Flagge?
364
if(GetFlag()->GetWareCount() < 8)
366
// Dann Ware raustragen lassen
367
Ware * ware = *waiting_wares.begin();
368
nofWarehouseWorker * worker = new nofWarehouseWorker(x,y,player,ware,0);
369
gwg->AddFigure(worker,x,y);
370
assert(goods.goods[ConvertShields(ware->type)]>0);
371
--goods.goods[ConvertShields(ware->type)];
372
worker->WalkToGoal();
373
ware->Carry(GetFlag());
374
waiting_wares.pop_front();
378
// Kein Platz mehr für Waren --> keiner brauch mehr rauszukommen, und Figuren gibts ja auch keine mehr
383
// Wenn keine Figuren und Waren mehr da sind (bzw die Flagge vorm Haus voll ist), brauch auch keiner mehr rauszukommen
384
if(!leave_house.size() && !waiting_wares.size())
389
leaving_event = em->AddEvent(this,20+RANDOM.Rand(__FILE__,__LINE__,obj_id,10));
391
// Träger-Produzier-Event
394
// Nur bei unter 100 Träcern, weitere "produzieren"
395
if(real_goods.people[JOB_HELPER] < 100)
397
++real_goods.people[JOB_HELPER];
398
++goods.people[JOB_HELPER];
400
gwg->GetPlayer(player)->IncreaseInventoryJob(JOB_HELPER,1);
402
if(real_goods.people[JOB_HELPER] == 1)
405
// 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
406
gwg->GetPlayer(player)->FindWarehouseForAllRoads();
407
// evtl Träger mit Werkzeug kombiniert -> neuer Beruf
408
gwg->GetPlayer(player)->FindWarehouseForAllJobs(JOB_NOTHING);
411
else if(real_goods.people[JOB_HELPER] > 100)
413
// Bei Ãberbevölkerung Träger vernichten
414
--real_goods.people[JOB_HELPER];
415
--goods.people[JOB_HELPER];
417
gwg->GetPlayer(player)->DecreaseInventoryJob(JOB_HELPER,1);
420
producinghelpers_event = em->AddEvent(this,PRODUCE_HELPERS_GF+RANDOM.Rand(__FILE__,__LINE__,obj_id,PRODUCE_HELPERS_RANDOM_GF),1);
423
// Evtl. genau der Gehilfe, der zum Rekrutieren notwendig ist
426
// Evtl die Typen gleich wieder auslagern, falls erforderlich
427
CheckOuthousing(1,JOB_HELPER);
429
// Soldaten-Rekrutierungsevent
432
recruiting_event = 0;
433
// Wir wollen so viele der Soldaten rekrutieren,
434
// wie in den military_settings angegeben.
435
// Wird evtl gerundet, dann fair nach Zufall ;) ).
437
unsigned max_recruits;
438
max_recruits = std::min(
439
real_goods.goods[GD_SWORD],
440
real_goods.goods[GD_SHIELDROMANS]);
441
max_recruits = std::min(
442
real_goods.goods[GD_BEER],
444
max_recruits = std::min(
445
real_goods.people[JOB_HELPER],
448
const unsigned recruiting_ratio
449
= gwg->GetPlayer(player)->military_settings[0];
450
unsigned real_recruits =
453
/ MILITARY_SETTINGS_SCALE[0];
455
if (real_recruits * recruiting_ratio % MILITARY_SETTINGS_SCALE[0] != 0)
456
if (unsigned(RANDOM.Rand(__FILE__,__LINE__,obj_id,MILITARY_SETTINGS_SCALE[0]-1))
457
< real_recruits * recruiting_ratio % MILITARY_SETTINGS_SCALE[0])
462
real_goods.people[JOB_PRIVATE] += real_recruits;
463
goods.people[JOB_PRIVATE] += real_recruits;
464
gwg->GetPlayer(player)->IncreaseInventoryJob(JOB_PRIVATE, real_recruits);
466
real_goods.people[JOB_HELPER] -= real_recruits;
467
goods.people[JOB_HELPER] -= real_recruits;
468
gwg->GetPlayer(player)->DecreaseInventoryJob(JOB_HELPER, real_recruits);
470
real_goods.goods[GD_SWORD] -= real_recruits;
471
goods.goods[GD_SWORD] -= real_recruits;
472
gwg->GetPlayer(player)->DecreaseInventoryWare(GD_SWORD,real_recruits);
474
real_goods.goods[GD_SHIELDROMANS] -= real_recruits;
475
goods.goods[GD_SHIELDROMANS] -= real_recruits;
476
gwg->GetPlayer(player)->DecreaseInventoryWare(GD_SHIELDROMANS, real_recruits);
478
real_goods.goods[GD_BEER] -= real_recruits;
479
goods.goods[GD_BEER] -= real_recruits;
480
gwg->GetPlayer(player)->DecreaseInventoryWare(GD_BEER, real_recruits);
483
// Evtl. versuchen nächsten zu rekrutieren
486
// Wenn vorher keine Soldaten hier waren, Reserve prüfen
487
if(real_goods.people[JOB_PRIVATE] == real_recruits)
488
this->RefreshReserve(0);
490
// Wenn vorher keine Soldaten hier waren, Militärgebäude prüfen (evtl kann der Soldat ja wieder in eins gehen)
491
if(real_goods.people[JOB_PRIVATE] == real_recruits)
492
for (unsigned short i = 0; i < real_recruits; ++i)
493
gwg->GetPlayer(player)->NewSoldierAvailable(real_goods.people[JOB_PRIVATE]);
500
// Fight or something in front of the house? Try again later!
501
if (!gwg->IsRoadNodeForFigures(gwg->GetXA(x,y,4), gwg->GetYA(x,y,4), 4))
503
empty_event = em->AddEvent(this,EMPTY_INTERVAL,3);
509
list<unsigned> type_list;
510
// Waren und Figuren zum Auslagern zusammensuchen (id >= 34 --> Figur!)
511
// Wenn keine Platz an Flagge, dann keine Waren raus
512
if(GetFlag()->IsSpaceForWare())
514
for(unsigned i = 0;i<WARE_TYPES_COUNT;++i)
516
if(CheckRealInventorySettings(0,4,i) && real_goods.goods[i])
517
type_list.push_back(i);
521
for(unsigned i = 0;i<JOB_TYPES_COUNT;++i)
523
// Figuren, die noch nicht implementiert sind, nicht nehmen!
524
if(CheckRealInventorySettings(1,4,i) && real_goods.people[i])
525
type_list.push_back(WARE_TYPES_COUNT+i);
528
// Gibts überhaupt welche?
529
if(!type_list.size())
530
// ansonsten gleich tschüss
533
// Eine ID zufällig auswählen
534
unsigned type = *type_list[RANDOM.Rand(__FILE__,__LINE__,obj_id,type_list.size())];
536
if(type < WARE_TYPES_COUNT)
540
Ware * ware = new Ware(GoodType(type),0,this);
541
ware->goal = gwg->GetPlayer(player)->FindClientForWare(ware);
543
// Ware zur Liste hinzufügen, damit sie dann rausgetragen wird
544
waiting_wares.push_back(ware);
548
// Ware aus Inventar entfernen
549
--(real_goods.goods[type]);
551
// Evtl. kein Schwert/Schild/Bier mehr da, sodass das Rekrutieren gestoppt werden muss
557
type-=WARE_TYPES_COUNT;
559
nobBaseWarehouse * wh = gwg->GetPlayer(player)->FindWarehouse(this,FW::Condition_StoreFigure,0,true,&type,false);
560
nofPassiveWorker * fig = new nofPassiveWorker(Job(type),x,y,player,NULL);
565
fig->StartWandering();
567
// Kein Ziel gefunden, dann später gleich rumirren!
569
fig->StartWandering();*/
571
AddLeavingFigure(fig);
573
// Person aus Inventar entfernen
574
--(real_goods.people[type]);
576
// Evtl. kein Gehilfe mehr da, sodass das Rekrutieren gestoppt werden muss
580
// Weitere Waren/Figuren zum Auslagern?
581
if(AreWaresToEmpty())
582
// --> Nächstes Event
583
empty_event = em->AddEvent(this,EMPTY_INTERVAL,3);
591
// Storing wares done?
592
bool storing_done = false;
593
// Is storing still wanted?
594
bool storing_wanted = false;
596
// Untersuchen, welche Waren und Figuren eingelagert werden sollen
597
for(unsigned i = 0;i<WARE_TYPES_COUNT;++i)
599
// Soll Ware eingeliefert werden?
600
if(inventory_settings_real.wares[i] & 8)
602
storing_wanted = true;
604
// Lagerhaus suchen, das diese Ware enthält
605
nobBaseWarehouse * wh = players->getElement(player)
606
->FindWarehouse(this,FW::Condition_StoreAndDontWantWare,NULL,false,(void*)&i,false);
611
Ware * ware = wh->OrderWare(GoodType(i),this);
614
dependent_wares.push_back(ware);
622
// Menschen "bestellen" wenn noch keine Ware bestellt wurde
625
for(unsigned i = 0;i<JOB_TYPES_COUNT;++i)
627
// Soll dieser Typ von Mensch bestellt werden?
628
if(inventory_settings_real.figures[i] & 8)
630
storing_wanted = true;
632
// Lagerhaus suchen, das diesen Job enthält
633
nobBaseWarehouse * wh = players->getElement(player)
634
->FindWarehouse(this,FW::Condition_StoreAndDontWantFigure,NULL,false,(void*)&i,false);
639
if(wh->OrderJob(Job(i),this,false))
646
// Storing still wanted?
647
// Then continue ordering new stuff
649
store_event = em->AddEvent(this,STORE_INTERVAL,4);
286
// Falls eine Bestellung storniert wurde
287
if(!leave_house.size() && !waiting_wares.size())
293
// Fight or something in front of the house and we are not defending?
294
if (!gwg->IsRoadNodeForFigures(gwg->GetXA(x, y, 4), gwg->GetYA(x, y, 4), 4))
299
// try to find a defender and make him leave the house first
300
for(std::list<noFigure*>::iterator it = leave_house.begin(); it != leave_house.end(); ++it)
302
if (((*it)->GetGOT() == GOT_NOF_AGGRESSIVEDEFENDER) ||
303
((*it)->GetGOT() == GOT_NOF_DEFENDER))
305
// remove defender from list, insert him again in front of all others
306
leave_house.push_front(*it);
307
leave_house.erase(it);
315
// no defender found? trigger next leaving event :)
324
// Figuren kommen zuerst raus
325
if(leave_house.size())
327
noFigure* fig = *leave_house.begin();
329
gwg->AddFigure(fig, x, y);
331
/// Aktive Soldaten laufen nicht im Wegenetz, die das Haus verteidigen!
332
if(fig->GetGOT() != GOT_NOF_AGGRESSIVEDEFENDER &&
333
fig->GetGOT() != GOT_NOF_DEFENDER)
334
// ansonsten alle anderen müssen aber wissen, auf welcher StraÃe sie zu Beginn laufen
335
fig->InitializeRoadWalking(routes[4], 0, true);
338
// Bei Lagerhausarbeitern das nicht abziehen!
339
if(!fig->MemberOfWarehouse())
341
// War das ein Boot-Träger?
342
if(fig->GetJobType() == JOB_BOATCARRIER)
344
// Träger abziehen einzeln
345
--goods.people[JOB_HELPER];
346
// Boot abziehen einzeln
347
--goods.goods[GD_BOAT];
350
--goods.people[(*leave_house.begin())->GetJobType()];
352
if(fig->GetGOT() == GOT_NOF_TRADEDONKEY)
354
// Trade donkey carrying wares?
355
--goods.goods[static_cast<nofTradeDonkey*>(fig)->GetCarriedWare()];
359
leave_house.pop_front();
363
// Ist noch Platz an der Flagge?
364
if(GetFlag()->GetWareCount() < 8)
366
// Dann Ware raustragen lassen
367
Ware* ware = *waiting_wares.begin();
368
nofWarehouseWorker* worker = new nofWarehouseWorker(x, y, player, ware, 0);
369
gwg->AddFigure(worker, x, y);
370
assert(goods.goods[ConvertShields(ware->type)] > 0);
371
--goods.goods[ConvertShields(ware->type)];
372
worker->WalkToGoal();
373
ware->Carry(GetFlag());
374
waiting_wares.pop_front();
378
// Kein Platz mehr für Waren --> keiner brauch mehr rauszukommen, und Figuren gibts ja auch keine mehr
383
// Wenn keine Figuren und Waren mehr da sind (bzw die Flagge vorm Haus voll ist), brauch auch keiner mehr rauszukommen
384
if(!leave_house.size() && !waiting_wares.size())
389
leaving_event = em->AddEvent(this, 20 + RANDOM.Rand(__FILE__, __LINE__, obj_id, 10));
391
// Träger-Produzier-Event
394
// Nur bei unter 100 Träcern, weitere "produzieren"
395
if(real_goods.people[JOB_HELPER] < 100)
397
++real_goods.people[JOB_HELPER];
398
++goods.people[JOB_HELPER];
400
gwg->GetPlayer(player)->IncreaseInventoryJob(JOB_HELPER, 1);
402
if(real_goods.people[JOB_HELPER] == 1)
405
// 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
406
gwg->GetPlayer(player)->FindWarehouseForAllRoads();
407
// evtl Träger mit Werkzeug kombiniert -> neuer Beruf
408
gwg->GetPlayer(player)->FindWarehouseForAllJobs(JOB_NOTHING);
411
else if(real_goods.people[JOB_HELPER] > 100)
413
// Bei Ãberbevölkerung Träger vernichten
414
--real_goods.people[JOB_HELPER];
415
--goods.people[JOB_HELPER];
417
gwg->GetPlayer(player)->DecreaseInventoryJob(JOB_HELPER, 1);
420
producinghelpers_event = em->AddEvent(this, PRODUCE_HELPERS_GF + RANDOM.Rand(__FILE__, __LINE__, obj_id, PRODUCE_HELPERS_RANDOM_GF), 1);
423
// Evtl. genau der Gehilfe, der zum Rekrutieren notwendig ist
426
// Evtl die Typen gleich wieder auslagern, falls erforderlich
427
CheckOuthousing(1, JOB_HELPER);
429
// Soldaten-Rekrutierungsevent
432
recruiting_event = 0;
433
// Wir wollen so viele der Soldaten rekrutieren,
434
// wie in den military_settings angegeben.
435
// Wird evtl gerundet, dann fair nach Zufall ;) ).
437
unsigned max_recruits;
438
max_recruits = std::min(
439
real_goods.goods[GD_SWORD],
440
real_goods.goods[GD_SHIELDROMANS]);
441
max_recruits = std::min(
442
real_goods.goods[GD_BEER],
444
max_recruits = std::min(
445
real_goods.people[JOB_HELPER],
448
const unsigned recruiting_ratio
449
= gwg->GetPlayer(player)->military_settings[0];
450
unsigned real_recruits =
453
/ MILITARY_SETTINGS_SCALE[0];
455
if (real_recruits * recruiting_ratio % MILITARY_SETTINGS_SCALE[0] != 0)
456
if (unsigned(RANDOM.Rand(__FILE__, __LINE__, obj_id, MILITARY_SETTINGS_SCALE[0] - 1))
457
< real_recruits * recruiting_ratio % MILITARY_SETTINGS_SCALE[0])
462
real_goods.people[JOB_PRIVATE] += real_recruits;
463
goods.people[JOB_PRIVATE] += real_recruits;
464
gwg->GetPlayer(player)->IncreaseInventoryJob(JOB_PRIVATE, real_recruits);
466
real_goods.people[JOB_HELPER] -= real_recruits;
467
goods.people[JOB_HELPER] -= real_recruits;
468
gwg->GetPlayer(player)->DecreaseInventoryJob(JOB_HELPER, real_recruits);
470
real_goods.goods[GD_SWORD] -= real_recruits;
471
goods.goods[GD_SWORD] -= real_recruits;
472
gwg->GetPlayer(player)->DecreaseInventoryWare(GD_SWORD, real_recruits);
474
real_goods.goods[GD_SHIELDROMANS] -= real_recruits;
475
goods.goods[GD_SHIELDROMANS] -= real_recruits;
476
gwg->GetPlayer(player)->DecreaseInventoryWare(GD_SHIELDROMANS, real_recruits);
478
real_goods.goods[GD_BEER] -= real_recruits;
479
goods.goods[GD_BEER] -= real_recruits;
480
gwg->GetPlayer(player)->DecreaseInventoryWare(GD_BEER, real_recruits);
483
// Evtl. versuchen nächsten zu rekrutieren
486
// Wenn vorher keine Soldaten hier waren, Reserve prüfen
487
if(real_goods.people[JOB_PRIVATE] == real_recruits)
488
this->RefreshReserve(0);
490
// Wenn vorher keine Soldaten hier waren, Militärgebäude prüfen (evtl kann der Soldat ja wieder in eins gehen)
491
if(real_goods.people[JOB_PRIVATE] == real_recruits)
492
for (unsigned short i = 0; i < real_recruits; ++i)
493
gwg->GetPlayer(player)->NewSoldierAvailable(real_goods.people[JOB_PRIVATE]);
500
// Fight or something in front of the house? Try again later!
501
if (!gwg->IsRoadNodeForFigures(gwg->GetXA(x, y, 4), gwg->GetYA(x, y, 4), 4))
503
empty_event = em->AddEvent(this, EMPTY_INTERVAL, 3);
509
list<unsigned> type_list;
510
// Waren und Figuren zum Auslagern zusammensuchen (id >= 34 --> Figur!)
511
// Wenn keine Platz an Flagge, dann keine Waren raus
512
if(GetFlag()->IsSpaceForWare())
514
for(unsigned i = 0; i < WARE_TYPES_COUNT; ++i)
516
if(CheckRealInventorySettings(0, 4, i) && real_goods.goods[i])
517
type_list.push_back(i);
521
for(unsigned i = 0; i < JOB_TYPES_COUNT; ++i)
523
// Figuren, die noch nicht implementiert sind, nicht nehmen!
524
if(CheckRealInventorySettings(1, 4, i) && real_goods.people[i])
525
type_list.push_back(WARE_TYPES_COUNT + i);
528
// Gibts überhaupt welche?
529
if(!type_list.size())
530
// ansonsten gleich tschüss
533
// Eine ID zufällig auswählen
534
unsigned type = *type_list[RANDOM.Rand(__FILE__, __LINE__, obj_id, type_list.size())];
536
if(type < WARE_TYPES_COUNT)
540
Ware* ware = new Ware(GoodType(type), 0, this);
541
ware->goal = gwg->GetPlayer(player)->FindClientForWare(ware);
543
// Ware zur Liste hinzufügen, damit sie dann rausgetragen wird
544
waiting_wares.push_back(ware);
548
// Ware aus Inventar entfernen
549
--(real_goods.goods[type]);
551
// Evtl. kein Schwert/Schild/Bier mehr da, sodass das Rekrutieren gestoppt werden muss
557
type -= WARE_TYPES_COUNT;
559
nobBaseWarehouse* wh = gwg->GetPlayer(player)->FindWarehouse(this, FW::Condition_StoreFigure, 0, true, &type, false);
560
nofPassiveWorker* fig = new nofPassiveWorker(Job(type), x, y, player, NULL);
565
fig->StartWandering();
567
// Kein Ziel gefunden, dann später gleich rumirren!
569
fig->StartWandering();*/
571
AddLeavingFigure(fig);
573
// Person aus Inventar entfernen
574
--(real_goods.people[type]);
576
// Evtl. kein Gehilfe mehr da, sodass das Rekrutieren gestoppt werden muss
580
// Weitere Waren/Figuren zum Auslagern?
581
if(AreWaresToEmpty())
582
// --> Nächstes Event
583
empty_event = em->AddEvent(this, EMPTY_INTERVAL, 3);
591
// Storing wares done?
592
bool storing_done = false;
593
// Is storing still wanted?
594
bool storing_wanted = false;
596
// Untersuchen, welche Waren und Figuren eingelagert werden sollen
597
for(unsigned i = 0; i < WARE_TYPES_COUNT; ++i)
599
// Soll Ware eingeliefert werden?
600
if(inventory_settings_real.wares[i] & 8)
602
storing_wanted = true;
604
// Lagerhaus suchen, das diese Ware enthält
605
nobBaseWarehouse* wh = players->getElement(player)
606
->FindWarehouse(this, FW::Condition_StoreAndDontWantWare, NULL, false, (void*)&i, false);
611
Ware* ware = wh->OrderWare(GoodType(i), this);
614
dependent_wares.push_back(ware);
622
// Menschen "bestellen" wenn noch keine Ware bestellt wurde
625
for(unsigned i = 0; i < JOB_TYPES_COUNT; ++i)
627
// Soll dieser Typ von Mensch bestellt werden?
628
if(inventory_settings_real.figures[i] & 8)
630
storing_wanted = true;
632
// Lagerhaus suchen, das diesen Job enthält
633
nobBaseWarehouse* wh = players->getElement(player)
634
->FindWarehouse(this, FW::Condition_StoreAndDontWantFigure, NULL, false, (void*)&i, false);
639
if(wh->OrderJob(Job(i), this, false))
646
// Storing still wanted?
647
// Then continue ordering new stuff
649
store_event = em->AddEvent(this, STORE_INTERVAL, 4);
656
/// Abgeleitete kann eine gerade erzeugte Ware ggf. sofort verwenden
656
/// Abgeleitete kann eine gerade erzeugte Ware ggf. sofort verwenden
657
657
/// (muss in dem Fall true zurückgeben)
658
bool nobBaseWarehouse::UseWareAtOnce(Ware * ware, noBaseBuilding* const goal)
658
bool nobBaseWarehouse::UseWareAtOnce(Ware* ware, noBaseBuilding* const goal)
663
663
/// Dasselbe für Menschen
664
bool nobBaseWarehouse::UseFigureAtOnce(noFigure * fig, noRoadNode* const goal)
669
Ware * nobBaseWarehouse::OrderWare(const GoodType good, noBaseBuilding* const goal)
671
// Ware überhaupt hier vorhanden (Abfrage eigentlich nicht nötig, aber erstmal zur Sicherheit)
672
if(!real_goods.goods[good])
674
LOG.lprintf("nobBaseWarehouse::OrderWare: WARNING: No ware type %u in warehouse!\n",static_cast<unsigned>(good));
678
Ware * ware = new Ware(good,goal,this);
680
// Abgeleitete Klasse fragen, ob die irgnend etwas besonderes mit dieser Ware anfangen will
681
if(!UseWareAtOnce(ware,goal))
682
// Ware zur Liste hinzufügen, damit sie dann rausgetragen wird
683
waiting_wares.push_back(ware);
685
--real_goods.goods[good];
687
// Wenn gerade keiner rausgeht, muss neues Event angemeldet werden
690
// Evtl. keine Waffen/Bier mehr da, sodass das Rekrutieren gestoppt werden muss
696
void nobBaseWarehouse::AddWaitingWare(Ware * ware)
698
waiting_wares.push_back(ware);
699
// Wenn gerade keiner rausgeht, muss neues Event angemeldet werden
701
// Die visuelle Warenanzahl wieder erhöhen
702
++goods.goods[ConvertShields(ware->type)];
664
bool nobBaseWarehouse::UseFigureAtOnce(noFigure* fig, noRoadNode* const goal)
669
Ware* nobBaseWarehouse::OrderWare(const GoodType good, noBaseBuilding* const goal)
671
// Ware überhaupt hier vorhanden (Abfrage eigentlich nicht nötig, aber erstmal zur Sicherheit)
672
if(!real_goods.goods[good])
674
LOG.lprintf("nobBaseWarehouse::OrderWare: WARNING: No ware type %u in warehouse!\n", static_cast<unsigned>(good));
678
Ware* ware = new Ware(good, goal, this);
680
// Abgeleitete Klasse fragen, ob die irgnend etwas besonderes mit dieser Ware anfangen will
681
if(!UseWareAtOnce(ware, goal))
682
// Ware zur Liste hinzufügen, damit sie dann rausgetragen wird
683
waiting_wares.push_back(ware);
685
--real_goods.goods[good];
687
// Wenn gerade keiner rausgeht, muss neues Event angemeldet werden
690
// Evtl. keine Waffen/Bier mehr da, sodass das Rekrutieren gestoppt werden muss
696
void nobBaseWarehouse::AddWaitingWare(Ware* ware)
698
waiting_wares.push_back(ware);
699
// Wenn gerade keiner rausgeht, muss neues Event angemeldet werden
701
// Die visuelle Warenanzahl wieder erhöhen
702
++goods.goods[ConvertShields(ware->type)];
705
705
bool nobBaseWarehouse::FreePlaceAtFlag()
707
if(waiting_wares.size())
714
// Evtl. war die Flagge voll und das Auslagern musste gestoppt werden
715
// Weitere Waren/Figuren zum Auslagern und kein Event angemeldet?
716
if(AreWaresToEmpty() && !empty_event)
717
// --> Nächstes Event
718
empty_event = em->AddEvent(this,EMPTY_INTERVAL,3);
707
if(waiting_wares.size())
714
// Evtl. war die Flagge voll und das Auslagern musste gestoppt werden
715
// Weitere Waren/Figuren zum Auslagern und kein Event angemeldet?
716
if(AreWaresToEmpty() && !empty_event)
717
// --> Nächstes Event
718
empty_event = em->AddEvent(this, EMPTY_INTERVAL, 3);
724
void nobBaseWarehouse::AddWare(Ware * ware)
724
void nobBaseWarehouse::AddWare(Ware* ware)
726
// Ware nicht mehr abhängig
727
RemoveDependentWare(ware);
729
// Die Schilde der verschiedenen Nation in eine "Schild-Sorte" (den der Römer) umwandeln!
731
if(ware->type == GD_SHIELDAFRICANS || ware->type == GD_SHIELDJAPANESE || ware->type == GD_SHIELDVIKINGS)
732
type = GD_SHIELDROMANS;
736
gwg->GetPlayer(player)->RemoveWare(ware);
739
++real_goods.goods[type];
742
CheckUsesForNewWare(type);
726
// Ware nicht mehr abhängig
727
RemoveDependentWare(ware);
729
// Die Schilde der verschiedenen Nation in eine "Schild-Sorte" (den der Römer) umwandeln!
731
if(ware->type == GD_SHIELDAFRICANS || ware->type == GD_SHIELDJAPANESE || ware->type == GD_SHIELDVIKINGS)
732
type = GD_SHIELDROMANS;
736
gwg->GetPlayer(player)->RemoveWare(ware);
739
++real_goods.goods[type];
742
CheckUsesForNewWare(type);
745
745
/// Prüft verschiedene Verwendungszwecke für eine neuangekommende Ware
746
746
void nobBaseWarehouse::CheckUsesForNewWare(const GoodType gt)
748
// Wenn es ein Werkzeug war, evtl neuen Job suchen, der jetzt erzeugt werden könnte..
749
if(gt >= GD_TONGS && gt <= GD_BOAT)
751
for(unsigned i = 0;i<30;++i)
753
if(JOB_CONSTS[i].tool == gt)
754
gwg->GetPlayer(player)->FindWarehouseForAllJobs(Job(i));
760
// Wars Baumaterial? Dann den Baustellen Bescheid sagen
761
if(gt == GD_BOARDS || gt == GD_STONES)
762
gwg->GetPlayer(player)->FindMaterialForBuildingSites();
764
// Evtl wurden Bier oder Waffen reingetragen --> versuchen zu rekrutieren
767
// Evtl die Ware gleich wieder auslagern, falls erforderlich
768
CheckOuthousing(0,type);
748
// Wenn es ein Werkzeug war, evtl neuen Job suchen, der jetzt erzeugt werden könnte..
749
if(gt >= GD_TONGS && gt <= GD_BOAT)
751
for(unsigned i = 0; i < 30; ++i)
753
if(JOB_CONSTS[i].tool == gt)
754
gwg->GetPlayer(player)->FindWarehouseForAllJobs(Job(i));
760
// Wars Baumaterial? Dann den Baustellen Bescheid sagen
761
if(gt == GD_BOARDS || gt == GD_STONES)
762
gwg->GetPlayer(player)->FindMaterialForBuildingSites();
764
// Evtl wurden Bier oder Waffen reingetragen --> versuchen zu rekrutieren
767
// Evtl die Ware gleich wieder auslagern, falls erforderlich
768
CheckOuthousing(0, type);
771
771
/// Prüft verschiedene Sachen, falls ein neuer Mensch das Haus betreten hat
772
772
void nobBaseWarehouse::CheckJobsForNewFigure(const Job job)
774
// Evtl ging ein Gehilfe rein --> versuchen zu rekrutieren
775
if(job == JOB_HELPER)
778
if(job >= JOB_PRIVATE && job <= JOB_GENERAL)
781
RefreshReserve(job-JOB_PRIVATE);
782
// Truppen prüfen in allen Häusern
783
gwg->GetPlayer(player)->NewSoldierAvailable(real_goods.people[job]);
787
if(job == JOB_PACKDONKEY)
789
// StraÃe für Esel suchen
791
if(RoadSegment * road = gwg->GetPlayer(player)->FindRoadForDonkey(this,&goal))
793
// gefunden --> Esel an die StraÃe bestellen
794
road->GotDonkey(OrderDonkey(road,goal));
800
// Evtl. Abnehmer für die Figur wieder finden
801
gwg->GetPlayer(player)->FindWarehouseForAllJobs(job);
802
// Wenns ein Träger war, auch Wege prüfen
803
if(job == JOB_HELPER && real_goods.people[JOB_HELPER]==1)
805
// evtl als Träger auf StraÃen schicken
806
gwg->GetPlayer(player)->FindWarehouseForAllRoads();
807
// evtl Träger mit Werkzeug kombiniert -> neuer Beruf
808
gwg->GetPlayer(player)->FindWarehouseForAllJobs(JOB_NOTHING);
814
// Evtl den Typen gleich wieder auslagern, falls erforderlich
815
CheckOuthousing(1,job);
774
// Evtl ging ein Gehilfe rein --> versuchen zu rekrutieren
775
if(job == JOB_HELPER)
778
if(job >= JOB_PRIVATE && job <= JOB_GENERAL)
781
RefreshReserve(job - JOB_PRIVATE);
782
// Truppen prüfen in allen Häusern
783
gwg->GetPlayer(player)->NewSoldierAvailable(real_goods.people[job]);
787
if(job == JOB_PACKDONKEY)
789
// StraÃe für Esel suchen
791
if(RoadSegment* road = gwg->GetPlayer(player)->FindRoadForDonkey(this, &goal))
793
// gefunden --> Esel an die StraÃe bestellen
794
road->GotDonkey(OrderDonkey(road, goal));
800
// Evtl. Abnehmer für die Figur wieder finden
801
gwg->GetPlayer(player)->FindWarehouseForAllJobs(job);
802
// Wenns ein Träger war, auch Wege prüfen
803
if(job == JOB_HELPER && real_goods.people[JOB_HELPER] == 1)
805
// evtl als Träger auf StraÃen schicken
806
gwg->GetPlayer(player)->FindWarehouseForAllRoads();
807
// evtl Träger mit Werkzeug kombiniert -> neuer Beruf
808
gwg->GetPlayer(player)->FindWarehouseForAllJobs(JOB_NOTHING);
814
// Evtl den Typen gleich wieder auslagern, falls erforderlich
815
CheckOuthousing(1, job);
818
void nobBaseWarehouse::AddFigure(noFigure * figure, const bool increase_visual_counts)
818
void nobBaseWarehouse::AddFigure(noFigure* figure, const bool increase_visual_counts)
820
// Warenhausarbeiter werden nicht gezählt!
821
if(!figure->MemberOfWarehouse())
823
// War das ein Boot-Träger?
824
if(figure->GetJobType() == JOB_BOATCARRIER)
826
// Träger hinzufügen einzeln
827
if(increase_visual_counts) ++goods.people[JOB_HELPER];
828
++real_goods.people[JOB_HELPER];
829
// Boot hinzufügen einzeln
830
if(increase_visual_counts) ++goods.goods[GD_BOAT];
831
++real_goods.goods[GD_BOAT];
835
if(increase_visual_counts) ++goods.people[figure->GetJobType()];
836
++real_goods.people[figure->GetJobType()];
840
RemoveDependentFigure(figure);
841
em->AddToKillList(figure);
843
CheckJobsForNewFigure(figure->GetJobType());
820
// Warenhausarbeiter werden nicht gezählt!
821
if(!figure->MemberOfWarehouse())
823
// War das ein Boot-Träger?
824
if(figure->GetJobType() == JOB_BOATCARRIER)
826
// Träger hinzufügen einzeln
827
if(increase_visual_counts) ++goods.people[JOB_HELPER];
828
++real_goods.people[JOB_HELPER];
829
// Boot hinzufügen einzeln
830
if(increase_visual_counts) ++goods.goods[GD_BOAT];
831
++real_goods.goods[GD_BOAT];
835
if(increase_visual_counts) ++goods.people[figure->GetJobType()];
836
++real_goods.people[figure->GetJobType()];
840
RemoveDependentFigure(figure);
841
em->AddToKillList(figure);
843
CheckJobsForNewFigure(figure->GetJobType());
846
846
void nobBaseWarehouse::FetchWare()
848
if(!fetch_double_protection)
850
AddLeavingFigure(new nofWarehouseWorker(x,y,player,0,1));
851
/*gwg->AddFigure(worker,x,y);
852
worker->ActAtFirst();*/
855
fetch_double_protection = false;
858
void nobBaseWarehouse::WareLost(Ware * ware)
860
RemoveDependentWare(ware);
863
void nobBaseWarehouse::CancelWare(Ware * ware)
865
// Ware aus den Waiting-Wares entfernen
866
waiting_wares.erase(ware);
867
// Anzahl davon wieder hochsetzen
868
++real_goods.goods[ConvertShields(ware->type)];
848
if(!fetch_double_protection)
850
AddLeavingFigure(new nofWarehouseWorker(x, y, player, 0, 1));
851
/*gwg->AddFigure(worker,x,y);
852
worker->ActAtFirst();*/
855
fetch_double_protection = false;
858
void nobBaseWarehouse::WareLost(Ware* ware)
860
RemoveDependentWare(ware);
863
void nobBaseWarehouse::CancelWare(Ware* ware)
865
// Ware aus den Waiting-Wares entfernen
866
waiting_wares.erase(ware);
867
// Anzahl davon wieder hochsetzen
868
++real_goods.goods[ConvertShields(ware->type)];
871
871
/// Bestellte Figur, die sich noch inder Warteschlange befindet, kommt nicht mehr und will rausgehauen werden
872
void nobBaseWarehouse::CancelFigure(noFigure * figure)
874
// Figure aus den Waiting-Wares entfernen
875
leave_house.erase(std::find(leave_house.begin(),leave_house.end(),figure));
876
//leave_house.erase(figure);
877
AddFigure(figure,false);
880
void nobBaseWarehouse::TakeWare(Ware * ware)
882
// Ware zur Abhängigkeitsliste hinzufügen, damit sie benachrichtigt wird, wenn dieses Lagerhaus zerstört wird
883
dependent_wares.push_back(ware);
886
void nobBaseWarehouse::OrderTroops(nobMilitary * goal, unsigned count)
888
// Soldaten durchgehen und count rausschicken
890
// Ränge durchgehen, absteigend, starke zuerst
891
if (gwg->GetPlayer(player)->military_settings[1] >= MILITARY_SETTINGS_SCALE[1]/2)
893
for(unsigned i = 5;i && count;--i)
895
// Vertreter der Ränge ggf rausschicken
896
while(real_goods.people[JOB_PRIVATE-1+i] && count)
898
nofSoldier * soldier = new nofPassiveSoldier(x,y,player,goal,goal,i-1);
899
AddLeavingFigure(soldier);
900
goal->GotWorker(JOB_NOTHING,soldier);
902
--real_goods.people[JOB_PRIVATE-1+i];
908
// Ränge durchgehen, aufsteigend, schwache zuerst
911
for(unsigned i = 1;i<=5 && count;++i)
913
// Vertreter der Ränge ggf rausschicken
914
while(real_goods.people[JOB_PRIVATE-1+i] && count)
916
nofSoldier * soldier = new nofPassiveSoldier(x,y,player,goal,goal,i-1);
917
AddLeavingFigure(soldier);
918
goal->GotWorker(JOB_NOTHING,soldier);
920
--real_goods.people[JOB_PRIVATE-1+i];
929
nofAggressiveDefender * nobBaseWarehouse::SendDefender(nofAttacker * attacker)
931
// Sind noch Soldaten da?
933
for(rank = 5;rank;--rank)
935
if(real_goods.people[JOB_PRIVATE+rank-1])
939
// Wenn kein Soldat mehr da ist --> 0 zurückgeben
943
// Dann den Stärksten rausschicken
944
nofAggressiveDefender * soldier = new nofAggressiveDefender(x,y,player,this,rank-1,attacker);
945
--real_goods.people[JOB_PRIVATE+rank-1];
946
AddLeavingFigure(soldier);
948
troops_on_mission.push_back(soldier);
953
void nobBaseWarehouse::SoldierLost(nofSoldier * soldier)
955
// Soldat konnte nicht (mehr) kommen --> rauswerfen
956
troops_on_mission.erase(static_cast<nofActiveSoldier*>(soldier));
959
void nobBaseWarehouse::AddActiveSoldier(nofActiveSoldier * soldier)
962
++real_goods.people[JOB_PRIVATE+soldier->GetRank()];
963
++goods.people[JOB_PRIVATE+soldier->GetRank()];
965
// Evtl. geht der Soldat wieder in die Reserve
966
RefreshReserve(soldier->GetRank());
968
// Truppen prüfen in allen Häusern
969
gwg->GetPlayer(player)->RegulateAllTroops();
971
// und Soldat vernichten
972
em->AddToKillList(soldier);
974
// Ggf. war er auf Mission
975
troops_on_mission.erase(soldier);
978
nofDefender * nobBaseWarehouse::ProvideDefender(nofAttacker * const attacker)
981
unsigned rank_count = 0;
983
for(unsigned i = 0;i<5;++i)
985
if(real_goods.people[JOB_PRIVATE+i] || reserve_soldiers_available[i])
992
// Gewünschten Rang an Hand der Militäreinstellungen ausrechnen, je nachdem wie stark verteidigt werden soll
993
unsigned rank = (rank_count-1)*gwg->GetPlayer(player)->military_settings[1]/MILITARY_SETTINGS_SCALE[1];
995
// Gewünschten Rang suchen
997
for(unsigned i = 0;i<5;++i)
1000
// anderere Soldaten bevorzugen
1001
if(real_goods.people[JOB_PRIVATE+i])
1005
// diesen Soldaten wollen wir
1006
--real_goods.people[JOB_PRIVATE+i];
1007
nofDefender * soldier = new nofDefender(x,y,player,this,i,attacker);
1014
else if(reserve_soldiers_available[i])
1018
// diesen Soldaten wollen wir
1019
--reserve_soldiers_available[i];
1020
// bei der visuellen Warenanzahl wieder hinzufügen, da er dann wiederrum von der abgezogen wird, wenn
1021
// er rausgeht und es so ins minus rutschen würde
1022
++goods.people[JOB_PRIVATE+i];
1023
nofDefender * soldier = new nofDefender(x,y,player,this,i,attacker);
1034
// Kein Soldat gefunden, als letzten Hoffnung die Soldaten nehmen, die ggf in der Warteschlange noch hängen
1035
for(std::list<noFigure*>::iterator it = leave_house.begin();it!=leave_house.end();++it)
1038
if((*it)->GetGOT() == GOT_NOF_AGGRESSIVEDEFENDER)
1040
static_cast<nofAggressiveDefender*>(*it)->NeedForHomeDefence();
1041
// Aus Missionsliste raushauen
1042
troops_on_mission.erase(static_cast<nofAggressiveDefender*>(*it));
1044
nofDefender * soldier = new nofDefender(x,y,player,this,static_cast<nofAggressiveDefender*>(*it)->GetRank(),attacker);
1047
leave_house.erase(it);
1048
//leave_house.erase(&it);
1051
else if((*it)->GetGOT() == GOT_NOF_PASSIVESOLDIER)
1054
nofDefender * soldier = new nofDefender(x,y,player,this,static_cast<nofPassiveSoldier*>(*it)->GetRank(),attacker);
1057
leave_house.erase(it);
1058
//leave_house.erase(&it);
872
void nobBaseWarehouse::CancelFigure(noFigure* figure)
874
// Figure aus den Waiting-Wares entfernen
875
leave_house.erase(std::find(leave_house.begin(), leave_house.end(), figure));
876
//leave_house.erase(figure);
877
AddFigure(figure, false);
880
void nobBaseWarehouse::TakeWare(Ware* ware)
882
// Ware zur Abhängigkeitsliste hinzufügen, damit sie benachrichtigt wird, wenn dieses Lagerhaus zerstört wird
883
dependent_wares.push_back(ware);
886
void nobBaseWarehouse::OrderTroops(nobMilitary* goal, unsigned count)
888
// Soldaten durchgehen und count rausschicken
890
// Ränge durchgehen, absteigend, starke zuerst
891
if (gwg->GetPlayer(player)->military_settings[1] >= MILITARY_SETTINGS_SCALE[1] / 2)
893
for(unsigned i = 5; i && count; --i)
895
// Vertreter der Ränge ggf rausschicken
896
while(real_goods.people[JOB_PRIVATE - 1 + i] && count)
898
nofSoldier* soldier = new nofPassiveSoldier(x, y, player, goal, goal, i - 1);
899
AddLeavingFigure(soldier);
900
goal->GotWorker(JOB_NOTHING, soldier);
902
--real_goods.people[JOB_PRIVATE - 1 + i];
908
// Ränge durchgehen, aufsteigend, schwache zuerst
911
for(unsigned i = 1; i <= 5 && count; ++i)
913
// Vertreter der Ränge ggf rausschicken
914
while(real_goods.people[JOB_PRIVATE - 1 + i] && count)
916
nofSoldier* soldier = new nofPassiveSoldier(x, y, player, goal, goal, i - 1);
917
AddLeavingFigure(soldier);
918
goal->GotWorker(JOB_NOTHING, soldier);
920
--real_goods.people[JOB_PRIVATE - 1 + i];
929
nofAggressiveDefender* nobBaseWarehouse::SendDefender(nofAttacker* attacker)
931
// Sind noch Soldaten da?
933
for(rank = 5; rank; --rank)
935
if(real_goods.people[JOB_PRIVATE + rank - 1])
939
// Wenn kein Soldat mehr da ist --> 0 zurückgeben
943
// Dann den Stärksten rausschicken
944
nofAggressiveDefender* soldier = new nofAggressiveDefender(x, y, player, this, rank - 1, attacker);
945
--real_goods.people[JOB_PRIVATE + rank - 1];
946
AddLeavingFigure(soldier);
948
troops_on_mission.push_back(soldier);
953
void nobBaseWarehouse::SoldierLost(nofSoldier* soldier)
955
// Soldat konnte nicht (mehr) kommen --> rauswerfen
956
troops_on_mission.erase(static_cast<nofActiveSoldier*>(soldier));
959
void nobBaseWarehouse::AddActiveSoldier(nofActiveSoldier* soldier)
962
++real_goods.people[JOB_PRIVATE + soldier->GetRank()];
963
++goods.people[JOB_PRIVATE + soldier->GetRank()];
965
// Evtl. geht der Soldat wieder in die Reserve
966
RefreshReserve(soldier->GetRank());
968
// Truppen prüfen in allen Häusern
969
gwg->GetPlayer(player)->RegulateAllTroops();
971
// und Soldat vernichten
972
em->AddToKillList(soldier);
974
// Ggf. war er auf Mission
975
troops_on_mission.erase(soldier);
978
nofDefender* nobBaseWarehouse::ProvideDefender(nofAttacker* const attacker)
981
unsigned rank_count = 0;
983
for(unsigned i = 0; i < 5; ++i)
985
if(real_goods.people[JOB_PRIVATE + i] || reserve_soldiers_available[i])
992
// Gewünschten Rang an Hand der Militäreinstellungen ausrechnen, je nachdem wie stark verteidigt werden soll
993
unsigned rank = (rank_count - 1) * gwg->GetPlayer(player)->military_settings[1] / MILITARY_SETTINGS_SCALE[1];
995
// Gewünschten Rang suchen
997
for(unsigned i = 0; i < 5; ++i)
1000
// anderere Soldaten bevorzugen
1001
if(real_goods.people[JOB_PRIVATE + i])
1005
// diesen Soldaten wollen wir
1006
--real_goods.people[JOB_PRIVATE + i];
1007
nofDefender* soldier = new nofDefender(x, y, player, this, i, attacker);
1014
else if(reserve_soldiers_available[i])
1018
// diesen Soldaten wollen wir
1019
--reserve_soldiers_available[i];
1020
// bei der visuellen Warenanzahl wieder hinzufügen, da er dann wiederrum von der abgezogen wird, wenn
1021
// er rausgeht und es so ins minus rutschen würde
1022
++goods.people[JOB_PRIVATE + i];
1023
nofDefender* soldier = new nofDefender(x, y, player, this, i, attacker);
1034
// Kein Soldat gefunden, als letzten Hoffnung die Soldaten nehmen, die ggf in der Warteschlange noch hängen
1035
for(std::list<noFigure*>::iterator it = leave_house.begin(); it != leave_house.end(); ++it)
1038
if((*it)->GetGOT() == GOT_NOF_AGGRESSIVEDEFENDER)
1040
static_cast<nofAggressiveDefender*>(*it)->NeedForHomeDefence();
1041
// Aus Missionsliste raushauen
1042
troops_on_mission.erase(static_cast<nofAggressiveDefender*>(*it));
1044
nofDefender* soldier = new nofDefender(x, y, player, this, static_cast<nofAggressiveDefender*>(*it)->GetRank(), attacker);
1047
leave_house.erase(it);
1048
//leave_house.erase(&it);
1051
else if((*it)->GetGOT() == GOT_NOF_PASSIVESOLDIER)
1054
nofDefender* soldier = new nofDefender(x, y, player, this, static_cast<nofPassiveSoldier*>(*it)->GetRank(), attacker);
1057
leave_house.erase(it);
1058
//leave_house.erase(&it);
1068
1068
bool nobBaseWarehouse::AreRecruitingConditionsComply()
1070
// Mindestanzahl der Gehilfen die vorhanden sein müssen anhand der 1. Militäreinstellung ausrechnen
1071
unsigned needed_helpers = 100-10*gwg->GetPlayer(player)->military_settings[0];
1073
// einer muss natürlich mindestens vorhanden sein!
1074
if(!needed_helpers) needed_helpers = 1;
1076
// Wenn alle Bedingungen erfüllt sind, Event anmelden
1077
return (real_goods.people[JOB_HELPER] >= needed_helpers && real_goods.goods[GD_SWORD]
1078
&& real_goods.goods[GD_SHIELDROMANS] && real_goods.goods[GD_BEER]);
1070
// Mindestanzahl der Gehilfen die vorhanden sein müssen anhand der 1. Militäreinstellung ausrechnen
1071
unsigned needed_helpers = 100 - 10 * gwg->GetPlayer(player)->military_settings[0];
1073
// einer muss natürlich mindestens vorhanden sein!
1074
if(!needed_helpers) needed_helpers = 1;
1076
// Wenn alle Bedingungen erfüllt sind, Event anmelden
1077
return (real_goods.people[JOB_HELPER] >= needed_helpers && real_goods.goods[GD_SWORD]
1078
&& real_goods.goods[GD_SHIELDROMANS] && real_goods.goods[GD_BEER]);
1082
1082
void nobBaseWarehouse::TryRecruiting()
1084
// Wenn noch kein Event angemeldet wurde und alle Bedingungen erfüllt sind, kann ein neues angemeldet werden
1085
if(!recruiting_event)
1087
if(AreRecruitingConditionsComply())
1088
recruiting_event = em->AddEvent(this,RECRUITE_GF+RANDOM.Rand(__FILE__,__LINE__,obj_id,RECRUITE_RANDOM_GF),2);
1084
// Wenn noch kein Event angemeldet wurde und alle Bedingungen erfüllt sind, kann ein neues angemeldet werden
1085
if(!recruiting_event)
1087
if(AreRecruitingConditionsComply())
1088
recruiting_event = em->AddEvent(this, RECRUITE_GF + RANDOM.Rand(__FILE__, __LINE__, obj_id, RECRUITE_RANDOM_GF), 2);
1092
1092
void nobBaseWarehouse::TryStopRecruiting()
1094
// Wenn ein Event angemeldet wurde und die Bedingungen nicht mehr erfüllt sind, muss es wieder vernichtet werden
1095
if(recruiting_event)
1097
if(!AreRecruitingConditionsComply())
1099
em->RemoveEvent(recruiting_event);
1100
recruiting_event = 0;
1106
bool FW::Condition_Ware(nobBaseWarehouse * wh, const void * param)
1108
return (wh->GetRealWaresCount(static_cast<const Param_Ware*>(param)->type) >= static_cast<const Param_Ware*>(param)->count);
1111
bool FW::Condition_Job(nobBaseWarehouse * wh, const void * param)
1113
if(wh->GetRealFiguresCount(static_cast<const Param_Job*>(param)->type) >= static_cast<const Param_Job*>(param)->count)
1117
// die entsprechende Figur ist nicht vorhanden, wenn das Werkzeug der Figur und ein Mann (Träger) zum Rekrutieren
1118
// da ist, geht das auch, nur bei Eseln nicht !!
1119
bool tool_available = (JOB_CONSTS[static_cast<const Param_Job*>(param)->type].tool != GD_NOTHING) ?
1120
(wh->GetRealWaresCount(JOB_CONSTS[static_cast<const Param_Job*>(param)->type].tool)>0) : true;
1122
if(static_cast<const Param_Job*>(param)->type == JOB_PACKDONKEY)
1123
tool_available = false;
1125
if( wh->GetRealFiguresCount(JOB_HELPER) && tool_available)
1134
bool FW::Condition_WareAndJob(nobBaseWarehouse * wh, const void * param)
1136
return (Condition_Ware(wh,&static_cast<const Param_WareAndJob*>(param)->ware) &&
1137
Condition_Job(wh,&static_cast<const Param_WareAndJob*>(param)->job));
1140
bool FW::Condition_Troops(nobBaseWarehouse * wh, const void * param)
1142
return (wh->GetSoldiersCount() >= *static_cast<const unsigned*>(param));
1145
bool FW::NoCondition(nobBaseWarehouse * wh, const void * param)
1150
bool FW::Condition_StoreWare(nobBaseWarehouse * wh, const void * param)
1152
// Einlagern darf nicht verboten sein
1153
// Schilder beachten!
1154
if(*static_cast<const GoodType*>(param) == GD_SHIELDVIKINGS || *static_cast<const GoodType*>(param) == GD_SHIELDAFRICANS ||
1155
*static_cast<const GoodType*>(param) == GD_SHIELDJAPANESE)
1156
return (!wh->CheckRealInventorySettings(0,2,GD_SHIELDROMANS));
1158
return (!wh->CheckRealInventorySettings(0,2,*static_cast<const GoodType*>(param)));
1162
bool FW::Condition_StoreFigure(nobBaseWarehouse * wh, const void * param)
1164
// Einlagern darf nicht verboten sein, Bootstypen zu normalen Trägern machen
1165
if(*static_cast<const Job*>(param) == JOB_BOATCARRIER)
1166
return (!wh->CheckRealInventorySettings(1,2,JOB_HELPER));
1168
return (!wh->CheckRealInventorySettings(1,2,*static_cast<const Job*>(param)));
1171
bool FW::Condition_WantStoreFigure(nobBaseWarehouse * wh, const void * param)
1173
// Einlagern muss gewollt sein
1174
Job job = (*static_cast<const Job*>(param) == JOB_BOATCARRIER) ? JOB_HELPER : *static_cast<const Job*>(param);
1175
return (wh->CheckRealInventorySettings(1,8,job));
1178
bool FW::Condition_WantStoreWare(nobBaseWarehouse * wh, const void * param)
1180
// Einlagern muss gewollt sein
1181
// Schilder beachten!
1182
GoodType gt = ConvertShields(*static_cast<const GoodType*>(param));
1183
return (wh->CheckRealInventorySettings(0,8,gt));
1094
// Wenn ein Event angemeldet wurde und die Bedingungen nicht mehr erfüllt sind, muss es wieder vernichtet werden
1095
if(recruiting_event)
1097
if(!AreRecruitingConditionsComply())
1099
em->RemoveEvent(recruiting_event);
1100
recruiting_event = 0;
1106
bool FW::Condition_Ware(nobBaseWarehouse* wh, const void* param)
1108
return (wh->GetRealWaresCount(static_cast<const Param_Ware*>(param)->type) >= static_cast<const Param_Ware*>(param)->count);
1111
bool FW::Condition_Job(nobBaseWarehouse* wh, const void* param)
1113
if(wh->GetRealFiguresCount(static_cast<const Param_Job*>(param)->type) >= static_cast<const Param_Job*>(param)->count)
1117
// die entsprechende Figur ist nicht vorhanden, wenn das Werkzeug der Figur und ein Mann (Träger) zum Rekrutieren
1118
// da ist, geht das auch, nur bei Eseln nicht !!
1119
bool tool_available = (JOB_CONSTS[static_cast<const Param_Job*>(param)->type].tool != GD_NOTHING) ?
1120
(wh->GetRealWaresCount(JOB_CONSTS[static_cast<const Param_Job*>(param)->type].tool) > 0) : true;
1122
if(static_cast<const Param_Job*>(param)->type == JOB_PACKDONKEY)
1123
tool_available = false;
1125
if( wh->GetRealFiguresCount(JOB_HELPER) && tool_available)
1134
bool FW::Condition_WareAndJob(nobBaseWarehouse* wh, const void* param)
1136
return (Condition_Ware(wh, &static_cast<const Param_WareAndJob*>(param)->ware) &&
1137
Condition_Job(wh, &static_cast<const Param_WareAndJob*>(param)->job));
1140
bool FW::Condition_Troops(nobBaseWarehouse* wh, const void* param)
1142
return (wh->GetSoldiersCount() >= *static_cast<const unsigned*>(param));
1145
bool FW::NoCondition(nobBaseWarehouse* wh, const void* param)
1150
bool FW::Condition_StoreWare(nobBaseWarehouse* wh, const void* param)
1152
// Einlagern darf nicht verboten sein
1153
// Schilder beachten!
1154
if(*static_cast<const GoodType*>(param) == GD_SHIELDVIKINGS || *static_cast<const GoodType*>(param) == GD_SHIELDAFRICANS ||
1155
*static_cast<const GoodType*>(param) == GD_SHIELDJAPANESE)
1156
return (!wh->CheckRealInventorySettings(0, 2, GD_SHIELDROMANS));
1158
return (!wh->CheckRealInventorySettings(0, 2, *static_cast<const GoodType*>(param)));
1162
bool FW::Condition_StoreFigure(nobBaseWarehouse* wh, const void* param)
1164
// Einlagern darf nicht verboten sein, Bootstypen zu normalen Trägern machen
1165
if(*static_cast<const Job*>(param) == JOB_BOATCARRIER)
1166
return (!wh->CheckRealInventorySettings(1, 2, JOB_HELPER));
1168
return (!wh->CheckRealInventorySettings(1, 2, *static_cast<const Job*>(param)));
1171
bool FW::Condition_WantStoreFigure(nobBaseWarehouse* wh, const void* param)
1173
// Einlagern muss gewollt sein
1174
Job job = (*static_cast<const Job*>(param) == JOB_BOATCARRIER) ? JOB_HELPER : *static_cast<const Job*>(param);
1175
return (wh->CheckRealInventorySettings(1, 8, job));
1178
bool FW::Condition_WantStoreWare(nobBaseWarehouse* wh, const void* param)
1180
// Einlagern muss gewollt sein
1181
// Schilder beachten!
1182
GoodType gt = ConvertShields(*static_cast<const GoodType*>(param));
1183
return (wh->CheckRealInventorySettings(0, 8, gt));
1186
1186
// Lagerhäuser enthalten die jeweilien Waren, liefern sie aber NICHT gleichzeitig ein
1187
bool FW::Condition_StoreAndDontWantWare(nobBaseWarehouse * wh, const void * param)
1187
bool FW::Condition_StoreAndDontWantWare(nobBaseWarehouse* wh, const void* param)
1189
Param_Ware pw = { *static_cast<const GoodType*>(param), 1 };
1190
return (Condition_Ware(wh,&pw) && !Condition_WantStoreWare(wh,param));
1189
Param_Ware pw = { *static_cast<const GoodType*>(param), 1 };
1190
return (Condition_Ware(wh, &pw) && !Condition_WantStoreWare(wh, param));
1191
1191
}// param = &GoodType -> Warentyp
1193
1193
// Warehouse does not collect the job and has job in store
1194
bool FW::Condition_StoreAndDontWantFigure(nobBaseWarehouse * wh, const void * param)
1194
bool FW::Condition_StoreAndDontWantFigure(nobBaseWarehouse* wh, const void* param)
1196
Job job = *static_cast<const Job*>(param);
1197
return ((wh->GetRealFiguresCount(job) >= 1) && !Condition_WantStoreFigure(wh,param));
1196
Job job = *static_cast<const Job*>(param);
1197
return ((wh->GetRealFiguresCount(job) >= 1) && !Condition_WantStoreFigure(wh, param));
1199
1199
// param = &Job -> Jobtyp
1203
const Goods *nobBaseWarehouse::GetInventory() const
1203
const Goods* nobBaseWarehouse::GetInventory() const
1208
1208
/// Fügt einige Güter hinzu
1209
1209
void nobBaseWarehouse::AddGoods(const Goods goods)
1211
for(unsigned int i = 0; i < WARE_TYPES_COUNT; ++i)
1213
this->goods.goods[i] += goods.goods[i];
1214
this->real_goods.goods[i] += goods.goods[i];
1217
CheckUsesForNewWare(GoodType(i));
1220
for(unsigned int i = 0; i < JOB_TYPES_COUNT; ++i)
1222
this->goods.people[i] += goods.people[i];
1223
this->real_goods.people[i] += goods.people[i];
1226
CheckJobsForNewFigure(Job(i));
1211
for(unsigned int i = 0; i < WARE_TYPES_COUNT; ++i)
1213
this->goods.goods[i] += goods.goods[i];
1214
this->real_goods.goods[i] += goods.goods[i];
1217
CheckUsesForNewWare(GoodType(i));
1220
for(unsigned int i = 0; i < JOB_TYPES_COUNT; ++i)
1222
this->goods.people[i] += goods.people[i];
1223
this->real_goods.people[i] += goods.people[i];
1226
CheckJobsForNewFigure(Job(i));
1230
1230
void nobBaseWarehouse::AddToInventory()
1232
for(unsigned int i = 0; i < WARE_TYPES_COUNT; ++i)
1233
gwg->GetPlayer(player)->IncreaseInventoryWare(GoodType(i),real_goods.goods[i]);
1232
for(unsigned int i = 0; i < WARE_TYPES_COUNT; ++i)
1233
gwg->GetPlayer(player)->IncreaseInventoryWare(GoodType(i), real_goods.goods[i]);
1235
for(unsigned int i = 0; i < JOB_TYPES_COUNT; ++i)
1236
gwg->GetPlayer(player)->IncreaseInventoryJob(Job(i),real_goods.people[i]);
1235
for(unsigned int i = 0; i < JOB_TYPES_COUNT; ++i)
1236
gwg->GetPlayer(player)->IncreaseInventoryJob(Job(i), real_goods.people[i]);
1240
1240
/// Verändert Ein/Auslagerungseinstellungen (visuell)
1241
void nobBaseWarehouse::ChangeVisualInventorySettings(unsigned char category,unsigned char state,unsigned char type)
1241
void nobBaseWarehouse::ChangeVisualInventorySettings(unsigned char category, unsigned char state, unsigned char type)
1243
((category == 0)?inventory_settings_visual.wares[type]:inventory_settings_visual.figures[type]) ^= state;
1243
((category == 0) ? inventory_settings_visual.wares[type] : inventory_settings_visual.figures[type]) ^= state;
1245
// Einlagern -> Einlagern verbieten / Auslagern auf false setzen, weil es keinen Sinn macht
1247
((category == 0)?inventory_settings_visual.wares[type]:inventory_settings_visual.figures[type]) &= 8;
1249
// Und jeweils umgekehrt
1250
((category == 0)?inventory_settings_visual.wares[type]:inventory_settings_visual.figures[type]) &= ( 2 | 4 );
1245
// Einlagern -> Einlagern verbieten / Auslagern auf false setzen, weil es keinen Sinn macht
1247
((category == 0) ? inventory_settings_visual.wares[type] : inventory_settings_visual.figures[type]) &= 8;
1249
// Und jeweils umgekehrt
1250
((category == 0) ? inventory_settings_visual.wares[type] : inventory_settings_visual.figures[type]) &= ( 2 | 4 );
1254
1254
/// Gibt Ein/Auslagerungseinstellungen zurück (visuell)
1255
bool nobBaseWarehouse::CheckVisualInventorySettings(unsigned char category,unsigned char state,unsigned char type) const
1257
return ((((category == 0)?inventory_settings_visual.wares[type]:inventory_settings_visual.figures[type]) & state) == state);
1255
bool nobBaseWarehouse::CheckVisualInventorySettings(unsigned char category, unsigned char state, unsigned char type) const
1257
return ((((category == 0) ? inventory_settings_visual.wares[type] : inventory_settings_visual.figures[type]) & state) == state);
1261
1261
//void nobBaseWarehouse::ChangeRealInventorySetting(const unsigned char * const wares,const unsigned char * const figures)
1263
// memcpy(inventory_settings_real.wares,wares,36);
1264
// memcpy(inventory_settings_real.figures,figures,31);
1266
// // Evtl gabs verlorene Waren, die jetzt in das HQ wieder reinkönnen
1267
// gwg->GetPlayer(player)->FindClientForLostWares();
1269
// // Sind Waren vorhanden, die ausgelagert werden müssen und ist noch kein Auslagerungsevent vorhanden --> neues anmelden
1270
// if(AreWaresToEmpty() && !empty_event.valid())
1271
// empty_event = em->AddEvent(this,EMPTY_INTERVAL,3);
1263
// memcpy(inventory_settings_real.wares,wares,36);
1264
// memcpy(inventory_settings_real.figures,figures,31);
1266
// // Evtl gabs verlorene Waren, die jetzt in das HQ wieder reinkönnen
1267
// gwg->GetPlayer(player)->FindClientForLostWares();
1269
// // Sind Waren vorhanden, die ausgelagert werden müssen und ist noch kein Auslagerungsevent vorhanden --> neues anmelden
1270
// if(AreWaresToEmpty() && !empty_event.valid())
1271
// empty_event = em->AddEvent(this,EMPTY_INTERVAL,3);
1275
1275
/// Verändert Ein/Auslagerungseinstellungen (real)
1276
void nobBaseWarehouse::ChangeRealInventorySetting(unsigned char category,unsigned char state,unsigned char type)
1276
void nobBaseWarehouse::ChangeRealInventorySetting(unsigned char category, unsigned char state, unsigned char type)
1278
/// Einstellung ändern
1279
((category == 0)?inventory_settings_real.wares[type]:inventory_settings_real.figures[type]) ^= state;
1281
// Einlagern -> Einlagern verbieten / Auslagern auf false setzen, weil es keinen Sinn macht
1283
((category == 0)?inventory_settings_real.wares[type]:inventory_settings_real.figures[type]) &= 8;
1285
// Und jeweils umgekehrt
1286
((category == 0)?inventory_settings_real.wares[type]:inventory_settings_real.figures[type]) &= ( 2 | 4 );
1289
/// Bei anderen Spielern als dem lokalen, der das in Auftrag gegeben hat, müssen die visuellen ebenfalls
1290
/// geändert werden oder auch bei Replays
1291
if(GameClient::inst().IsReplayModeOn() || GameClient::inst().GetPlayerID() != player)
1292
ChangeVisualInventorySettings(category,state,type);
1294
// Evtl gabs verlorene Waren, die jetzt in das HQ wieder reinkönnen
1296
gwg->GetPlayer(player)->FindClientForLostWares();
1298
// Sind Waren vorhanden, die ausgelagert werden müssen und ist noch kein Auslagerungsevent vorhanden --> neues anmelden
1299
if(state == 4 && ((category == 0)?real_goods.goods[type]:real_goods.people[type]) && !empty_event)
1300
empty_event = em->AddEvent(this,EMPTY_INTERVAL,3);
1302
// Sollen Waren eingelagert werden? Dann müssen wir neue bestellen
1303
if(state == 8 && !store_event && ((category == 0)?inventory_settings_real.wares[type]:inventory_settings_real.figures[type]) & 8)
1304
store_event = em->AddEvent(this,STORE_INTERVAL,4);
1278
/// Einstellung ändern
1279
((category == 0) ? inventory_settings_real.wares[type] : inventory_settings_real.figures[type]) ^= state;
1281
// Einlagern -> Einlagern verbieten / Auslagern auf false setzen, weil es keinen Sinn macht
1283
((category == 0) ? inventory_settings_real.wares[type] : inventory_settings_real.figures[type]) &= 8;
1285
// Und jeweils umgekehrt
1286
((category == 0) ? inventory_settings_real.wares[type] : inventory_settings_real.figures[type]) &= ( 2 | 4 );
1289
/// Bei anderen Spielern als dem lokalen, der das in Auftrag gegeben hat, müssen die visuellen ebenfalls
1290
/// geändert werden oder auch bei Replays
1291
if(GameClient::inst().IsReplayModeOn() || GameClient::inst().GetPlayerID() != player)
1292
ChangeVisualInventorySettings(category, state, type);
1294
// Evtl gabs verlorene Waren, die jetzt in das HQ wieder reinkönnen
1296
gwg->GetPlayer(player)->FindClientForLostWares();
1298
// Sind Waren vorhanden, die ausgelagert werden müssen und ist noch kein Auslagerungsevent vorhanden --> neues anmelden
1299
if(state == 4 && ((category == 0) ? real_goods.goods[type] : real_goods.people[type]) && !empty_event)
1300
empty_event = em->AddEvent(this, EMPTY_INTERVAL, 3);
1302
// Sollen Waren eingelagert werden? Dann müssen wir neue bestellen
1303
if(state == 8 && !store_event && ((category == 0) ? inventory_settings_real.wares[type] : inventory_settings_real.figures[type]) & 8)
1304
store_event = em->AddEvent(this, STORE_INTERVAL, 4);
1307
1307
/// Verändert alle Ein/Auslagerungseinstellungen einer Kategorie (also Waren oder Figuren)(real)
1308
void nobBaseWarehouse::ChangeAllRealInventorySettings(unsigned char category,unsigned char state)
1308
void nobBaseWarehouse::ChangeAllRealInventorySettings(unsigned char category, unsigned char state)
1310
// Merken, ob Waren/Figuren eingelagert werden sollen
1316
for(unsigned i = 0;i<WARE_TYPES_COUNT;++i)
1318
inventory_settings_real.wares[i] ^= state;
1319
if(state == 8 && inventory_settings_real.wares[i] & state)
1326
for(unsigned i = 0;i<JOB_TYPES_COUNT;++i)
1328
inventory_settings_real.figures[i] ^= state;
1329
if(state == 8 && inventory_settings_real.figures[i] & state)
1334
// Evtl gabs verlorene Waren, die jetzt in das HQ wieder reinkönnen
1336
gwg->GetPlayer(player)->FindClientForLostWares();
1338
// Sind Waren vorhanden, die ausgelagert werden müssen und ist noch kein Auslagerungsevent vorhanden --> neues anmelden
1339
if(state == 4 && AreWaresToEmpty() && !empty_event)
1340
empty_event = em->AddEvent(this,EMPTY_INTERVAL,3);
1342
// Sollen Waren eingelagert werden? Dann müssen wir neue bestellen
1343
if(store && !store_event)
1344
store_event = em->AddEvent(this,STORE_INTERVAL,4);
1310
// Merken, ob Waren/Figuren eingelagert werden sollen
1316
for(unsigned i = 0; i < WARE_TYPES_COUNT; ++i)
1318
inventory_settings_real.wares[i] ^= state;
1319
if(state == 8 && inventory_settings_real.wares[i] & state)
1326
for(unsigned i = 0; i < JOB_TYPES_COUNT; ++i)
1328
inventory_settings_real.figures[i] ^= state;
1329
if(state == 8 && inventory_settings_real.figures[i] & state)
1334
// Evtl gabs verlorene Waren, die jetzt in das HQ wieder reinkönnen
1336
gwg->GetPlayer(player)->FindClientForLostWares();
1338
// Sind Waren vorhanden, die ausgelagert werden müssen und ist noch kein Auslagerungsevent vorhanden --> neues anmelden
1339
if(state == 4 && AreWaresToEmpty() && !empty_event)
1340
empty_event = em->AddEvent(this, EMPTY_INTERVAL, 3);
1342
// Sollen Waren eingelagert werden? Dann müssen wir neue bestellen
1343
if(store && !store_event)
1344
store_event = em->AddEvent(this, STORE_INTERVAL, 4);
1349
1349
bool nobBaseWarehouse::AreWaresToEmpty() const
1351
// Prüfen, ob Warentyp ausgelagert werden soll und ob noch Waren davon vorhanden sind
1353
for(unsigned i = 0;i<WARE_TYPES_COUNT;++i)
1355
if(CheckRealInventorySettings(0,4,i) && real_goods.goods[i])
1359
// Figuren überprüfen
1360
for(unsigned i = 0;i<JOB_TYPES_COUNT;++i)
1362
if(CheckRealInventorySettings(1,4,i) && real_goods.people[i])
1351
// Prüfen, ob Warentyp ausgelagert werden soll und ob noch Waren davon vorhanden sind
1353
for(unsigned i = 0; i < WARE_TYPES_COUNT; ++i)
1355
if(CheckRealInventorySettings(0, 4, i) && real_goods.goods[i])
1359
// Figuren überprüfen
1360
for(unsigned i = 0; i < JOB_TYPES_COUNT; ++i)
1362
if(CheckRealInventorySettings(1, 4, i) && real_goods.people[i])
1369
1369
bool nobBaseWarehouse::DefendersAvailable() const
1371
// Warenbestand und Reserve prüfen
1372
for(unsigned i = 0;i<5;++i)
1375
if(reserve_soldiers_available[i])
1378
if(real_goods.people[JOB_PRIVATE+i])
1371
// Warenbestand und Reserve prüfen
1372
for(unsigned i = 0; i < 5; ++i)
1375
if(reserve_soldiers_available[i])
1378
if(real_goods.people[JOB_PRIVATE + i])
1385
1385
unsigned nobBaseWarehouse::IncreaseReserveVisual(unsigned rank)
1387
return ++reserve_soldiers_claimed_visual[rank];
1387
return ++reserve_soldiers_claimed_visual[rank];
1390
1390
unsigned nobBaseWarehouse::DecreaseReserveVisual(unsigned rank)
1392
if(reserve_soldiers_claimed_visual[rank])
1393
--reserve_soldiers_claimed_visual[rank];
1392
if(reserve_soldiers_claimed_visual[rank])
1393
--reserve_soldiers_claimed_visual[rank];
1395
return reserve_soldiers_claimed_visual[rank];
1395
return reserve_soldiers_claimed_visual[rank];
1398
1398
void nobBaseWarehouse::SetRealReserve(const unsigned rank, const unsigned count)
1400
reserve_soldiers_claimed_real[rank] = count;
1402
// Replay oder anderer Spieler? Dann die visuellen auch erhöhen
1403
if(GameClient::inst().IsReplayModeOn() || GameClient::inst().GetPlayerID() != player)
1404
reserve_soldiers_claimed_visual[rank] = count;
1406
// Geforderte Soldaten ggf. einbeziehen
1407
RefreshReserve(rank);
1400
reserve_soldiers_claimed_real[rank] = count;
1402
// Replay oder anderer Spieler? Dann die visuellen auch erhöhen
1403
if(GameClient::inst().IsReplayModeOn() || GameClient::inst().GetPlayerID() != player)
1404
reserve_soldiers_claimed_visual[rank] = count;
1406
// Geforderte Soldaten ggf. einbeziehen
1407
RefreshReserve(rank);
1410
1410
void nobBaseWarehouse::RefreshReserve(unsigned rank)
1412
// Zuviele oder zuwenig Soldaten einkassiert?
1413
if(reserve_soldiers_available[rank] < reserve_soldiers_claimed_real[rank])
1415
// Zuwenig --> gucken,ob wir noch mehr einkassieren können
1416
if(real_goods.people[JOB_PRIVATE+rank])
1418
// ja, dann nehmen wir mal noch soviele wie nötig und möglich
1419
unsigned add = min(real_goods.people[JOB_PRIVATE+rank], // möglich
1420
reserve_soldiers_claimed_real[rank]-reserve_soldiers_available[rank]); // nötig
1422
// Bei der Reserve hinzufügen
1423
reserve_soldiers_available[rank] += add;
1424
// vom Warenbestand abziehen
1425
goods.people[JOB_PRIVATE+rank] -= add;
1426
real_goods.people[JOB_PRIVATE+rank] -= add;
1429
else if(reserve_soldiers_available[rank] > reserve_soldiers_claimed_real[rank])
1431
// Zuviele, dann wieder welche freigeben
1432
unsigned subtract = reserve_soldiers_available[rank] - reserve_soldiers_claimed_real[rank];
1434
// Bei der Reserve abziehen
1435
reserve_soldiers_available[rank] -= subtract;
1436
// beim Warenbestand hinzufügen
1437
goods.people[JOB_PRIVATE+rank] += subtract;
1438
real_goods.people[JOB_PRIVATE+rank] += subtract;
1440
// Ggf. Truppen in die Militärgebäude schicken
1441
gwg->GetPlayer(player)->RegulateAllTroops();
1443
// ansonsten ists gleich und alles ist in Ordnung!
1412
// Zuviele oder zuwenig Soldaten einkassiert?
1413
if(reserve_soldiers_available[rank] < reserve_soldiers_claimed_real[rank])
1415
// Zuwenig --> gucken,ob wir noch mehr einkassieren können
1416
if(real_goods.people[JOB_PRIVATE + rank])
1418
// ja, dann nehmen wir mal noch soviele wie nötig und möglich
1419
unsigned add = min(real_goods.people[JOB_PRIVATE + rank], // möglich
1420
reserve_soldiers_claimed_real[rank] - reserve_soldiers_available[rank]); // nötig
1422
// Bei der Reserve hinzufügen
1423
reserve_soldiers_available[rank] += add;
1424
// vom Warenbestand abziehen
1425
goods.people[JOB_PRIVATE + rank] -= add;
1426
real_goods.people[JOB_PRIVATE + rank] -= add;
1429
else if(reserve_soldiers_available[rank] > reserve_soldiers_claimed_real[rank])
1431
// Zuviele, dann wieder welche freigeben
1432
unsigned subtract = reserve_soldiers_available[rank] - reserve_soldiers_claimed_real[rank];
1434
// Bei der Reserve abziehen
1435
reserve_soldiers_available[rank] -= subtract;
1436
// beim Warenbestand hinzufügen
1437
goods.people[JOB_PRIVATE + rank] += subtract;
1438
real_goods.people[JOB_PRIVATE + rank] += subtract;
1440
// Ggf. Truppen in die Militärgebäude schicken
1441
gwg->GetPlayer(player)->RegulateAllTroops();
1443
// ansonsten ists gleich und alles ist in Ordnung!
1446
1446
void nobBaseWarehouse::CheckOuthousing(unsigned char category, unsigned job_ware_id)
1448
// Bootsträger in Träger umwandeln, der evtl dann raus soll
1449
if(category == 1 && job_ware_id == JOB_BOATCARRIER)
1450
job_ware_id = JOB_HELPER;
1448
// Bootsträger in Träger umwandeln, der evtl dann raus soll
1449
if(category == 1 && job_ware_id == JOB_BOATCARRIER)
1450
job_ware_id = JOB_HELPER;
1452
if(CheckRealInventorySettings(category,4,job_ware_id) && !empty_event)
1453
empty_event = em->AddEvent(this,EMPTY_INTERVAL,3);
1452
if(CheckRealInventorySettings(category, 4, job_ware_id) && !empty_event)
1453
empty_event = em->AddEvent(this, EMPTY_INTERVAL, 3);
1456
1456
/// For debug only
1457
bool nobBaseWarehouse::CheckDependentFigure(noFigure * fig)
1457
bool nobBaseWarehouse::CheckDependentFigure(noFigure* fig)
1459
for(std::list<noFigure*>::iterator it = dependent_figures.begin();it != dependent_figures.end();++it)
1459
for(std::list<noFigure*>::iterator it = dependent_figures.begin(); it != dependent_figures.end(); ++it)
1468
1468
/// Available goods of a speciefic type that can be used for trading
1469
1469
unsigned nobBaseWarehouse::GetAvailableWaresForTrading(const GoodType gt) const
1471
// We need a helper as leader
1472
if(!real_goods.people[JOB_HELPER]) return 0;
1471
// We need a helper as leader
1472
if(!real_goods.people[JOB_HELPER]) return 0;
1474
return min(real_goods.goods[gt],real_goods.people[JOB_PACKDONKEY]);
1474
return min(real_goods.goods[gt], real_goods.people[JOB_PACKDONKEY]);
1477
/// Available figures of a speciefic type that can be used for trading
1477
/// Available figures of a speciefic type that can be used for trading
1478
1478
unsigned nobBaseWarehouse::GetAvailableFiguresForTrading(const Job job) const
1480
// We need a helper as leader
1481
if(!real_goods.people[JOB_HELPER]) return 0;
1480
// We need a helper as leader
1481
if(!real_goods.people[JOB_HELPER]) return 0;
1483
if(job == JOB_HELPER)
1484
return (real_goods.people[JOB_HELPER]-1)/2; // need one as leader
1486
return min(real_goods.people[job],real_goods.people[JOB_HELPER]-1);
1483
if(job == JOB_HELPER)
1484
return (real_goods.people[JOB_HELPER] - 1) / 2; // need one as leader
1486
return min(real_goods.people[job], real_goods.people[JOB_HELPER] - 1);
1489
1489
/// Starts a trade caravane from this warehouse
1490
void nobBaseWarehouse::StartTradeCaravane(const GoodType gt, Job job, const unsigned count,const TradeRoute& tr,nobBaseWarehouse * goal)
1490
void nobBaseWarehouse::StartTradeCaravane(const GoodType gt, Job job, const unsigned count, const TradeRoute& tr, nobBaseWarehouse* goal)
1492
nofTradeLeader * tl = new nofTradeLeader(x,y,player,tr,this->GetPos(),goal->GetPos());
1493
AddLeavingFigure(tl);
1495
// Create the donkeys or other people
1496
nofTradeDonkey * last = NULL;
1497
for(unsigned i = 0;i<count;++i)
1499
nofTradeDonkey * next = new nofTradeDonkey(x,y,player,tl,gt,job);
1501
if(last == NULL) tl->SetSuccessor(next);
1502
else last->SetSuccessor(next);
1506
AddLeavingFigure(next);
1509
// Also diminish the count of donkeys
1510
if(job == JOB_NOTHING)
1512
job = JOB_PACKDONKEY;
1513
// Diminish the goods in the warehouse
1514
--real_goods.people[JOB_HELPER];
1515
this->players->getElement(player)->DecreaseInventoryJob(JOB_HELPER,1);
1516
if(gt != GD_NOTHING)
1518
real_goods.goods[gt] -= count;
1519
this->players->getElement(player)->DecreaseInventoryWare(gt,count);
1521
if(job != JOB_NOTHING) //now that we have removed the goods lets remove the donkeys
1523
real_goods.people[job] -= count;
1524
this->players->getElement(player)->DecreaseInventoryJob(job,count);
1529
--real_goods.people[JOB_HELPER];
1530
this->players->getElement(player)->DecreaseInventoryJob(JOB_HELPER,1);
1531
if(gt != GD_NOTHING)
1533
real_goods.goods[gt] -= count;
1534
this->players->getElement(player)->DecreaseInventoryWare(gt,count);
1536
if(job != JOB_NOTHING) //we shouldnt have had goods so lets remove the jobs & the helpers
1538
real_goods.people[job] -= count;
1539
this->players->getElement(player)->DecreaseInventoryJob(job,count);
1540
real_goods.people[JOB_HELPER] -= count;
1541
this->players->getElement(player)->DecreaseInventoryJob(JOB_HELPER,count);
1492
nofTradeLeader* tl = new nofTradeLeader(x, y, player, tr, this->GetPos(), goal->GetPos());
1493
AddLeavingFigure(tl);
1495
// Create the donkeys or other people
1496
nofTradeDonkey* last = NULL;
1497
for(unsigned i = 0; i < count; ++i)
1499
nofTradeDonkey* next = new nofTradeDonkey(x, y, player, tl, gt, job);
1501
if(last == NULL) tl->SetSuccessor(next);
1502
else last->SetSuccessor(next);
1506
AddLeavingFigure(next);
1509
// Also diminish the count of donkeys
1510
if(job == JOB_NOTHING)
1512
job = JOB_PACKDONKEY;
1513
// Diminish the goods in the warehouse
1514
--real_goods.people[JOB_HELPER];
1515
this->players->getElement(player)->DecreaseInventoryJob(JOB_HELPER, 1);
1516
if(gt != GD_NOTHING)
1518
real_goods.goods[gt] -= count;
1519
this->players->getElement(player)->DecreaseInventoryWare(gt, count);
1521
if(job != JOB_NOTHING) //now that we have removed the goods lets remove the donkeys
1523
real_goods.people[job] -= count;
1524
this->players->getElement(player)->DecreaseInventoryJob(job, count);
1529
--real_goods.people[JOB_HELPER];
1530
this->players->getElement(player)->DecreaseInventoryJob(JOB_HELPER, 1);
1531
if(gt != GD_NOTHING)
1533
real_goods.goods[gt] -= count;
1534
this->players->getElement(player)->DecreaseInventoryWare(gt, count);
1536
if(job != JOB_NOTHING) //we shouldnt have had goods so lets remove the jobs & the helpers
1538
real_goods.people[job] -= count;
1539
this->players->getElement(player)->DecreaseInventoryJob(job, count);
1540
real_goods.people[JOB_HELPER] -= count;
1541
this->players->getElement(player)->DecreaseInventoryJob(JOB_HELPER, count);