1057
1057
static_cast<long unsigned int>(j + 1),
1058
1058
static_cast<long unsigned int>(nr_steps), path[j]);
1060
molog("* transfer: %p\n", m_stack[i].transfer);
1061
1060
molog("* route: %p\n", m_stack[i].route);
1063
1062
molog("* program: %p\n", m_stack[i].route);
1068
==============================
1072
==============================
1075
#define BOB_SAVEGAME_VERSION 1
1077
Bob::Loader::Loader()
1081
void Bob::Loader::load(FileRead & fr)
1083
Map_Object::Loader::load(fr);
1085
uint8_t version = fr.Unsigned8();
1086
if (version != BOB_SAVEGAME_VERSION)
1087
throw game_data_error("unknown/unhandled version: %u", version);
1089
Bob& bob = get<Bob>();
1091
if (Player_Number owner_number = fr.Unsigned8()) {
1092
if (owner_number > egbase().map().get_nrplayers())
1093
throw game_data_error
1094
("owner number is %u but there are only %u players",
1095
owner_number, egbase().map().get_nrplayers());
1097
Player * owner = egbase().get_player(owner_number);
1099
throw game_data_error("owning player %u does not exist", owner_number);
1101
bob.set_owner(owner);
1104
bob.set_position(egbase(), fr.Coords32());
1106
std::string animname = fr.CString();
1107
bob.m_anim = animname.size() ? bob.descr().get_animation(animname) : 0;
1108
bob.m_animstart = fr.Signed32();
1109
bob.m_walking = static_cast<WalkingDir>(fr.Direction8_allow_null());
1110
if (bob.m_walking) {
1111
bob.m_walkstart = fr.Signed32();
1112
bob.m_walkend = fr.Signed32();
1115
bob.m_actid = fr.Unsigned32();
1116
bob.m_signal = fr.CString();
1118
uint32_t stacksize = fr.Unsigned32();
1119
bob.m_stack.resize(stacksize);
1120
states.resize(stacksize);
1121
for(uint32_t i = 0; i < stacksize; ++i) {
1122
State & state = bob.m_stack[i];
1123
LoadState & loadstate = states[i];
1125
state.task = get_task(fr.CString());
1126
state.ivar1 = fr.Signed32();
1127
state.ivar2 = fr.Signed32();
1128
state.ivar3 = fr.Signed32();
1129
loadstate.objvar1 = fr.Unsigned32();
1130
state.svar1 = fr.CString();
1131
state.coords = fr.Coords32_allow_null(egbase().map().extent());
1133
if (fr.Unsigned8()) {
1135
for(int i = 0; i < 6; ++i)
1136
anims[i] = bob.descr().get_animation(fr.CString());
1137
state.diranims = new DirAnimations
1138
(anims[0], anims[1], anims[2], anims[3], anims[4], anims[5]);
1141
if (fr.Unsigned8()) {
1142
state.path = new Path;
1143
state.path->load(fr, egbase().map());
1146
if (fr.Unsigned8()) {
1147
state.route = new Route;
1148
state.route->load(loadstate.route, fr);
1151
std::string programname = fr.CString();
1152
if (programname.size())
1153
state.program = get_program(programname);
1157
void Bob::Loader::load_pointers()
1159
Map_Object::Loader::load_pointers();
1161
Bob& bob = get<Bob>();
1162
for(uint32_t i = 0; i < bob.m_stack.size(); ++i) {
1163
State & state = bob.m_stack[i];
1164
LoadState & loadstate = states[i];
1166
if (loadstate.objvar1)
1167
state.objvar1 = &mol().get<Map_Object>(loadstate.objvar1);
1170
state.route->load_pointers(loadstate.route, mol());
1174
void Bob::Loader::load_finish()
1176
Map_Object::Loader::load_finish();
1179
const Bob::Task * Bob::Loader::get_task(const std::string& name)
1181
if (name == "move") return &taskMove;
1182
if (name == "movepath") return &taskMovepath;
1183
if (name == "idle") return &taskIdle;
1185
throw game_data_error("unknown bob task '%s'", name.c_str());
1188
const BobProgramBase * Bob::Loader::get_program(const std::string& name)
1190
throw game_data_error("unknown bob program '%s'", name.c_str());
1193
void Bob::save(Editor_Game_Base & eg, Map_Map_Object_Saver & mos, FileWrite & fw)
1195
Map_Object::save(eg, mos, fw);
1197
fw.Unsigned8(BOB_SAVEGAME_VERSION);
1199
fw.Unsigned8(m_owner ? m_owner->player_number() : 0);
1200
fw.Coords32(m_position);
1202
// m_linkpprev and m_linknext are recreated automatically
1204
fw.CString(m_anim ? descr().get_animation_name(m_anim) : "");
1205
fw.Signed32(m_animstart);
1206
fw.Direction8_allow_null(m_walking);
1208
fw.Signed32(m_walkstart);
1209
fw.Signed32(m_walkend);
1212
fw.Unsigned32(m_actid);
1213
fw.CString(m_signal);
1215
fw.Unsigned32(m_stack.size());
1216
for(unsigned int i = 0; i < m_stack.size(); ++i) {
1217
const State& state = m_stack[i];
1219
fw.CString(state.task->name);
1220
fw.Signed32(state.ivar1);
1221
fw.Signed32(state.ivar2);
1222
fw.Signed32(state.ivar3);
1223
if (const Map_Object * obj = state.objvar1.get(eg)) {
1224
fw.Unsigned32(mos.get_object_file_index(*obj));
1228
fw.CString(state.svar1);
1230
fw.Coords32(state.coords);
1232
if (state.diranims) {
1234
for(int dir = 1; dir <= 6; ++dir)
1235
fw.CString(descr().get_animation_name(state.diranims->get_animation(dir)).c_str());
1242
state.path->save(fw);
1249
state.route->save(fw, eg, mos);
1254
fw.CString(state.program ? state.program->get_name() : "");