void Load_TOWN() { int index; while ((index = SlIterateArray()) != -1) { Town *t = new (index) Town(); SlObject(t, _town_desc); t->LoadCargoSourceSink(); if (IsSavegameVersionBefore(161)) continue; SlObject(&t->cargo_accepted, GetTileMatrixDesc()); if (t->cargo_accepted.area.w != 0) { uint arr_len = t->cargo_accepted.area.w / AcceptanceMatrix::GRID * t->cargo_accepted.area.h / AcceptanceMatrix::GRID; t->cargo_accepted.data = MallocT<uint32>(arr_len); SlArray(t->cargo_accepted.data, arr_len, SLE_UINT32); /* Rebuild total cargo acceptance. */ UpdateTownCargoTotal(t); } /* Cache the aligned tile index of the centre tile. */ uint town_x = (TileX(t->xy) / AcceptanceMatrix::GRID) * AcceptanceMatrix::GRID; uint town_y = (TileY(t->xy) / AcceptanceMatrix::GRID) * AcceptanceMatrix::GRID; t->xy_aligned= TileXY(town_x, town_y); } }
/** * Save a link graph job. * @param lgj LinkGraphJob to be saved. */ static void DoSave_LGRJ(LinkGraphJob *lgj) { SlObject(lgj, GetLinkGraphJobDesc()); _num_nodes = lgj->Size(); SlObject(const_cast<LinkGraph *>(&lgj->Graph()), GetLinkGraphDesc()); SaveLoad_LinkGraph(const_cast<LinkGraph &>(lgj->Graph())); }
static void Load_GLOG_common(LoggedAction *&gamelog_action, uint &gamelog_actions) { assert(gamelog_action == NULL); assert(gamelog_actions == 0); GamelogActionType at; while ((at = (GamelogActionType)SlReadByte()) != GLAT_NONE) { gamelog_action = ReallocT(gamelog_action, gamelog_actions + 1); LoggedAction *la = &gamelog_action[gamelog_actions++]; la->at = at; SlObject(la, _glog_action_desc); // has to be saved after 'DATE'! la->change = NULL; la->changes = 0; GamelogChangeType ct; while ((ct = (GamelogChangeType)SlReadByte()) != GLCT_NONE) { la->change = ReallocT(la->change, la->changes + 1); LoggedChange *lc = &la->change[la->changes++]; /* for SLE_STR, pointer has to be valid! so make it NULL */ memset(lc, 0, sizeof(*lc)); lc->ct = ct; assert((uint)ct < GLCT_END); SlObject(lc, _glog_desc[ct]); } } }
static void Save_GLOG() { const LoggedAction *laend = &_gamelog_action[_gamelog_actions]; size_t length = 0; for (const LoggedAction *la = _gamelog_action; la != laend; la++) { const LoggedChange *lcend = &la->change[la->changes]; for (LoggedChange *lc = la->change; lc != lcend; lc++) { assert((uint)lc->ct < lengthof(_glog_desc)); length += SlCalcObjLength(lc, _glog_desc[lc->ct]) + 1; } length += 4; } length++; SlSetLength(length); for (LoggedAction *la = _gamelog_action; la != laend; la++) { SlWriteByte(la->at); SlObject(la, _glog_action_desc); const LoggedChange *lcend = &la->change[la->changes]; for (LoggedChange *lc = la->change; lc != lcend; lc++) { SlWriteByte(lc->ct); assert((uint)lc->ct < GLCT_END); SlObject(lc, _glog_desc[lc->ct]); } SlWriteByte(GLCT_NONE); } SlWriteByte(GLAT_NONE); }
static void Load_STNN() { int index; while ((index = SlIterateArray()) != -1) { bool waypoint = (SlReadByte() & FACIL_WAYPOINT) != 0; BaseStation *bst = waypoint ? (BaseStation *)new (index) Waypoint() : new (index) Station(); SlObject(bst, waypoint ? _waypoint_desc : _station_desc); if (!waypoint) { Station *st = Station::From(bst); for (CargoID i = 0; i < NUM_CARGO; i++) { SlObject(&st->goods[i], GetGoodsDesc()); } } if (bst->num_specs != 0) { /* Allocate speclist memory when loading a game */ bst->speclist = CallocT<StationSpecList>(bst->num_specs); for (uint i = 0; i < bst->num_specs; i++) { SlObject(&bst->speclist[i], _station_speclist_desc); } } } }
static void Load_TOWN() { int index; while ((index = SlIterateArray()) != -1) { Town *t = new (index) Town(); SlObject(t, _town_desc); for (CargoID i = 0; i < NUM_CARGO; i++) { SlObject(&t->supplied[i], _town_supplied_desc); } for (int i = TE_BEGIN; i < TE_END; i++) { SlObject(&t->received[i], _town_received_desc); } if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GB(t->townnametype, 11, 5) != 15) { SlErrorCorrupt("Invalid town name generator"); } if (IsSavegameVersionBefore(166)) continue; SlObject(&t->cargo_accepted, GetTileMatrixDesc()); if (t->cargo_accepted.area.w != 0) { uint arr_len = t->cargo_accepted.area.w / AcceptanceMatrix::GRID * t->cargo_accepted.area.h / AcceptanceMatrix::GRID; t->cargo_accepted.data = MallocT<uint32>(arr_len); SlArray(t->cargo_accepted.data, arr_len, SLE_UINT32); /* Rebuild total cargo acceptance. */ UpdateTownCargoTotal(t); } } }
/* static */ bool ScriptInstance::LoadObjects(HSQUIRRELVM vm) { SlObject(NULL, _script_byte); switch (_script_sl_byte) { case SQSL_INT: { int value; SlArray(&value, 1, SLE_INT32); if (vm != NULL) sq_pushinteger(vm, (SQInteger)value); return true; } case SQSL_STRING: { SlObject(NULL, _script_byte); static char buf[256]; SlArray(buf, _script_sl_byte, SLE_CHAR); if (vm != NULL) sq_pushstring(vm, OTTD2SQ(buf), -1); return true; } case SQSL_ARRAY: { if (vm != NULL) sq_newarray(vm, 0); while (LoadObjects(vm)) { if (vm != NULL) sq_arrayappend(vm, -2); /* The value is popped from the stack by squirrel. */ } return true; } case SQSL_TABLE: { if (vm != NULL) sq_newtable(vm); while (LoadObjects(vm)) { LoadObjects(vm); if (vm != NULL) sq_rawset(vm, -3); /* The key (-2) and value (-1) are popped from the stack by squirrel. */ } return true; } case SQSL_BOOL: { SlObject(NULL, _script_byte); if (vm != NULL) sq_pushinteger(vm, (SQBool)(_script_sl_byte != 0)); return true; } case SQSL_NULL: { if (vm != NULL) sq_pushnull(vm); return true; } case SQSL_ARRAY_TABLE_END: { return false; } default: NOT_REACHED(); } }
void RealSave_TOWN(Town *t) { SlObject(t, _town_desc); t->SaveCargoSourceSink(); if (IsSavegameVersionBefore(161)) return; SlObject(&t->cargo_accepted, GetTileMatrixDesc()); if (t->cargo_accepted.area.w != 0) { uint arr_len = t->cargo_accepted.area.w / AcceptanceMatrix::GRID * t->cargo_accepted.area.h / AcceptanceMatrix::GRID; SlArray(t->cargo_accepted.data, arr_len, SLE_UINT32); } }
static void Load_AIPL() { CompanyID index; while ((index = (CompanyID)SlIterateArray()) != (CompanyID)-1) { SlObject(NULL, _ai_company); if (!Company::IsValidAiID(index)) continue; SlObject(NULL, _ai_byte); /* Check if there was anything saved at all. */ if (_ai_sl_byte == 0) continue; LoadObjects(); } }
static void Ptrs_CAPY() { CargoPayment *cp; FOR_ALL_CARGO_PAYMENTS(cp) { SlObject(cp, _cargopayment_desc); } }
static void Ptrs_STNS() { /* Don't run when savegame version is higher than or equal to 123. */ if (!CheckSavegameVersion(123)) return; Station *st; FOR_ALL_STATIONS(st) { if (!CheckSavegameVersion(68)) { for (CargoID i = 0; i < NUM_CARGO; i++) { GoodsEntry *ge = &st->goods[i]; SlObject(ge, GetGoodsDesc()); } } SlObject(st, _old_station_desc); } }
/** * Load all link graph jobs. */ static void Load_LGRJ() { int index; while ((index = SlIterateArray()) != -1) { if (!LinkGraphJob::CanAllocateItem()) { /* Impossible as they have been present in previous game. */ NOT_REACHED(); } LinkGraphJob *lgj = new (index) LinkGraphJob(); SlObject(lgj, GetLinkGraphJobDesc()); LinkGraph &lg = const_cast<LinkGraph &>(lgj->Graph()); SlObject(&lg, GetLinkGraphDesc()); lg.Init(_num_nodes); SaveLoad_LinkGraph(lg); } }
static void Ptrs_ROADSTOP() { RoadStop *rs; FOR_ALL_ROADSTOPS(rs) { SlObject(rs, _roadstop_desc); } }
static void RealSave_STNN(BaseStation *bst) { bool waypoint = (bst->facilities & FACIL_WAYPOINT) != 0; SlObject(bst, waypoint ? _waypoint_desc : _station_desc); if (!waypoint) { Station *st = Station::From(bst); for (CargoID i = 0; i < NUM_CARGO; i++) { SlObject(&st->goods[i], GetGoodsDesc()); } } for (uint i = 0; i < bst->num_specs; i++) { SlObject(&bst->speclist[i], _station_speclist_desc); } }
/** * Save a GRF ID + local id -> OpenTTD's id mapping. * @param mapping The mapping to save. */ void Save_NewGRFMapping(const OverrideManagerBase &mapping) { for (uint i = 0; i < mapping.GetMaxMapping(); i++) { SlSetArrayIndex(i); SlObject(&mapping.mapping_ID[i], _newgrf_mapping_desc); } }
/** Save industry-type build data. */ static void Save_ITBL() { for (int i = 0; i < NUM_INDUSTRYTYPES; i++) { SlSetArrayIndex(i); SlObject(_industry_builder.builddata + i, _industrytype_builder_desc); } }
static void Save_STORY_PAGE_ELEMENT() { StoryPageElement *s; FOR_ALL_STORY_PAGE_ELEMENTS(s) { SlSetArrayIndex(s->index); SlObject(s, _story_page_elements_desc); } }
static void Save_STORY_PAGE() { StoryPage *s; FOR_ALL_STORY_PAGES(s) { SlSetArrayIndex(s->index); SlObject(s, _story_pages_desc); } }
static void Save_CAPY() { CargoPayment *cp; FOR_ALL_CARGO_PAYMENTS(cp) { SlSetArrayIndex(cp->index); SlObject(cp, _cargopayment_desc); } }
static void Ptrs_ERNW() { EngineRenew *er; FOR_ALL_ENGINE_RENEWS(er) { SlObject(er, _engine_renew_desc); } }
static void Ptrs_INDY() { Industry *i; FOR_ALL_INDUSTRIES(i) { SlObject(i, _industry_desc); } }
static void Load_OBJS() { int index; while ((index = SlIterateArray()) != -1) { Object *o = new (index) Object(); SlObject(o, _object_desc); } }
/* static */ void ScriptInstance::LoadEmpty() { SlObject(NULL, _script_byte); /* Check if there was anything saved at all. */ if (_script_sl_byte == 0) return; LoadObjects(NULL); }
static void Load_GOAL() { int index; while ((index = SlIterateArray()) != -1) { Goal *s = new (index) Goal(); SlObject(s, _goals_desc); } }
static void Save_ENGN() { Engine *e; FOR_ALL_ENGINES(e) { SlSetArrayIndex(e->index); SlObject(e, _engine_desc); } }
static void Save_GOAL() { Goal *s; FOR_ALL_GOALS(s) { SlSetArrayIndex(s->index); SlObject(s, _goals_desc); } }
/** Save all signs */ static void Save_SIGN() { Sign *si; FOR_ALL_SIGNS(si) { SlSetArrayIndex(si->index); SlObject(si, _sign_desc); } }
static void Save_ORDR() { Order *order; FOR_ALL_ORDERS(order) { SlSetArrayIndex(order->index); SlObject(order, GetOrderDescription()); } }
static void Load_GRPS() { int index; while ((index = SlIterateArray()) != -1) { Group *g = new (index) Group(); SlObject(g, _group_desc); } }
static void Save_GRPS() { Group *g; FOR_ALL_GROUPS(g) { SlSetArrayIndex(g->index); SlObject(g, _group_desc); } }