~chuckw20/widelands/New_atlantean_carrier_animations

« back to all changes in this revision

Viewing changes to src/logic/critter_bob.cc

  • Committer: Nicolai Hähnle
  • Date: 2010-05-09 11:21:24 UTC
  • mfrom: (5141.1.7 bob-saving)
  • Revision ID: prefect_@gmx.net-20100509112124-14ap938z6yuqy38j
Merge branch bob-saving

All classes derived from Bob now use the new save system.

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
#include "critter_bob_program.h"
23
23
#include "field.h"
24
24
#include "game.h"
 
25
#include "game_data_error.h"
25
26
#include "helper.h"
26
27
#include "profile/profile.h"
 
28
#include "tribe.h"
27
29
#include "wexception.h"
28
30
 
29
31
#include <cstdio>
322
324
        return *new Critter_Bob(*this);
323
325
}
324
326
 
 
327
/*
 
328
==============================
 
329
 
 
330
Load / Save implementation
 
331
 
 
332
==============================
 
333
*/
 
334
 
 
335
#define CRITTER_SAVEGAME_VERSION 1
 
336
 
 
337
Critter_Bob::Loader::Loader()
 
338
{
 
339
}
 
340
 
 
341
const Bob::Task* Critter_Bob::Loader::get_task(const std::string& name)
 
342
{
 
343
        if (name == "roam") return &taskRoam;
 
344
        if (name == "program") return &taskProgram;
 
345
        return Bob::Loader::get_task(name);
 
346
}
 
347
 
 
348
const BobProgramBase* Critter_Bob::Loader::get_program(const std::string& name)
 
349
{
 
350
        Critter_Bob& critter = get<Critter_Bob>();
 
351
        return critter.descr().get_program(name);
 
352
}
 
353
 
 
354
 
 
355
Map_Object::Loader* Critter_Bob::load(Editor_Game_Base & egbase, Map_Map_Object_Loader & mol, FileRead & fr)
 
356
{
 
357
        std::auto_ptr<Loader> loader(new Loader);
 
358
 
 
359
        try {
 
360
                // The header has been peeled away by the caller
 
361
 
 
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;
 
367
 
 
368
                        if (owner == "world") {
 
369
                                descr = dynamic_cast<const Critter_Bob_Descr*>(egbase.map().world().get_bob_descr(name));
 
370
                        } else {
 
371
                                egbase.manually_load_tribe(owner);
 
372
 
 
373
                                if (const Tribe_Descr * tribe = egbase.get_tribe(owner))
 
374
                                        descr = dynamic_cast<const Critter_Bob_Descr*>(tribe->get_bob_descr(name));
 
375
                        }
 
376
 
 
377
                        if (!descr)
 
378
                                throw game_data_error("undefined critter %s/%s", owner.c_str(), name.c_str());
 
379
 
 
380
                        loader->init(egbase, mol, descr->create_object());
 
381
                        loader->load(fr);
 
382
                } else
 
383
                        throw game_data_error(_("unknown/unhandled version %u"), version);
 
384
        } catch (const std::exception & e) {
 
385
                throw wexception(_("loading critter: %s"), e.what());
 
386
        }
 
387
 
 
388
        return loader.release();
 
389
}
 
390
 
 
391
void Critter_Bob::save(Editor_Game_Base & egbase, Map_Map_Object_Saver & mos, FileWrite & fw)
 
392
{
 
393
        fw.Unsigned8(header_Critter);
 
394
        fw.Unsigned8(CRITTER_SAVEGAME_VERSION);
 
395
 
 
396
        std::string owner = descr().get_owner_tribe() ? descr().get_owner_tribe()->name() : "world";
 
397
        fw.CString(owner);
 
398
        fw.CString(descr().name());
 
399
 
 
400
        Bob::save(egbase, mos, fw);
 
401
}
 
402
 
325
403
}