322
324
return *new Critter_Bob(*this);
328
==============================
330
Load / Save implementation
332
==============================
335
#define CRITTER_SAVEGAME_VERSION 1
337
Critter_Bob::Loader::Loader()
341
const Bob::Task* Critter_Bob::Loader::get_task(const std::string& name)
343
if (name == "roam") return &taskRoam;
344
if (name == "program") return &taskProgram;
345
return Bob::Loader::get_task(name);
348
const BobProgramBase* Critter_Bob::Loader::get_program(const std::string& name)
350
Critter_Bob& critter = get<Critter_Bob>();
351
return critter.descr().get_program(name);
355
Map_Object::Loader* Critter_Bob::load(Editor_Game_Base & egbase, Map_Map_Object_Loader & mol, FileRead & fr)
357
std::auto_ptr<Loader> loader(new Loader);
360
// The header has been peeled away by the caller
362
uint8_t const version = fr.Unsigned8();
363
if (1 <= version && version <= CRITTER_SAVEGAME_VERSION) {
364
std::string owner = fr.CString();
365
std::string name = fr.CString();
366
const Critter_Bob_Descr * descr = 0;
368
if (owner == "world") {
369
descr = dynamic_cast<const Critter_Bob_Descr*>(egbase.map().world().get_bob_descr(name));
371
egbase.manually_load_tribe(owner);
373
if (const Tribe_Descr * tribe = egbase.get_tribe(owner))
374
descr = dynamic_cast<const Critter_Bob_Descr*>(tribe->get_bob_descr(name));
378
throw game_data_error("undefined critter %s/%s", owner.c_str(), name.c_str());
380
loader->init(egbase, mol, descr->create_object());
383
throw game_data_error(_("unknown/unhandled version %u"), version);
384
} catch (const std::exception & e) {
385
throw wexception(_("loading critter: %s"), e.what());
388
return loader.release();
391
void Critter_Bob::save(Editor_Game_Base & egbase, Map_Map_Object_Saver & mos, FileWrite & fw)
393
fw.Unsigned8(header_Critter);
394
fw.Unsigned8(CRITTER_SAVEGAME_VERSION);
396
std::string owner = descr().get_owner_tribe() ? descr().get_owner_tribe()->name() : "world";
398
fw.CString(descr().name());
400
Bob::save(egbase, mos, fw);