2
* Copyright (C) 2002-2004, 2006-2009 by the Widelands Development Team
2
* Copyright (C) 2002-2004, 2006-2010 by the Widelands Development Team
4
4
* This program is free software; you can redistribute it and/or
5
5
* modify it under the terms of the GNU General Public License
137
ProductionProgram::ActReturn::Economy_Needs::Economy_Needs
138
(char * & parameters, Tribe_Descr const & tribe)
142
ware_type = tribe.safe_ware_index(match(parameters, reached_end));
143
tribe.set_ware_type_has_demand_check(ware_type);
144
} catch (_wexception const & e) {
145
throw game_data_error("needs: %s", e.what());
148
bool ProductionProgram::ActReturn::Economy_Needs::evaluate
137
bool ProductionProgram::ActReturn::Economy_Needs_Ware::evaluate
149
138
(ProductionSite const & ps) const
153
("ActReturn::Economy_Needs::evaluate(%s): (called from %s:%u) "
142
("ActReturn::Economy_Needs_Ware::evaluate(%s): (called from %s:%u) "
154
143
"economy_needs(%s) = %u\n",
155
144
ps.descname().c_str(),
156
145
const_cast<ProductionSite &>(ps).top_state().program->get_name().c_str(),
161
150
return ps.get_economy()->needs_ware(ware_type);
163
std::string ProductionProgram::ActReturn::Economy_Needs::description
152
std::string ProductionProgram::ActReturn::Economy_Needs_Ware::description
164
153
(Tribe_Descr const & tribe) const
166
155
return _("economy needs ") + tribe.get_ware_descr(ware_type)->descname();
158
bool ProductionProgram::ActReturn::Economy_Needs_Worker::evaluate
159
(ProductionSite const & ps) const
163
("ActReturn::Economy_Needs_Worker::evaluate(%s): (called from %s:%u) "
164
"economy_needs(%s) = %u\n",
165
ps.descname().c_str(),
166
const_cast<ProductionSite &>(ps).top_state().program->get_name().c_str(),
167
const_cast<ProductionSite &>(ps).top_state().ip,
168
ps.descr().tribe().get_worker_descr(worker_type)->descname().c_str(),
169
ps.get_economy()->needs_worker(worker_type));
171
return ps.get_economy()->needs_worker(worker_type);
173
std::string ProductionProgram::ActReturn::Economy_Needs_Worker::description
174
(Tribe_Descr const & tribe) const
176
return _("economy needs ") + tribe.get_ware_descr(worker_type)->descname();
169
179
ProductionProgram::ActReturn::Site_Has::Site_Has
170
180
(char * & parameters, ProductionSite_Descr const & descr)
229
239
if (match_force_skip(parameters, "needs"))
231
new ProductionProgram::ActReturn::Economy_Needs(parameters, tribe);
242
char const * const type_name = match(parameters, reached_end);
243
if (Ware_Index index = tribe.ware_index(type_name)) {
244
tribe.set_ware_type_has_demand_check(index);
246
new ProductionProgram::ActReturn::Economy_Needs_Ware
248
} else if ((index = tribe.worker_index(type_name))) {
249
tribe.set_worker_type_has_demand_check(index);
251
new ProductionProgram::ActReturn::Economy_Needs_Worker
254
throw game_data_error
255
(_("expected %s but found \"%s\""),
256
_("ware type or worker type"), type_name);
257
} catch (_wexception const & e) {
258
throw game_data_error("needs: %s", e.what());
233
261
throw game_data_error
234
262
(_("expected %s but found \"%s\""), "\"needs\"", parameters);
877
ProductionProgram::ActRecruit::ActRecruit
878
(char * parameters, ProductionSite_Descr const & descr)
881
Tribe_Descr const & tribe = descr.tribe();
882
for (bool more = true; more; ++parameters) {
883
m_items.resize(m_items.size() + 1);
884
std::pair<Ware_Index, uint8_t> & item = *m_items.rbegin();
886
char const * worker = parameters;
887
for (;; ++parameters)
888
switch (*parameters) {
897
unsigned long long int const value =
898
strtoull(parameters, &endp, 0);
901
((*endp and *endp != ' ')
903
value < 1 or item.second != value)
904
throw game_data_error
905
(_("expected %s but found \"%s\""),
906
_("count"), parameters);
912
more = *parameters != '\0';
914
item.first = tribe.safe_worker_index(worker);
916
} catch (_wexception const & e) {
917
throw game_data_error("recruit: %s", e.what());
921
void ProductionProgram::ActRecruit::execute
922
(Game & game, ProductionSite & ps) const
924
assert(ps.m_recruited_workers.empty());
925
ps.m_recruited_workers = m_items;
926
ps.m_working_positions[0].worker->update_task_buildingwork(game);
928
Tribe_Descr const & tribe = ps.owner().tribe();
929
std::string result_string = _("Recruited ");
930
assert(m_items.size());
932
(struct {Items::const_iterator current; Items::const_iterator const end;}
933
i = {m_items.begin(), m_items.end()};;)
936
uint8_t const count = i.current->second;
939
sprintf(buffer, _("%u "), count);
940
result_string += buffer;
943
result_string += tribe.get_worker_descr(i.current->first)->descname();
944
if (++i.current == i.end)
946
result_string += _(", ");
949
(ps.m_result_buffer, sizeof(ps.m_result_buffer),
950
"%s", result_string.c_str());
849
954
ProductionProgram::ActMine::ActMine
850
955
(char * parameters, ProductionSite_Descr & descr,
851
956
const std::string & production_program_name)
1275
1380
action = new ActConsume(v->get_string(), *building);
1276
1381
else if (not strcmp(v->get_name(), "produce"))
1277
1382
action = new ActProduce(v->get_string(), *building);
1383
else if (not strcmp(v->get_name(), "recruit"))
1384
action = new ActRecruit(v->get_string(), *building);
1278
1385
else if (not strcmp(v->get_name(), "worker"))
1279
1386
action = new ActWorker (v->get_string(), *building, _name);
1280
1387
else if (not strcmp(v->get_name(), "mine"))