37
37
///////////////////////////////////////////////////////////////////////////////
38
38
// Makros / Defines
39
39
#if defined _WIN32 && defined _DEBUG && defined _MSC_VER
40
#define new new(_NORMAL_BLOCK, THIS_FILE, __LINE__)
42
static char THIS_FILE[] = __FILE__;
40
#define new new(_NORMAL_BLOCK, THIS_FILE, __LINE__)
42
static char THIS_FILE[] = __FILE__;
45
nofFarmer::nofFarmer(const unsigned short x, const unsigned short y,const unsigned char player,nobUsual * workplace)
46
: nofFarmhand(JOB_FARMER,x,y,player,workplace), harvest(false)
51
void nofFarmer::Serialize_nofFarmer(SerializedGameData * sgd) const
53
Serialize_nofFarmhand(sgd);
55
sgd->PushBool(harvest);
58
nofFarmer::nofFarmer(SerializedGameData * sgd, const unsigned obj_id) : nofFarmhand(sgd,obj_id),
59
harvest(sgd->PopBool())
45
nofFarmer::nofFarmer(const unsigned short x, const unsigned short y, const unsigned char player, nobUsual* workplace)
46
: nofFarmhand(JOB_FARMER, x, y, player, workplace), harvest(false)
51
void nofFarmer::Serialize_nofFarmer(SerializedGameData* sgd) const
53
Serialize_nofFarmhand(sgd);
55
sgd->PushBool(harvest);
58
nofFarmer::nofFarmer(SerializedGameData* sgd, const unsigned obj_id) : nofFarmhand(sgd, obj_id),
59
harvest(sgd->PopBool())
64
64
/// Malt den Arbeiter beim Arbeiten
65
void nofFarmer::DrawWorking(int x,int y)
65
void nofFarmer::DrawWorking(int x, int y)
71
LOADER.GetImageN("rom_bobs", 140+(now_id=GAMECLIENT.Interpolate(88,current_ev))%8)
72
->Draw(x,y,0,0,0,0,0,0, COLOR_WHITE, COLORS[gwg->GetPlayer(player)->color]);
74
// Evtl Sound abspielen
77
SoundManager::inst().PlayNOSound(64,this,now_id/8);
82
LOADER.GetImageN("rom_bobs", 132+GAMECLIENT.Interpolate(88,current_ev)%8)
83
->Draw(x,y,0,0,0,0,0,0, COLOR_WHITE, COLORS[gwg->GetPlayer(player)->color]);
72
LOADER.GetImageN("rom_bobs", 140 + (now_id = GAMECLIENT.Interpolate(88, current_ev)) % 8)
73
->Draw(x, y, 0, 0, 0, 0, 0, 0, COLOR_WHITE, COLORS[gwg->GetPlayer(player)->color]);
75
// Evtl Sound abspielen
78
SoundManager::inst().PlayNOSound(64, this, now_id / 8);
85
LOADER.GetImageN("rom_bobs", 132 + GAMECLIENT.Interpolate(88, current_ev) % 8)
86
->Draw(x, y, 0, 0, 0, 0, 0, 0, COLOR_WHITE, COLORS[gwg->GetPlayer(player)->color]);
89
92
/// Fragt die abgeleitete Klasse um die ID in JOBS.BOB, wenn der Beruf Waren rausträgt (bzw rein)
90
93
unsigned short nofFarmer::GetCarryID() const
95
98
/// Abgeleitete Klasse informieren, wenn sie anfängt zu arbeiten (Vorbereitungen)
96
99
void nofFarmer::WorkStarted()
98
// Wenn ich zu einem Getreidefeld gehe, ernte ich es ab, ansonsten sähe ich
99
harvest = (gwg->GetNO(x,y)->GetType() == NOP_GRAINFIELD);
101
// Wenn ich zu einem Getreidefeld gehe, ernte ich es ab, ansonsten sähe ich
102
harvest = (gwg->GetNO(x, y)->GetType() == NOP_GRAINFIELD);
101
// Getreidefeld Bescheid sagen, damits nicht plötzlich verschwindet, während wir arbeiten
103
gwg->GetSpecObj<noGrainfield>(x,y)->BeginHarvesting();
104
// Getreidefeld Bescheid sagen, damits nicht plötzlich verschwindet, während wir arbeiten
106
gwg->GetSpecObj<noGrainfield>(x, y)->BeginHarvesting();
106
109
/// Abgeleitete Klasse informieren, wenn fertig ist mit Arbeiten
107
110
void nofFarmer::WorkFinished()
111
// Getreidefeld vernichten und vorher noch die ID von dem abgeernteten Feld holen, was dann als
112
// normales Zierobjekt gesetzt wird
113
noBase * nob = gwg->GetNO(x,y);
114
// Check if there is still a grain field at this position
115
if(nob->GetGOT() != GOT_GRAINFIELD)
117
noGrainfield * gf = static_cast<noGrainfield*>(nob);
114
// Getreidefeld vernichten und vorher noch die ID von dem abgeernteten Feld holen, was dann als
115
// normales Zierobjekt gesetzt wird
116
noBase* nob = gwg->GetNO(x, y);
117
// Check if there is still a grain field at this position
118
if(nob->GetGOT() != GOT_GRAINFIELD)
120
noGrainfield* gf = static_cast<noGrainfield*>(nob);
118
121
//unsigned env_obj_id = gf->GetHarvestMapLstID();
119
122
gwg->SetNO(new noEnvObject(x, y, gf->GetHarvestMapLstID()), x, y);
123
// Getreide, was wir geerntet haben, in die Hand nehmen
126
// Getreide, was wir geerntet haben, in die Hand nehmen
128
// If there is any road now, don't set the grain field
129
for(unsigned i = 0;i<6;++i)
131
if(gwg->GetPointRoad(x,y,i))
135
// Was stand hier vorher?
136
NodalObjectType nop = gwg->GetNO(x,y)->GetType();
138
// Nur Zierobjekte und Schilder dürfen weggerissen werden
139
if(nop == NOP_ENVIRONMENT || nop == NOP_NOTHING)
141
// ggf. vorher wegreißen
142
noBase * no = gwg->GetSpecObj<noBase>(x,y);
148
// neues Getreidefeld setzen
149
gwg->SetNO(new noGrainfield(x,y),x,y);
152
// Wir haben nur gesäht (gar nichts in die Hand nehmen)
131
// If there is any road now, don't set the grain field
132
for(unsigned i = 0; i < 6; ++i)
134
if(gwg->GetPointRoad(x, y, i))
138
// Was stand hier vorher?
139
NodalObjectType nop = gwg->GetNO(x, y)->GetType();
141
// Nur Zierobjekte und Schilder dürfen weggerissen werden
142
if(nop == NOP_ENVIRONMENT || nop == NOP_NOTHING)
144
// ggf. vorher wegreißen
145
noBase* no = gwg->GetSpecObj<noBase>(x, y);
151
// neues Getreidefeld setzen
152
gwg->SetNO(new noGrainfield(x, y), x, y);
155
// Wir haben nur gesäht (gar nichts in die Hand nehmen)
156
// BQ drumrum neu berechnen
157
gwg->RecalcBQAroundPoint(x,y);
159
// BQ drumrum neu berechnen
160
gwg->RecalcBQAroundPoint(x, y);
160
163
/// Returns the quality of this working point or determines if the worker can work here at all
161
nofFarmhand::PointQuality nofFarmer::GetPointQuality(const MapCoord x, const MapCoord y)
164
nofFarmhand::PointQuality nofFarmer::GetPointQuality(const MapCoord x, const MapCoord y)
164
// Entweder gibts ein Getreidefeld, das wir abernten können...
165
if(gwg->GetNO(x,y)->GetType() == NOP_GRAINFIELD)
167
if(gwg->GetSpecObj<noGrainfield>(x,y)->IsHarvestable())
170
return PQ_NOTPOSSIBLE;
172
// oder einen freien Platz, wo wir ein neues sähen können
175
// Nicht auf Straßen bauen!
176
for(unsigned char i = 0;i<6;++i)
178
if(gwg->GetPointRoad(x,y,i))
179
return PQ_NOTPOSSIBLE;
182
// Terrain untersuchen (nur auf Wiesen und Savanne und Steppe pflanzen
183
unsigned char t,good_terrains = 0;
184
for(unsigned char i = 0;i<6;++i)
186
t = gwg->GetTerrainAround(x,y,i);
187
if(t == 3 || (t>=8 && t<=12))
190
if (good_terrains != 6)
191
return PQ_NOTPOSSIBLE;
194
NodalObjectType nop = gwg->GetNO(x,y)->GetType();
195
if(nop != NOP_ENVIRONMENT && nop && nop != NOP_NOTHING)
196
return PQ_NOTPOSSIBLE;
198
for(unsigned char i = 0;i<6;++i)
200
// Nicht direkt neben andere Getreidefelder und Gebäude setzen!
201
nop = gwg->GetNO(gwg->GetXA(x,y,i),gwg->GetYA(x,y,i))->GetType();
202
if(nop == NOP_GRAINFIELD || nop == NOP_BUILDING || nop == NOP_BUILDINGSITE)
203
return PQ_NOTPOSSIBLE;
206
// Nicht direkt neben den Bauernhof pflanzen!
207
if(x == workplace->GetX()+1 && y == workplace->GetY())
208
return PQ_NOTPOSSIBLE;
167
// Entweder gibts ein Getreidefeld, das wir abernten können...
168
if(gwg->GetNO(x, y)->GetType() == NOP_GRAINFIELD)
170
if(gwg->GetSpecObj<noGrainfield>(x, y)->IsHarvestable())
173
return PQ_NOTPOSSIBLE;
175
// oder einen freien Platz, wo wir ein neues sähen können
178
// Nicht auf Straßen bauen!
179
for(unsigned char i = 0; i < 6; ++i)
181
if(gwg->GetPointRoad(x, y, i))
182
return PQ_NOTPOSSIBLE;
185
// Terrain untersuchen (nur auf Wiesen und Savanne und Steppe pflanzen
186
unsigned char t, good_terrains = 0;
187
for(unsigned char i = 0; i < 6; ++i)
189
t = gwg->GetTerrainAround(x, y, i);
190
if(t == 3 || (t >= 8 && t <= 12))
193
if (good_terrains != 6)
194
return PQ_NOTPOSSIBLE;
197
NodalObjectType nop = gwg->GetNO(x, y)->GetType();
198
if(nop != NOP_ENVIRONMENT && nop && nop != NOP_NOTHING)
199
return PQ_NOTPOSSIBLE;
201
for(unsigned char i = 0; i < 6; ++i)
203
// Nicht direkt neben andere Getreidefelder und Gebäude setzen!
204
nop = gwg->GetNO(gwg->GetXA(x, y, i), gwg->GetYA(x, y, i))->GetType();
205
if(nop == NOP_GRAINFIELD || nop == NOP_BUILDING || nop == NOP_BUILDINGSITE)
206
return PQ_NOTPOSSIBLE;
209
// Nicht direkt neben den Bauernhof pflanzen!
210
if(x == workplace->GetX() + 1 && y == workplace->GetY())
211
return PQ_NOTPOSSIBLE;
216
219
void nofFarmer::WorkAborted_Farmhand()
218
// dem Getreidefeld Bescheid sagen, damit es wieder verdorren kann, wenn wir abernten
219
if(harvest && state == STATE_WORK)
220
gwg->GetSpecObj<noGrainfield>(x,y)->EndHarvesting();
221
// dem Getreidefeld Bescheid sagen, damit es wieder verdorren kann, wenn wir abernten
222
if(harvest && state == STATE_WORK)
223
gwg->GetSpecObj<noGrainfield>(x, y)->EndHarvesting();