truelight@0: #include "stdafx.h" truelight@0: #include "ttd.h" tron@507: #include "table/strings.h" tron@679: #include "map.h" truelight@0: #include "town.h" truelight@0: #include "industry.h" truelight@0: #include "station.h" truelight@0: #include "economy.h" truelight@0: #include "player.h" truelight@0: #include "engine.h" truelight@0: #include "vehicle.h" truelight@0: truelight@0: extern byte _name_array[512][32]; truelight@0: extern TileIndex _animated_tile_list[256]; darkvater@392: extern uint16 _custom_sprites_base; truelight@0: truelight@923: #if defined(_MSC_VER) || defined(__WATCOMC__) truelight@0: #pragma pack(push, 1) truelight@0: #endif truelight@0: truelight@0: typedef struct { truelight@0: uint16 string_id; truelight@0: uint16 x; truelight@0: uint16 right; truelight@0: uint16 y; truelight@0: uint16 bottom; truelight@0: uint16 duration; truelight@0: uint32 params[2]; truelight@0: } GCC_PACK OldTextEffect; truelight@0: assert_compile(sizeof(OldTextEffect) == 0x14); truelight@0: truelight@0: typedef struct { truelight@0: uint16 xy; truelight@0: uint16 population; truelight@0: uint16 townnametype; truelight@0: uint32 townnameparts; truelight@0: byte grow_counter; truelight@0: byte sort_index; truelight@0: int16 sign_left, sign_top; truelight@0: byte namewidth_1, namewidth_2; truelight@0: uint16 flags12; truelight@0: uint16 radius[5]; truelight@0: uint16 ratings[8]; truelight@0: uint32 have_ratings; truelight@0: uint32 statues; truelight@0: uint16 num_houses; truelight@0: byte time_until_rebuild; truelight@0: byte growth_rate; truelight@0: uint16 new_max_pass, new_max_mail; truelight@0: uint16 new_act_pass, new_act_mail; truelight@0: uint16 max_pass, max_mail; truelight@0: uint16 act_pass, act_mail; truelight@0: byte pct_pass_transported, pct_mail_transported; darkvater@4: uint16 new_act_food, new_act_water; darkvater@4: uint16 act_food, act_water; truelight@0: byte road_build_months; truelight@0: byte fund_buildings_months; darkvater@4: // unused bytes at the end of the Town Struct truelight@0: uint32 unk56; truelight@0: uint32 unk5A; truelight@0: } GCC_PACK OldTown; truelight@0: assert_compile(sizeof(OldTown) == 0x5E); truelight@0: truelight@0: typedef struct { truelight@0: uint16 xy; truelight@0: uint32 town; truelight@0: } GCC_PACK OldDepot; truelight@0: assert_compile(sizeof(OldDepot) == 0x6); truelight@0: truelight@0: typedef struct { truelight@0: uint32 price; truelight@0: uint16 frac; truelight@0: } GCC_PACK OldPrice; truelight@0: assert_compile(sizeof(OldPrice) == 0x6); truelight@0: truelight@0: typedef struct { truelight@0: uint32 price; truelight@0: uint16 frac; truelight@0: uint16 unused; truelight@0: } GCC_PACK OldPaymentRate; truelight@0: assert_compile(sizeof(OldPaymentRate) == 8); truelight@0: truelight@0: typedef struct { truelight@0: uint16 waiting_acceptance; truelight@0: byte days_since_pickup; truelight@0: byte rating; truelight@0: byte enroute_from; truelight@0: byte enroute_time; truelight@0: byte last_speed; truelight@0: byte last_age; truelight@0: } GCC_PACK OldGoodsEntry; truelight@0: assert_compile(sizeof(OldGoodsEntry) == 8); truelight@0: truelight@0: typedef struct { truelight@0: uint16 xy; truelight@0: uint32 town; truelight@0: uint16 bus_tile, lorry_tile, train_tile, airport_tile, dock_tile; truelight@0: byte platforms; truelight@0: byte alpha_order_obsolete; // alpha_order is obsolete since savegame format 4 truelight@0: byte namewidth_1, namewidth_2; truelight@0: uint16 string_id; truelight@0: int16 sign_left, sign_top; truelight@0: uint16 had_vehicle_of_type; truelight@0: OldGoodsEntry goods[12]; truelight@0: byte time_since_load, time_since_unload; truelight@0: byte delete_ctr; truelight@0: byte owner; truelight@0: byte facilities; truelight@0: byte airport_type; truelight@0: byte truck_stop_status, bus_stop_status; dominik@123: byte blocked_months_obsolete; truelight@0: byte unk85; truelight@0: uint16 airport_flags; truelight@0: uint16 last_vehicle; truelight@0: uint32 unk8A; truelight@0: } GCC_PACK OldStation; truelight@0: assert_compile(sizeof(OldStation) == 0x8E); truelight@0: truelight@0: typedef struct { truelight@0: uint16 xy; truelight@0: uint32 town; truelight@0: byte width; truelight@0: byte height; truelight@0: byte produced_cargo[2]; truelight@0: uint16 cargo_waiting[2]; truelight@0: byte production_rate[2]; truelight@0: byte accepts_cargo[3]; truelight@0: byte prod_level; truelight@0: uint16 last_mo_production[2]; truelight@0: uint16 last_mo_transported[2]; truelight@0: byte pct_transported[2]; truelight@0: uint16 total_production[2]; truelight@0: uint16 total_transported[2]; truelight@0: byte type; truelight@0: byte owner; truelight@0: byte color_map; truelight@0: byte last_prod_year; truelight@0: uint16 counter; truelight@0: byte was_cargo_delivered; truelight@0: byte nothing; truelight@0: uint32 unk2E; truelight@0: uint32 unk32; truelight@0: } GCC_PACK OldIndustry; truelight@0: assert_compile(sizeof(OldIndustry) == 0x36); truelight@0: truelight@0: typedef struct { truelight@0: int32 cost[13]; truelight@0: } GCC_PACK OldPlayerExpenses; truelight@0: assert_compile(sizeof(OldPlayerExpenses) == 0x34); truelight@0: truelight@0: typedef struct { truelight@0: int32 income; truelight@0: int32 expenses; truelight@0: uint32 delivered_cargo; truelight@0: uint32 performance_history; truelight@0: uint32 company_value; truelight@0: } GCC_PACK OldPlayerEconomy; truelight@0: assert_compile(sizeof(OldPlayerEconomy) == 0x14); truelight@0: truelight@0: typedef struct { truelight@0: uint16 spec_tile; truelight@0: uint16 use_tile; truelight@0: byte rand_rng; truelight@0: byte cur_rule; truelight@0: byte unk6; truelight@0: byte unk7; truelight@0: byte buildcmd_a; truelight@0: byte buildcmd_b; truelight@0: byte direction; truelight@0: byte cargo; truelight@0: byte unused[8]; truelight@0: } GCC_PACK OldAiBuildRec; truelight@0: assert_compile(sizeof(OldAiBuildRec) == 0x14); truelight@0: truelight@0: typedef struct { truelight@0: uint16 tile; truelight@0: byte data; truelight@0: } GCC_PACK OldAiBannedTile; truelight@0: assert_compile(sizeof(OldAiBannedTile) == 3); truelight@0: truelight@0: typedef struct { truelight@0: uint16 name_1; truelight@0: uint32 name_2; truelight@0: uint32 face; truelight@0: uint16 pres_name_1; truelight@0: uint32 pres_name_2; truelight@0: uint32 money; truelight@0: uint32 loan; truelight@0: byte color; truelight@0: byte money_fract; truelight@0: byte quarters_of_bankrupcy; truelight@0: byte bankrupt_asked; truelight@0: uint32 bankrupt_value; truelight@0: uint16 bankrupt_timeout; truelight@0: uint32 cargo_types; truelight@0: OldPlayerExpenses expenses[3]; truelight@0: OldPlayerEconomy economy[24 + 1]; truelight@0: uint16 inaugurated_date; truelight@0: uint16 last_build_coordinate; truelight@0: byte num_valid_stat_ent; truelight@0: byte ai_state; truelight@0: byte unused; truelight@0: byte ai_state_mode; truelight@0: uint16 ai_state_counter; truelight@0: uint16 ai_timeout_counter; truelight@0: OldAiBuildRec ai_src, ai_dst, ai_mid1, ai_mid2; truelight@0: byte unused_2[20]; truelight@0: byte ai_cargo_type; truelight@0: byte ai_num_wagons; truelight@0: byte ai_build_kind; truelight@0: byte ai_num_build_rec; truelight@0: byte ai_num_loco_to_build; truelight@0: byte ai_num_want_fullload; truelight@0: byte unused_3[14]; truelight@0: uint16 ai_loco_id; // NOT USED truelight@0: uint16 ai_wagonlist[9]; truelight@0: byte ai_order_list_blocks[20]; truelight@0: uint16 ai_start_tile_a; truelight@0: uint16 ai_start_tile_b; truelight@0: uint16 ai_cur_tile_a; truelight@0: uint16 ai_cur_tile_b; truelight@0: byte ai_start_dir_a; truelight@0: byte ai_start_dir_b; truelight@0: byte ai_cur_dir_a; truelight@0: byte ai_cur_dir_b; truelight@0: byte ai_banned_tile_count; truelight@0: OldAiBannedTile banned_tiles[16]; truelight@0: byte ai_railtype_to_use; truelight@0: byte ai_route_type_mask; truelight@0: byte block_preview; truelight@0: byte ai_tick; truelight@0: byte max_railtype; truelight@0: uint16 location_of_house; truelight@0: byte share_owners[4]; truelight@0: uint32 unk3AA; truelight@0: uint32 unk3AE; truelight@0: } GCC_PACK OldPlayer; truelight@0: assert_compile(sizeof(OldPlayer) == 0x3B2); truelight@0: truelight@0: typedef struct { truelight@0: byte track; truelight@0: byte force_proceed; truelight@0: uint16 crash_anim_pos; truelight@0: byte railtype; truelight@0: } GCC_PACK OldVehicleRailUnion; truelight@0: assert_compile(sizeof(OldVehicleRailUnion) == 5); truelight@0: truelight@0: typedef struct { truelight@0: byte unk0; truelight@0: byte targetairport; truelight@0: uint16 crashed_counter; truelight@0: byte state; truelight@0: } GCC_PACK OldVehicleAirUnion; truelight@0: assert_compile(sizeof(OldVehicleAirUnion) == 5); truelight@0: truelight@0: typedef struct { truelight@0: byte state; truelight@0: byte frame; truelight@0: uint16 unk2; truelight@0: byte overtaking; truelight@0: byte overtaking_ctr; truelight@0: uint16 crashed_ctr; truelight@0: byte reverse_ctr; truelight@0: } GCC_PACK OldVehicleRoadUnion; truelight@0: assert_compile(sizeof(OldVehicleRoadUnion) == 9); truelight@0: truelight@0: typedef struct { truelight@0: uint16 unk0; truelight@0: byte unk2; truelight@0: } GCC_PACK OldVehicleSpecialUnion; truelight@0: assert_compile(sizeof(OldVehicleSpecialUnion) == 3); truelight@0: truelight@0: typedef struct { truelight@0: uint16 image_override; truelight@0: uint16 unk2; truelight@0: } GCC_PACK OldVehicleDisasterUnion; truelight@0: assert_compile(sizeof(OldVehicleDisasterUnion) == 4); truelight@0: truelight@0: typedef struct { truelight@0: byte state; darkvater@875: } GCC_PACK OldVehicleShipUnion; truelight@0: assert_compile(sizeof(OldVehicleShipUnion) == 1); truelight@0: truelight@0: typedef union { truelight@0: OldVehicleRailUnion rail; truelight@0: OldVehicleAirUnion air; truelight@0: OldVehicleRoadUnion road; truelight@0: OldVehicleSpecialUnion special; truelight@0: OldVehicleDisasterUnion disaster; truelight@0: OldVehicleShipUnion ship; truelight@0: byte pad[10]; truelight@0: } GCC_PACK OldVehicleUnion; truelight@0: assert_compile(sizeof(OldVehicleUnion) == 10); truelight@0: truelight@0: typedef struct { truelight@0: byte type; truelight@0: byte subtype; truelight@0: uint16 next_hash; // NOLOAD, calculated automatically. truelight@0: uint16 index; // NOLOAD, calculated automatically. truelight@0: uint32 schedule_ptr; truelight@0: byte next_order, next_order_param; truelight@0: byte num_orders; truelight@0: byte cur_order_index; truelight@0: uint16 dest_tile; truelight@0: uint16 load_unload_time_rem; truelight@0: uint16 date_of_last_service; truelight@0: uint16 service_interval; truelight@0: byte last_station_visited; truelight@0: byte tick_counter; truelight@0: uint16 max_speed; truelight@0: uint16 x_pos, y_pos; truelight@0: byte z_pos; truelight@0: byte direction; truelight@0: byte x_offs, y_offs; truelight@0: byte sprite_width, sprite_height, z_height; truelight@0: byte owner; truelight@0: uint16 tile; truelight@0: uint16 cur_image; truelight@193: truelight@0: int16 left_coord, right_coord, top_coord, bottom_coord; // NOLOAD, calculated automatically. truelight@0: uint16 vehstatus; truelight@0: uint16 cur_speed; truelight@0: byte subspeed; truelight@0: byte acceleration; truelight@0: byte progress; truelight@0: byte cargo_type; truelight@0: uint16 capacity; truelight@0: uint16 number_of_pieces; truelight@0: byte source_of_pieces; truelight@0: byte days_in_transit; truelight@0: uint16 age_in_days, max_age_in_days; truelight@0: byte build_year; truelight@0: byte unitnumber; truelight@0: uint16 engine_type; truelight@0: byte spritenum; truelight@0: byte day_counter; truelight@0: byte breakdowns_since_last_service; truelight@0: byte breakdown_ctr, breakdown_delay, breakdown_chance; truelight@0: uint16 reliability, reliability_spd_dec; truelight@0: uint32 profit_this_year, profit_last_year; truelight@0: uint16 next_in_chain; truelight@0: uint32 value; truelight@0: uint16 string_id; truelight@0: OldVehicleUnion u; truelight@0: byte unused[20]; truelight@0: } GCC_PACK OldVehicle; truelight@0: assert_compile(sizeof(OldVehicle) == 0x80); truelight@0: truelight@0: typedef struct { truelight@0: byte name[32]; truelight@0: } GCC_PACK OldName; truelight@0: truelight@0: typedef struct { truelight@0: uint16 text; truelight@0: int16 x,y,z; truelight@0: byte namewidth_1, namewidth_2; truelight@0: int16 sign_left, sign_top; truelight@0: } GCC_PACK OldSign; truelight@0: assert_compile(sizeof(OldSign) == 0xE); truelight@0: truelight@0: typedef struct { truelight@0: uint16 player_avail; truelight@0: uint16 intro_date; truelight@0: uint16 age; truelight@0: uint16 reliability, reliability_spd_dec, reliability_start, reliability_max, reliability_final; truelight@0: uint16 duration_phase_1, duration_phase_2, duration_phase_3; truelight@0: byte lifelength; truelight@0: byte flags; truelight@0: byte preview_player; truelight@0: byte preview_wait; truelight@0: byte railtype; truelight@0: byte unk1B; truelight@0: } GCC_PACK OldEngine; truelight@0: assert_compile(sizeof(OldEngine) == 0x1C); truelight@0: truelight@0: typedef struct { truelight@0: byte cargo_type; truelight@0: byte age; truelight@0: byte from; truelight@0: byte to; truelight@0: } GCC_PACK OldSubsidy; truelight@0: assert_compile(sizeof(OldSubsidy) == 4); truelight@0: truelight@0: typedef struct { truelight@0: uint16 max_no_competitors; truelight@0: uint16 competitor_start_time; truelight@0: uint16 number_towns; truelight@0: uint16 number_industries; truelight@0: uint16 max_loan; truelight@0: uint16 initial_interest; truelight@0: uint16 vehicle_costs; truelight@0: uint16 competitor_speed; truelight@0: uint16 competitor_intelligence; truelight@0: uint16 vehicle_breakdowns; truelight@0: uint16 subsidy_multiplier; truelight@0: uint16 construction_cost; truelight@0: uint16 terrain_type; truelight@0: uint16 quantity_sea_lakes; truelight@0: uint16 economy; truelight@0: uint16 line_reverse_mode; truelight@0: uint16 disasters; truelight@0: } GCC_PACK OldGameSettings; truelight@0: assert_compile(sizeof(OldGameSettings) == 0x22); truelight@0: truelight@0: typedef struct { truelight@0: uint16 date; truelight@0: uint16 date_fract; truelight@0: truelight@0: OldTextEffect te_list[30]; // NOLOAD: not so important. truelight@0: uint32 seed_1, seed_2; truelight@0: truelight@0: OldTown town_list[70]; truelight@0: uint16 order_list[5000]; truelight@0: truelight@0: uint16 animated_tile_list[256]; truelight@0: uint32 ptr_to_next_order; truelight@0: OldDepot depots[255]; truelight@0: truelight@0: uint32 cur_town_ptr; truelight@0: uint16 timer_counter; truelight@0: uint16 land_code; // NOLOAD: never needed in game truelight@0: uint16 age_cargo_skip_counter; truelight@0: uint16 tick_counter; truelight@0: uint16 cur_tileloop_tile; truelight@193: truelight@0: OldPrice prices[49]; truelight@0: OldPaymentRate cargo_payment_rates[12]; truelight@193: truelight@0: byte map_owner[256*256]; truelight@0: byte map2[256*256]; truelight@0: uint16 map3[256*256]; truelight@0: byte map_extra[256*256/4]; truelight@193: truelight@0: OldStation stations[250]; truelight@0: OldIndustry industries[90]; truelight@0: OldPlayer players[8]; truelight@0: OldVehicle vehicles[850]; truelight@0: OldName names[500]; truelight@193: truelight@0: uint16 vehicle_position_hash[0x1000]; // NOLOAD, calculated automatically. truelight@0: truelight@0: OldSign signs[40]; truelight@0: OldEngine engines[256]; truelight@0: truelight@0: uint16 vehicle_id_ctr_day; truelight@0: OldSubsidy subsidies[8]; truelight@0: truelight@0: uint16 next_competitor_start; truelight@0: truelight@0: uint16 saved_main_scrollpos_x, saved_main_scrollpos_y, saved_main_scrollpos_zoom; truelight@0: uint32 maximum_loan, maximum_loan_unround; truelight@0: uint16 economy_fluct; truelight@0: uint16 disaster_delay; truelight@0: truelight@0: //NOLOAD. These are calculated from InitializeLandscapeVariables truelight@0: uint16 cargo_names_s[12], cargo_names_p[12], cargo_names_long_s[12], cargo_names_long_p[12], cargo_names_short[12]; truelight@0: uint16 cargo_sprites[12]; truelight@0: truelight@0: uint16 engine_name_strings[256]; truelight@193: truelight@0: //NOLOAD. These are calculated from InitializeLandscapeVariables truelight@0: uint16 railveh_by_cargo_1[12], railveh_by_cargo_2[12], railveh_by_cargo_3[12]; truelight@0: uint16 roadveh_by_cargo_start[12]; truelight@0: byte roadveh_by_cargo_count[12]; truelight@0: uint16 ship_of_type_start[12]; truelight@0: byte ship_of_type_count[12]; truelight@0: truelight@0: byte human_player_1, human_player_2; //NOLOAD. Calculated automatically. truelight@0: byte station_tick_ctr; truelight@0: byte currency; truelight@0: byte use_kilometers; truelight@0: byte cur_player_tick_index; truelight@0: byte cur_year, cur_month; //NOLOAD. Calculated automatically. truelight@0: byte player_colors[8]; //NOLOAD. Calculated automatically truelight@0: truelight@0: byte inflation_amount; truelight@0: byte inflation_amount_payment_rates; truelight@0: byte interest_rate; truelight@0: truelight@0: byte avail_aircraft; truelight@0: byte road_side; truelight@0: byte town_name_type; truelight@0: OldGameSettings game_diff; truelight@0: byte difficulty_level; truelight@0: byte landscape_type; truelight@0: byte trees_tick_ctr; truelight@0: byte vehicle_design_names; truelight@0: byte snow_line_height; truelight@0: truelight@0: byte new_industry_randtable[32]; // NOLOAD. Not needed due to different code design. truelight@193: truelight@0: //NOLOAD. Initialized by InitializeLandscapeVariables truelight@193: byte cargo_weights[12]; truelight@0: byte transit_days_table_1[12]; truelight@0: byte transit_days_table_2[12]; truelight@0: truelight@0: byte map_type_and_height[256*256]; truelight@0: byte map5[256*256]; truelight@0: } GCC_PACK OldMain; truelight@0: assert_compile(sizeof(OldMain) == 487801 + 256*256*2); truelight@0: truelight@923: #if defined(_MSC_VER) || defined(__WATCOMC__) truelight@0: #pragma pack(pop) truelight@0: #endif truelight@0: truelight@0: #define REMAP_TOWN_IDX(x) (x - (0x0459154 - 0x0458EF0)) / sizeof(OldTown) truelight@919: #define REMAP_TOWN_PTR(x) GetTown( REMAP_TOWN_IDX(x) ) truelight@0: truelight@0: #define REMAP_ORDER_IDX(x) (x - (0x045AB08 - 0x0458EF0)) / sizeof(uint16) truelight@0: truelight@0: typedef struct LoadSavegameState { truelight@0: int8 mode; truelight@0: byte rep_char; truelight@0: truelight@0: size_t count; truelight@0: size_t buffer_count; truelight@0: FILE *fin; truelight@0: truelight@0: byte *buffer_cur; truelight@0: truelight@0: byte buffer[4096]; truelight@0: truelight@0: } LoadSavegameState; truelight@0: truelight@0: static LoadSavegameState *_cur_state; truelight@0: truelight@0: static byte GetSavegameByteFromBuffer() truelight@0: { truelight@0: LoadSavegameState *lss = _cur_state; truelight@0: truelight@0: if (lss->buffer_count == 0) { truelight@0: int count = fread(lss->buffer, 1, 4096, lss->fin) ; truelight@0: /* if (count == 0) { truelight@0: memset(lss->buffer, 0, sizeof(lss->buffer)); truelight@0: count = 4096; truelight@0: }*/ truelight@0: assert(count != 0); truelight@0: lss->buffer_count = count; truelight@0: lss->buffer_cur = lss->buffer; truelight@0: } truelight@0: truelight@0: lss->buffer_count--; truelight@0: return *lss->buffer_cur++; truelight@0: } truelight@0: truelight@0: static byte DecodeSavegameByte() truelight@0: { truelight@0: LoadSavegameState *lss = _cur_state; truelight@0: int8 x; truelight@0: truelight@0: if (lss->mode < 0) { truelight@0: if (lss->count != 0) { truelight@0: lss->count--; truelight@0: return lss->rep_char; truelight@0: } truelight@0: } else if (lss->mode > 0) { truelight@0: if (lss->count != 0) { truelight@0: lss->count--; truelight@0: return GetSavegameByteFromBuffer(); truelight@0: } truelight@0: } truelight@193: truelight@0: x = GetSavegameByteFromBuffer(); truelight@0: if (x >= 0) { truelight@0: lss->count = x; truelight@0: lss->mode = 1; truelight@0: return GetSavegameByteFromBuffer(); truelight@0: } else { truelight@0: lss->mode = -1; truelight@0: lss->count = -x; truelight@0: lss->rep_char = GetSavegameByteFromBuffer(); truelight@0: return lss->rep_char; truelight@193: } truelight@0: } truelight@0: truelight@0: static void LoadSavegameBytes(void *p, size_t count) truelight@0: { truelight@0: byte *ptr = (byte*)p; truelight@0: assert(count > 0); truelight@0: do { truelight@0: *ptr++ = DecodeSavegameByte(); truelight@0: } while (--count); truelight@0: } truelight@0: darkvater@4: extern uint32 GetOldTownName(uint32 townnameparts, byte old_town_name_type); darkvater@4: truelight@919: static void FixTown(OldTown *o, int num, byte town_name_type) truelight@0: { truelight@919: Town *t; darkvater@920: uint i = 0; truelight@919: truelight@0: do { truelight@919: t = GetTown(i); truelight@919: truelight@0: t->xy = o->xy; truelight@0: t->population = o->population; truelight@0: t->townnametype = o->townnametype; truelight@0: t->townnameparts = o->townnameparts; darkvater@4: // Random TownNames darkvater@4: if (IS_INT_INSIDE(o->townnametype, 0x20C1, 0x20C2 + 1)) { darkvater@4: t->townnametype = SPECSTR_TOWNNAME_ENGLISH + town_name_type; darkvater@4: if (o->xy) darkvater@4: t->townnameparts = GetOldTownName(o->townnameparts, town_name_type); darkvater@4: } truelight@0: truelight@0: t->grow_counter = o->grow_counter; truelight@0: t->flags12 = o->flags12; truelight@0: memcpy(t->ratings,o->ratings,sizeof(t->ratings)); truelight@0: t->have_ratings = o->have_ratings; truelight@0: t->statues = o->statues; truelight@0: t->num_houses = o->num_houses; truelight@0: t->time_until_rebuild = o->time_until_rebuild; truelight@0: t->growth_rate = o->growth_rate; truelight@0: t->new_max_pass = o->new_max_pass; truelight@0: t->new_max_mail = o->new_max_mail; truelight@0: t->new_act_pass = o->new_act_pass; truelight@0: t->new_act_mail = o->new_act_mail; truelight@0: t->max_pass = o->max_pass; truelight@0: t->max_mail = o->max_mail; truelight@0: t->act_pass = o->act_pass; truelight@0: t->act_mail = o->act_mail; truelight@0: t->pct_pass_transported = o->pct_pass_transported; truelight@0: t->pct_mail_transported = o->pct_mail_transported; truelight@0: t->new_act_food = o->new_act_food; darkvater@4: t->new_act_water = o->new_act_water; truelight@0: t->act_food = o->act_food; darkvater@4: t->act_water = o->act_water; truelight@0: t->road_build_months = o->road_build_months; truelight@0: t->fund_buildings_months = o->fund_buildings_months; truelight@919: } while (i++,o++,--num); truelight@0: } truelight@0: truelight@919: static void FixIndustry(OldIndustry *o, int num) truelight@0: { truelight@919: Industry *i; truelight@919: uint j = 0; truelight@919: truelight@0: do { truelight@919: i = GetIndustry(j); truelight@919: truelight@0: i->xy = o->xy; truelight@0: i->town = REMAP_TOWN_PTR(o->town); truelight@0: i->width = o->width; truelight@0: i->height = o->height; truelight@0: i->produced_cargo[0] = o->produced_cargo[0]; truelight@0: i->produced_cargo[1] = o->produced_cargo[1]; truelight@0: i->cargo_waiting[0] = o->cargo_waiting[0]; truelight@0: i->cargo_waiting[1] = o->cargo_waiting[1]; truelight@0: i->production_rate[0] = o->production_rate[0]; truelight@0: i->production_rate[1] = o->production_rate[1]; truelight@0: i->accepts_cargo[0] = o->accepts_cargo[0]; truelight@0: i->accepts_cargo[1] = o->accepts_cargo[1]; truelight@0: i->accepts_cargo[2] = o->accepts_cargo[2]; truelight@0: i->prod_level = o->prod_level; truelight@0: i->last_mo_production[0] = o->last_mo_production[0]; truelight@0: i->last_mo_production[1] = o->last_mo_production[1]; truelight@193: truelight@0: i->last_mo_transported[0] = o->last_mo_transported[0]; truelight@0: i->last_mo_transported[1] = o->last_mo_transported[1]; truelight@0: i->last_mo_transported[2] = o->last_mo_transported[2]; truelight@0: truelight@0: i->pct_transported[0] = o->pct_transported[0]; truelight@0: i->pct_transported[1] = o->pct_transported[1]; truelight@0: truelight@0: i->total_production[0] = o->total_production[0]; truelight@0: i->total_production[1] = o->total_production[1]; truelight@193: truelight@0: i->total_transported[0] = i->total_transported[0]; truelight@0: i->total_transported[1] = i->total_transported[1]; truelight@0: truelight@0: i->type = o->type; truelight@0: i->owner = o->owner; truelight@0: i->color_map = o->color_map; truelight@0: i->last_prod_year = o->last_prod_year; truelight@0: i->counter = o->counter; truelight@0: i->was_cargo_delivered = o->was_cargo_delivered; truelight@919: } while (j++,o++,--num); truelight@0: } truelight@0: truelight@0: static void FixGoodsEntry(GoodsEntry *g, OldGoodsEntry *o, int num) truelight@0: { truelight@0: do { truelight@0: g->waiting_acceptance = o->waiting_acceptance; truelight@0: g->days_since_pickup = o->days_since_pickup; truelight@0: g->rating = o->rating; truelight@0: g->enroute_from = o->enroute_from; truelight@0: g->enroute_time = o->enroute_time; truelight@0: g->last_speed = o->last_speed; truelight@0: g->last_age = o->last_age; truelight@0: } while (g++,o++,--num); truelight@0: } truelight@0: truelight@919: static void FixStation(OldStation *o, int num) truelight@0: { truelight@919: Station *s; truelight@919: uint i = 0; truelight@919: truelight@0: do { truelight@919: s = GetStation(i); truelight@919: truelight@0: s->xy = o->xy; truelight@0: s->town = REMAP_TOWN_PTR(o->town); truelight@0: s->bus_tile = o->bus_tile; truelight@0: s->lorry_tile = o->lorry_tile; truelight@0: s->train_tile = o->train_tile; truelight@0: s->airport_tile = o->airport_tile; truelight@0: s->dock_tile = o->dock_tile; truelight@193: truelight@0: if (o->train_tile) { truelight@0: int w = (o->platforms >> 3) & 0x7; truelight@0: int h = (o->platforms & 0x7); truelight@0: if (_map5[o->train_tile]&1) intswap(w,h); truelight@0: s->trainst_w = w; truelight@0: s->trainst_h = h; truelight@0: } truelight@193: truelight@0: s->string_id = RemapOldStringID(o->string_id); truelight@0: s->had_vehicle_of_type = o->had_vehicle_of_type; truelight@0: FixGoodsEntry(s->goods, o->goods, lengthof(o->goods)); truelight@0: s->time_since_load = o->time_since_load; truelight@0: s->time_since_unload = o->time_since_unload; truelight@0: s->delete_ctr = o->delete_ctr; truelight@0: s->owner = o->owner; truelight@0: s->facilities = o->facilities; truelight@0: s->airport_type = o->airport_type; truelight@0: s->truck_stop_status = o->truck_stop_status; truelight@0: s->bus_stop_status = o->bus_stop_status; dominik@123: s->blocked_months_obsolete = o->blocked_months_obsolete; truelight@0: s->airport_flags = o->airport_flags; truelight@0: s->last_vehicle = o->last_vehicle; truelight@919: } while (i++,o++,--num); truelight@0: } truelight@0: truelight@0: static void FixDepot(Depot *n, OldDepot *o, int num) truelight@0: { truelight@0: do { truelight@0: n->town_index = REMAP_TOWN_IDX(o->town); truelight@0: n->xy = o->xy; truelight@0: } while (n++,o++,--num); truelight@0: } truelight@0: truelight@919: static void FixVehicle(OldVehicle *o, int num) truelight@0: { truelight@919: Vehicle *n; truelight@919: uint i = 0; truelight@919: truelight@0: do { truelight@919: n = GetVehicle(i); truelight@919: truelight@0: n->type = o->type; truelight@0: n->subtype = o->subtype; truelight@193: truelight@0: if (o->schedule_ptr == 0xFFFFFFFF || o->schedule_ptr == 0) { truelight@0: n->schedule_ptr = NULL; truelight@0: } else { truelight@0: n->schedule_ptr = _order_array + REMAP_ORDER_IDX(o->schedule_ptr); truelight@0: assert(n->schedule_ptr >= _order_array && n->schedule_ptr < _ptr_to_next_order); truelight@0: } truelight@0: tron@555: n->current_order.type = o->next_order & 0x0f; tron@555: n->current_order.flags = o->next_order >> 4; tron@555: n->current_order.station = o->next_order_param; truelight@0: n->num_orders = o->num_orders; truelight@0: n->cur_order_index = o->cur_order_index; truelight@0: n->dest_tile = o->dest_tile; truelight@0: n->load_unload_time_rem = o->load_unload_time_rem; truelight@0: n->date_of_last_service = o->date_of_last_service; truelight@0: n->service_interval = o->service_interval; truelight@0: n->last_station_visited = o->last_station_visited; truelight@0: n->tick_counter = o->tick_counter; truelight@0: n->max_speed = o->max_speed; truelight@0: n->x_pos = o->x_pos; truelight@0: n->y_pos = o->y_pos; truelight@0: n->z_pos = o->z_pos; truelight@0: n->direction = o->direction; truelight@0: n->x_offs = o->x_offs; truelight@0: n->y_offs = o->y_offs; truelight@0: n->sprite_width = o->sprite_width; truelight@0: n->sprite_height = o->sprite_height; truelight@0: n->z_height = o->z_height; truelight@0: n->owner = o->owner; truelight@0: n->tile = o->tile; truelight@0: n->cur_image = o->cur_image; darkvater@392: if (o->cur_image >= 0x2000) // TTDPatch maps sprites from 0x2000 up. darkvater@392: n->cur_image -= 0x2000 - _custom_sprites_base; truelight@193: truelight@0: n->vehstatus = o->vehstatus; truelight@0: n->cur_speed = o->cur_speed; truelight@0: n->subspeed = o->subspeed; truelight@0: n->acceleration = o->acceleration; truelight@0: n->progress = o->progress; truelight@0: n->cargo_type = o->cargo_type; truelight@0: n->cargo_cap = o->capacity; truelight@0: n->cargo_count = o->number_of_pieces; truelight@0: n->cargo_source = o->source_of_pieces; truelight@0: n->cargo_days = o->days_in_transit; truelight@0: n->age = o->age_in_days; truelight@0: n->max_age = o->max_age_in_days; truelight@0: n->build_year = o->build_year; truelight@0: n->unitnumber = o->unitnumber; truelight@0: n->engine_type = o->engine_type; darkvater@392: switch (o->spritenum) { darkvater@392: case 0xfd: n->spritenum = 0xfd; break; darkvater@392: case 0xff: n->spritenum = 0xfe; break; darkvater@392: default: n->spritenum = o->spritenum >> 1; break; darkvater@392: } truelight@0: n->day_counter = o->day_counter; truelight@0: n->breakdowns_since_last_service = o->breakdowns_since_last_service; truelight@0: n->breakdown_ctr = o->breakdown_ctr; truelight@0: n->breakdown_delay = o->breakdown_delay; truelight@0: n->breakdown_chance = o->breakdown_chance; truelight@0: n->reliability = o->reliability; truelight@0: n->reliability_spd_dec = o->reliability_spd_dec; truelight@0: n->profit_this_year = o->profit_this_year; truelight@0: n->profit_last_year = o->profit_last_year; truelight@919: n->next = (o->next_in_chain == 0xFFFF) ? NULL : GetVehicle(o->next_in_chain); truelight@0: n->value = o->value; truelight@0: n->string_id = RemapOldStringID(o->string_id); truelight@193: truelight@0: switch(o->type) { truelight@0: case VEH_Train: truelight@0: n->u.rail.track = o->u.rail.track; truelight@0: n->u.rail.force_proceed = o->u.rail.force_proceed; truelight@0: n->u.rail.crash_anim_pos = o->u.rail.crash_anim_pos; truelight@0: n->u.rail.railtype = o->u.rail.railtype; truelight@0: break; truelight@0: truelight@0: case VEH_Road: truelight@0: n->u.road.state = o->u.road.state; truelight@0: n->u.road.frame = o->u.road.frame; truelight@0: n->u.road.unk2 = o->u.road.unk2; truelight@0: n->u.road.overtaking = o->u.road.overtaking; truelight@0: n->u.road.overtaking_ctr = o->u.road.overtaking_ctr; truelight@0: n->u.road.crashed_ctr = o->u.road.crashed_ctr; truelight@0: n->u.road.reverse_ctr = o->u.road.reverse_ctr; truelight@0: break; truelight@0: case VEH_Ship: truelight@0: n->u.ship.state = o->u.ship.state; truelight@0: break; truelight@0: case VEH_Aircraft: truelight@0: n->u.air.crashed_counter = o->u.air.crashed_counter; truelight@0: n->u.air.pos = o->u.air.unk0; truelight@0: n->u.air.targetairport = o->u.air.targetairport; truelight@0: n->u.air.state = o->u.air.state; truelight@0: break; truelight@0: case VEH_Special: truelight@0: n->u.special.unk0 = o->u.special.unk0; truelight@0: n->u.special.unk2 = o->u.special.unk2; truelight@0: n->subtype = o->subtype >> 1; truelight@0: break; truelight@0: case VEH_Disaster: truelight@0: n->u.disaster.image_override = o->u.disaster.image_override; truelight@0: n->u.disaster.unk2 = o->u.disaster.unk2; truelight@0: break; truelight@0: } truelight@919: } while (i++,o++,--num); truelight@0: } truelight@0: truelight@0: static void FixSubsidy(Subsidy *n, OldSubsidy *o, int num) truelight@0: { truelight@0: do { truelight@0: n->age = o->age; truelight@0: n->cargo_type = o->cargo_type; truelight@0: n->from = o->from; truelight@0: n->to = o->to; truelight@0: } while (n++,o++,--num); truelight@0: } truelight@0: truelight@0: static void FixEconomy(PlayerEconomyEntry *n, OldPlayerEconomy *o) truelight@0: { truelight@0: n->company_value = o->company_value; truelight@0: n->delivered_cargo = o->delivered_cargo; truelight@0: n->income = -o->income; truelight@0: n->expenses = -o->expenses; truelight@0: n->performance_history = o->performance_history; truelight@0: } truelight@0: truelight@0: static void FixAiBuildRec(AiBuildRec *n, OldAiBuildRec *o) truelight@0: { truelight@0: n->spec_tile = o->spec_tile; truelight@0: n->use_tile = o->use_tile; truelight@0: n->rand_rng = o->rand_rng; truelight@0: n->cur_building_rule = o->cur_rule; truelight@0: n->unk6 = o->unk6; truelight@0: n->unk7 = o->unk7; truelight@0: n->buildcmd_a = o->buildcmd_a; truelight@0: n->buildcmd_b = o->buildcmd_b; truelight@0: n->direction = o->direction; truelight@0: n->cargo = o->cargo; truelight@0: } truelight@0: darkvater@4: static void FixPlayer(Player *n, OldPlayer *o, int num, byte town_name_type) truelight@0: { truelight@0: int i, j; truelight@0: int x = 0; truelight@193: truelight@0: do { truelight@0: n->name_1 = RemapOldStringID(o->name_1); truelight@0: n->name_2 = o->name_2; darkvater@4: /* In every Old TTD(Patch) game Player1 (0) is human, and all others are AI darkvater@4: * (Except in .SV2 savegames, which were 2 player games, but we are not fixing darkvater@4: * that darkvater@4: */ darkvater@4: darkvater@4: if (x == 0) { darkvater@4: if (o->name_1 == 0) // if first player doesn't have a name, he is 'unnamed' darkvater@4: n->name_1 = STR_SV_UNNAMED; darkvater@4: } else { darkvater@4: n->is_ai = 1; darkvater@4: } darkvater@4: darkvater@4: if (o->name_1 != 0) darkvater@4: n->is_active = true; truelight@193: truelight@0: n->face = o->face; truelight@0: n->president_name_1 = o->pres_name_1; truelight@0: n->president_name_2 = o->pres_name_2; truelight@193: truelight@0: n->money64 = n->player_money = o->money; truelight@0: n->current_loan = o->loan; truelight@193: truelight@193: // Correct money for scenario loading. truelight@0: // It's always 893288 pounds (and no loan), if not corrected truelight@0: if(o->money==0xda168) truelight@0: n->money64 = n->player_money = n->current_loan =100000; truelight@0: truelight@0: n->player_color = o->color; truelight@0: _player_colors[x] = o->color; truelight@0: x++; truelight@0: truelight@0: n->player_money_fraction = o->money_fract; truelight@0: n->quarters_of_bankrupcy = o->quarters_of_bankrupcy; truelight@0: n->bankrupt_asked = o->bankrupt_asked; truelight@0: n->bankrupt_value = o->bankrupt_value; truelight@0: n->bankrupt_timeout = o->bankrupt_timeout; truelight@0: n->cargo_types = o->cargo_types; truelight@193: truelight@0: for(i=0; i!=3; i++) truelight@0: for(j=0; j!=13; j++) truelight@0: n->yearly_expenses[i][j] = o->expenses[i].cost[j]; truelight@0: truelight@0: FixEconomy(&n->cur_economy, &o->economy[0]); truelight@0: for(i=0; i!=24; i++) FixEconomy(&n->old_economy[i], &o->economy[i+1]); truelight@0: n->inaugurated_year = o->inaugurated_date - 1920; truelight@0: n->last_build_coordinate = o->last_build_coordinate; truelight@0: n->num_valid_stat_ent = o->num_valid_stat_ent; truelight@0: truelight@193: /* Not good, since AI doesn't have a vehicle assigned as darkvater@4: * in p->ai.cur_veh and thus will crash on certain actions. darkvater@4: * Best is to set state to AiStateVehLoop (2) darkvater@4: * n->ai.state = o->ai_state; darkvater@4: */ darkvater@4: n->ai.state = 2; truelight@0: n->ai.state_mode = o->ai_state_mode; truelight@0: n->ai.state_counter = o->ai_state_counter; truelight@0: n->ai.timeout_counter = o->ai_timeout_counter; truelight@0: n->ai.banned_tile_count = o->ai_banned_tile_count; truelight@0: n->ai.railtype_to_use = o->ai_railtype_to_use; truelight@193: truelight@0: FixAiBuildRec(&n->ai.src, &o->ai_src); truelight@0: FixAiBuildRec(&n->ai.dst, &o->ai_dst); truelight@0: FixAiBuildRec(&n->ai.mid1, &o->ai_mid1); truelight@0: FixAiBuildRec(&n->ai.mid2, &o->ai_mid2); truelight@193: truelight@0: n->ai.cargo_type = o->ai_cargo_type; truelight@0: n->ai.num_wagons = o->ai_num_wagons; truelight@0: n->ai.num_build_rec = o->ai_num_build_rec; truelight@0: n->ai.num_loco_to_build = o->ai_num_loco_to_build; truelight@0: n->ai.num_want_fullload = o->ai_num_want_fullload; truelight@193: truelight@0: for(i=0; i!=9; i++) n->ai.wagon_list[i] = o->ai_wagonlist[i]; truelight@0: memcpy(n->ai.order_list_blocks, o->ai_order_list_blocks, 20); truelight@0: n->ai.start_tile_a = o->ai_start_tile_a; truelight@0: n->ai.start_tile_b = o->ai_start_tile_b; truelight@0: n->ai.cur_tile_a = o->ai_cur_tile_a; truelight@0: n->ai.cur_tile_b = o->ai_cur_tile_b; truelight@0: n->ai.start_dir_a = o->ai_start_dir_a; truelight@0: n->ai.start_dir_b = o->ai_start_dir_b; truelight@0: n->ai.cur_dir_a = o->ai_cur_dir_a; truelight@0: n->ai.cur_dir_b = o->ai_cur_dir_b; truelight@193: truelight@0: for(i=0; i!=16; i++) { truelight@0: n->ai.banned_tiles[i] = o->banned_tiles[i].tile; truelight@0: n->ai.banned_val[i] = o->banned_tiles[i].data; truelight@0: } truelight@0: truelight@0: n->ai.build_kind = o->ai_build_kind; truelight@0: n->ai.route_type_mask = o->ai_route_type_mask; truelight@0: n->ai.tick = o->ai_tick; truelight@0: truelight@0: n->block_preview = o->block_preview; truelight@0: n->max_railtype = (o->max_railtype == 0) ? 1 : o->max_railtype; truelight@0: n->location_of_house = o->location_of_house; truelight@0: if (o->location_of_house == 0xFFFF) n->location_of_house = 0; truelight@0: truelight@0: n->share_owners[0] = o->share_owners[0]; truelight@0: n->share_owners[1] = o->share_owners[1]; truelight@0: n->share_owners[2] = o->share_owners[2]; truelight@0: n->share_owners[3] = o->share_owners[3]; truelight@0: truelight@0: if (o->ai_state == 2) { truelight@0: n->ai.cur_veh = NULL; truelight@0: } truelight@0: } while (n++,o++,--num); truelight@0: } truelight@0: truelight@0: static void FixName(OldName *o, int num) truelight@0: { truelight@0: int i; truelight@0: for(i=0; i!=num; i++) { truelight@0: memcpy(_name_array[i], o[i].name, sizeof(o[i].name)); truelight@0: } truelight@0: } truelight@0: truelight@0: static void FixSign(SignStruct *n, OldSign *o, int num) truelight@0: { truelight@0: do { truelight@0: n->str = o->text; truelight@0: n->x = o->x; truelight@0: n->y = o->y; truelight@0: n->z = o->z; truelight@0: } while (n++,o++,--num); truelight@0: } truelight@0: truelight@0: static void FixEngine(Engine *n, OldEngine *o, int num) truelight@0: { truelight@0: int i = 0; truelight@0: truelight@0: do { truelight@0: n->player_avail = o->player_avail; truelight@0: n->intro_date = o->intro_date; truelight@0: n->age = o->age; truelight@0: if ((i >= 27 && i < 54) || (i >= 57 && i < 84) || (i >= 89 && i < 116)) truelight@0: n->age = 0xffff; truelight@0: n->reliability = o->reliability; truelight@0: n->reliability_spd_dec = o->reliability_spd_dec; truelight@0: n->reliability_start = o->reliability_start; truelight@0: n->reliability_max = o->reliability_max; truelight@0: n->reliability_final = o->reliability_final; truelight@0: n->duration_phase_1 = o->duration_phase_1; truelight@0: n->duration_phase_2 = o->duration_phase_2; truelight@0: n->duration_phase_3 = o->duration_phase_3; truelight@0: n->lifelength = o->lifelength; truelight@0: n->flags = o->flags; truelight@0: n->preview_player = o->preview_player; truelight@0: n->preview_wait = o->preview_wait; truelight@0: n->railtype = o->railtype; truelight@0: } while (n++,o++,i++,--num); truelight@0: } truelight@0: tron@410: static void FixGameDifficulty(GameDifficulty *n, OldGameSettings *o) truelight@0: { truelight@0: n->max_no_competitors = o->max_no_competitors; truelight@0: n->competitor_start_time = o->competitor_start_time; truelight@0: n->number_towns = o->number_towns; truelight@0: n->number_industries = o->number_industries; truelight@0: n->max_loan = o->max_loan; truelight@0: n->initial_interest = o->initial_interest; truelight@0: n->vehicle_costs = o->vehicle_costs; truelight@0: n->competitor_speed = o->competitor_speed; truelight@0: n->competitor_intelligence = o->competitor_intelligence; truelight@0: n->vehicle_breakdowns = o->vehicle_breakdowns; truelight@0: n->subsidy_multiplier = o->subsidy_multiplier; truelight@0: n->construction_cost = o->construction_cost; truelight@0: n->terrain_type = o->terrain_type; truelight@0: n->quantity_sea_lakes = o->quantity_sea_lakes; truelight@0: n->economy = o->economy; truelight@0: n->line_reverse_mode = o->line_reverse_mode; truelight@0: n->disasters = o->disasters; truelight@0: } truelight@0: darkvater@436: #ifdef TTD_BIG_ENDIAN darkvater@436: /* This function fixes the endiannes issues on Big Endian machines. darkvater@436: * Obviously only uint16 (WORD) and uint32 (LONG WORD) 's are fixed darkvater@436: * since these are different on Big Endian machines. A single byte has darkvater@436: * the same ordening */ darkvater@436: static void FixEndianness(OldMain *m) darkvater@436: { darkvater@436: int i; darkvater@436: m->date = BSWAP16(m->date); darkvater@436: m->date_fract = BSWAP16(m->date_fract); darkvater@436: m->seed_1 = BSWAP32(m->seed_1); darkvater@436: m->seed_2 = BSWAP32(m->seed_2); darkvater@436: darkvater@436: /* ----------- TOWNS ----------- */ darkvater@436: for (i = 0; i < 70; i++) { // OldTown town_list[70]; darkvater@436: int j; darkvater@436: m->town_list[i].xy = BSWAP16(m->town_list[i].xy); darkvater@436: m->town_list[i].population = BSWAP16(m->town_list[i].population); darkvater@436: m->town_list[i].townnametype = BSWAP16(m->town_list[i].townnametype); darkvater@436: m->town_list[i].townnameparts = BSWAP32(m->town_list[i].townnameparts); darkvater@436: m->town_list[i].sign_left = BSWAP16(m->town_list[i].sign_left); darkvater@436: m->town_list[i].sign_top = BSWAP16(m->town_list[i].sign_top); darkvater@436: m->town_list[i].flags12 = BSWAP16(m->town_list[i].flags12); darkvater@436: for (j = 0; j < 5; j++) // uint16 radius[5]; darkvater@436: m->town_list[i].radius[j] = BSWAP16(m->town_list[i].radius[j]); darkvater@436: for (j = 0; j < 8; j++) // uint16 ratings[8]; darkvater@436: m->town_list[i].ratings[j] = BSWAP16(m->town_list[i].ratings[j]); darkvater@436: m->town_list[i].have_ratings = BSWAP32(m->town_list[i].have_ratings); darkvater@436: m->town_list[i].statues = BSWAP32(m->town_list[i].statues); darkvater@436: m->town_list[i].num_houses = BSWAP16(m->town_list[i].num_houses); darkvater@436: m->town_list[i].new_max_pass = BSWAP16(m->town_list[i].new_max_pass); darkvater@436: m->town_list[i].new_max_mail = BSWAP16(m->town_list[i].new_max_mail); darkvater@436: m->town_list[i].new_act_pass = BSWAP16(m->town_list[i].new_act_pass); darkvater@436: m->town_list[i].new_act_mail = BSWAP16(m->town_list[i].new_act_mail); darkvater@436: m->town_list[i].max_pass = BSWAP16(m->town_list[i].max_pass); darkvater@436: m->town_list[i].max_mail = BSWAP16(m->town_list[i].max_mail); darkvater@436: m->town_list[i].act_pass = BSWAP16(m->town_list[i].act_pass); darkvater@436: m->town_list[i].act_mail = BSWAP16(m->town_list[i].act_mail); darkvater@436: m->town_list[i].new_act_food = BSWAP16(m->town_list[i].new_act_food); darkvater@436: m->town_list[i].new_act_water = BSWAP16(m->town_list[i].new_act_water); darkvater@436: m->town_list[i].act_food = BSWAP16(m->town_list[i].act_food); darkvater@436: m->town_list[i].act_water = BSWAP16(m->town_list[i].act_water); darkvater@436: m->town_list[i].unk56 = BSWAP32(m->town_list[i].unk56); darkvater@436: m->town_list[i].unk5A = BSWAP32(m->town_list[i].unk5A); darkvater@436: } darkvater@436: darkvater@436: /* ----------- ORDER LIST ----------- */ darkvater@436: for (i = 0; i < 5000; i++) // uint16 order_list[5000]; darkvater@436: m->order_list[i] = BSWAP16(m->order_list[i]); darkvater@436: darkvater@436: /* ----------- ANIMATED TILE LIST ----------- */ darkvater@436: for (i = 0; i < 256; i++) // uint16 animated_tile_list[256]; darkvater@436: m->animated_tile_list[i] = BSWAP16(m->animated_tile_list[i]); darkvater@436: darkvater@436: m->ptr_to_next_order = BSWAP32(m->ptr_to_next_order); darkvater@436: darkvater@436: /* ----------- DEPOTS ----------- */ darkvater@436: for (i = 0; i < 255; i++) { // OldDepot depots[255]; darkvater@436: m->depots[i].xy = BSWAP16(m->depots[i].xy); darkvater@436: m->depots[i].town = BSWAP32(m->depots[i].town); darkvater@436: } darkvater@436: darkvater@436: m->cur_town_ptr = BSWAP32(m->cur_town_ptr); darkvater@436: m->timer_counter = BSWAP16(m->timer_counter); darkvater@436: m->land_code = BSWAP16(m->land_code); darkvater@436: m->age_cargo_skip_counter = BSWAP16(m->age_cargo_skip_counter); darkvater@436: m->tick_counter = BSWAP16(m->tick_counter); darkvater@436: m->cur_tileloop_tile = BSWAP16(m->cur_tileloop_tile); darkvater@436: darkvater@436: /* ----------- PRICES ----------- */ darkvater@436: for (i = 0; i < 49; i++) { // OldPrice prices[49]; darkvater@436: m->prices[i].price = BSWAP32(m->prices[i].price); darkvater@436: m->prices[i].frac = BSWAP16(m->prices[i].frac); darkvater@436: } darkvater@436: darkvater@436: /* ----------- CARGO PAYMENT RATES ----------- */ darkvater@436: for (i = 0; i < 12; i++) { // OldPaymentRate cargo_payment_rates[12]; darkvater@436: m->cargo_payment_rates[i].price = BSWAP32(m->cargo_payment_rates[i].price); darkvater@436: m->cargo_payment_rates[i].frac = BSWAP16(m->cargo_payment_rates[i].frac); darkvater@436: m->cargo_payment_rates[i].unused = BSWAP16(m->cargo_payment_rates[i].unused); darkvater@436: } darkvater@436: darkvater@436: /* ----------- MAP3 ----------- */ darkvater@436: for (i = 0; i < (256*256); i++) // uint16 map3[256*256]; darkvater@436: m->map3[i] = BSWAP16(m->map3[i]); darkvater@436: darkvater@436: /* ----------- STATIONS ----------- */ darkvater@436: for (i = 0; i < 250; i++) { // OldStation stations[250]; darkvater@436: int j; darkvater@436: m->stations[i].xy = BSWAP16(m->stations[i].xy); darkvater@436: m->stations[i].town = BSWAP32(m->stations[i].town); darkvater@436: m->stations[i].bus_tile = BSWAP16(m->stations[i].bus_tile); darkvater@436: m->stations[i].lorry_tile = BSWAP16(m->stations[i].lorry_tile); darkvater@436: m->stations[i].train_tile = BSWAP16(m->stations[i].train_tile); darkvater@436: m->stations[i].airport_tile = BSWAP16(m->stations[i].airport_tile); darkvater@436: m->stations[i].dock_tile = BSWAP16(m->stations[i].dock_tile); darkvater@436: m->stations[i].string_id = BSWAP16(m->stations[i].string_id); darkvater@436: m->stations[i].sign_left = BSWAP16(m->stations[i].sign_left); darkvater@436: m->stations[i].sign_top = BSWAP16(m->stations[i].sign_top); darkvater@436: m->stations[i].had_vehicle_of_type = BSWAP16(m->stations[i].had_vehicle_of_type); darkvater@436: for (j = 0; j < 12; j++) // OldGoodsEntry goods[12]; darkvater@436: m->stations[i].goods[j].waiting_acceptance = BSWAP16(m->stations[i].goods[j].waiting_acceptance); darkvater@436: m->stations[i].airport_flags = BSWAP16(m->stations[i].airport_flags); darkvater@436: m->stations[i].last_vehicle = BSWAP16(m->stations[i].last_vehicle); darkvater@436: m->stations[i].unk8A = BSWAP32(m->stations[i].unk8A); darkvater@436: } darkvater@436: darkvater@436: /* ----------- INDUSTRIES ----------- */ darkvater@436: for (i = 0; i < 90; i++) { // OldIndustry industries[90]; darkvater@436: m->industries[i].xy = BSWAP16(m->industries[i].xy); darkvater@436: m->industries[i].town = BSWAP32(m->industries[i].town); darkvater@436: m->industries[i].cargo_waiting[0] = BSWAP16(m->industries[i].cargo_waiting[0]); darkvater@436: m->industries[i].cargo_waiting[1] = BSWAP16(m->industries[i].cargo_waiting[1]); darkvater@436: darkvater@436: m->industries[i].last_mo_production[0] = BSWAP16(m->industries[i].last_mo_production[0]); darkvater@436: m->industries[i].last_mo_production[1] = BSWAP16(m->industries[i].last_mo_production[1]); darkvater@436: darkvater@436: m->industries[i].last_mo_transported[0] = BSWAP16(m->industries[i].last_mo_transported[0]); darkvater@436: m->industries[i].last_mo_transported[1] = BSWAP16(m->industries[i].last_mo_transported[1]); darkvater@436: darkvater@436: m->industries[i].total_production[0] = BSWAP16(m->industries[i].total_production[0]); darkvater@436: m->industries[i].total_production[1] = BSWAP16(m->industries[i].total_production[1]); darkvater@436: darkvater@436: m->industries[i].total_transported[0] = BSWAP16(m->industries[i].total_transported[0]); darkvater@436: m->industries[i].total_transported[1] = BSWAP16(m->industries[i].total_transported[1]); darkvater@436: m->industries[i].counter = BSWAP16(m->industries[i].counter); darkvater@436: m->industries[i].unk2E = BSWAP32(m->industries[i].unk2E); darkvater@436: m->industries[i].unk32 = BSWAP32(m->industries[i].unk32); darkvater@436: } darkvater@436: darkvater@436: /* ----------- PLAYERS ----------- */ darkvater@436: for (i = 0; i < 8; i++) { // OldPlayer players[8]; darkvater@436: int j, k; darkvater@436: m->players[i].name_1 = BSWAP16(m->players[i].name_1); darkvater@436: m->players[i].name_2 = BSWAP32(m->players[i].name_2); darkvater@436: m->players[i].face = BSWAP32(m->players[i].face); darkvater@436: m->players[i].pres_name_1 = BSWAP16(m->players[i].pres_name_1); darkvater@436: m->players[i].pres_name_2 = BSWAP32(m->players[i].pres_name_2); darkvater@436: m->players[i].money = BSWAP32(m->players[i].money); darkvater@436: m->players[i].loan = BSWAP32(m->players[i].loan); darkvater@436: m->players[i].bankrupt_value = BSWAP32(m->players[i].bankrupt_value); darkvater@436: m->players[i].bankrupt_timeout = BSWAP16(m->players[i].bankrupt_timeout); darkvater@436: m->players[i].cargo_types = BSWAP32(m->players[i].cargo_types); darkvater@436: darkvater@436: for (j = 0; j < 3; j++) { // OldPlayerExpenses expenses[3]; darkvater@436: for (k = 0; k < 13; k++) darkvater@436: m->players[i].expenses[j].cost[k] = BSWAP32(m->players[i].expenses[j].cost[k]); darkvater@436: } darkvater@436: darkvater@436: for (j = 0; j < (24 + 1); j++) { // OldPlayerEconomy economy[24 + 1]; darkvater@436: m->players[i].economy->income = BSWAP32(m->players[i].economy->income); darkvater@436: m->players[i].economy->expenses = BSWAP32(m->players[i].economy->expenses); darkvater@436: m->players[i].economy->delivered_cargo = BSWAP32(m->players[i].economy->delivered_cargo); darkvater@436: m->players[i].economy->performance_history = BSWAP32(m->players[i].economy->performance_history); darkvater@436: m->players[i].economy->company_value = BSWAP32(m->players[i].economy->company_value); darkvater@436: } darkvater@436: darkvater@436: m->players[i].inaugurated_date = BSWAP16(m->players[i].inaugurated_date); darkvater@436: m->players[i].last_build_coordinate = BSWAP16(m->players[i].last_build_coordinate); darkvater@436: m->players[i].ai_state_counter = BSWAP16(m->players[i].ai_state_counter); darkvater@436: m->players[i].ai_timeout_counter = BSWAP16(m->players[i].ai_timeout_counter); darkvater@436: darkvater@436: // OldAiBuildRec ai_src, ai_dst, ai_mid1, ai_mid2; darkvater@436: m->players[i].ai_src.spec_tile = BSWAP16(m->players[i].ai_src.spec_tile); darkvater@436: m->players[i].ai_src.use_tile = BSWAP16(m->players[i].ai_src.use_tile); darkvater@436: m->players[i].ai_dst.spec_tile = BSWAP16(m->players[i].ai_dst.spec_tile); darkvater@436: m->players[i].ai_dst.use_tile = BSWAP16(m->players[i].ai_dst.use_tile); darkvater@436: m->players[i].ai_mid1.spec_tile = BSWAP16(m->players[i].ai_mid1.spec_tile); darkvater@436: m->players[i].ai_mid1.use_tile = BSWAP16(m->players[i].ai_mid1.use_tile); darkvater@436: m->players[i].ai_mid2.spec_tile = BSWAP16(m->players[i].ai_mid2.spec_tile); darkvater@436: m->players[i].ai_mid2.use_tile = BSWAP16(m->players[i].ai_mid2.use_tile); darkvater@436: darkvater@436: m->players[i].ai_loco_id = BSWAP16(m->players[i].ai_loco_id); darkvater@436: darkvater@436: for (j = 0; j < 9; j++) darkvater@436: m->players[i].ai_wagonlist[j] = BSWAP16(m->players[i].ai_wagonlist[j]); darkvater@436: m->players[i].ai_start_tile_a = BSWAP16(m->players[i].ai_start_tile_a); darkvater@436: m->players[i].ai_start_tile_b = BSWAP16(m->players[i].ai_start_tile_b); darkvater@436: m->players[i].ai_cur_tile_a = BSWAP16(m->players[i].ai_cur_tile_a); darkvater@436: m->players[i].ai_cur_tile_b = BSWAP16(m->players[i].ai_cur_tile_b); darkvater@436: for (j = 0; j < 16; j++) // OldAiBannedTile banned_tiles[16]; darkvater@436: m->players[i].banned_tiles[j].tile= BSWAP16(m->players[i].banned_tiles[j].tile); darkvater@436: m->players[i].location_of_house = BSWAP16(m->players[i].location_of_house); darkvater@436: m->players[i].unk3AA = BSWAP32(m->players[i].unk3AA); darkvater@436: m->players[i].unk3AE = BSWAP32(m->players[i].unk3AE); darkvater@436: } darkvater@436: darkvater@436: /* ----------- VEHICLES ----------- */ darkvater@436: for (i = 0; i < 850; i++) { // OldVehicle vehicles[850]; darkvater@436: m->vehicles[i].next_hash = BSWAP16(m->vehicles[i].next_hash); darkvater@436: m->vehicles[i].index = BSWAP16(m->vehicles[i].index); darkvater@436: m->vehicles[i].schedule_ptr = BSWAP32(m->vehicles[i].schedule_ptr); darkvater@436: m->vehicles[i].dest_tile = BSWAP16(m->vehicles[i].dest_tile); darkvater@436: m->vehicles[i].load_unload_time_rem = BSWAP16(m->vehicles[i].load_unload_time_rem); darkvater@436: m->vehicles[i].date_of_last_service = BSWAP16(m->vehicles[i].date_of_last_service); darkvater@436: m->vehicles[i].service_interval = BSWAP16(m->vehicles[i].service_interval); darkvater@436: m->vehicles[i].max_speed = BSWAP16(m->vehicles[i].max_speed); darkvater@436: m->vehicles[i].x_pos = BSWAP16(m->vehicles[i].x_pos); darkvater@436: m->vehicles[i].y_pos = BSWAP16(m->vehicles[i].y_pos); darkvater@436: m->vehicles[i].tile = BSWAP16(m->vehicles[i].tile); darkvater@436: m->vehicles[i].cur_image = BSWAP16(m->vehicles[i].cur_image); darkvater@436: m->vehicles[i].left_coord = BSWAP16(m->vehicles[i].left_coord); darkvater@436: m->vehicles[i].right_coord = BSWAP16(m->vehicles[i].right_coord); darkvater@436: m->vehicles[i].top_coord = BSWAP16(m->vehicles[i].top_coord); darkvater@436: m->vehicles[i].bottom_coord = BSWAP16(m->vehicles[i].bottom_coord); darkvater@436: m->vehicles[i].vehstatus = BSWAP16(m->vehicles[i].vehstatus); darkvater@436: m->vehicles[i].cur_speed = BSWAP16(m->vehicles[i].cur_speed); darkvater@436: m->vehicles[i].capacity = BSWAP16(m->vehicles[i].capacity); darkvater@436: m->vehicles[i].number_of_pieces = BSWAP16(m->vehicles[i].number_of_pieces); darkvater@436: m->vehicles[i].age_in_days = BSWAP16(m->vehicles[i].age_in_days); darkvater@436: m->vehicles[i].max_age_in_days = BSWAP16(m->vehicles[i].max_age_in_days); darkvater@436: m->vehicles[i].engine_type = BSWAP16(m->vehicles[i].engine_type); darkvater@436: m->vehicles[i].reliability = BSWAP16(m->vehicles[i].reliability); darkvater@436: m->vehicles[i].reliability_spd_dec = BSWAP16(m->vehicles[i].reliability_spd_dec); darkvater@436: m->vehicles[i].profit_this_year = BSWAP32(m->vehicles[i].profit_this_year); darkvater@436: m->vehicles[i].profit_last_year = BSWAP32(m->vehicles[i].profit_last_year); darkvater@436: m->vehicles[i].next_in_chain = BSWAP16(m->vehicles[i].next_in_chain); darkvater@436: m->vehicles[i].value = BSWAP32(m->vehicles[i].value); darkvater@436: m->vehicles[i].string_id = BSWAP16(m->vehicles[i].string_id); darkvater@436: darkvater@436: // OldVehicleUnion u; darkvater@436: switch (m->vehicles[i].type) { darkvater@436: case VEH_Train: darkvater@436: m->vehicles[i].u.rail.crash_anim_pos = BSWAP16(m->vehicles[i].u.rail.crash_anim_pos); darkvater@436: break; darkvater@436: case VEH_Aircraft: darkvater@436: m->vehicles[i].u.air.crashed_counter = BSWAP16(m->vehicles[i].u.air.crashed_counter); darkvater@436: break; darkvater@436: case VEH_Road: darkvater@436: m->vehicles[i].u.road.unk2 = BSWAP16(m->vehicles[i].u.road.unk2); darkvater@436: m->vehicles[i].u.road.crashed_ctr = BSWAP16(m->vehicles[i].u.road.crashed_ctr); darkvater@436: break; darkvater@436: case VEH_Special: darkvater@436: m->vehicles[i].u.special.unk0 = BSWAP16(m->vehicles[i].u.special.unk0); darkvater@436: break; darkvater@436: case VEH_Disaster: darkvater@436: m->vehicles[i].u.disaster.image_override = BSWAP16(m->vehicles[i].u.disaster.image_override); darkvater@436: m->vehicles[i].u.disaster.unk2 = BSWAP16(m->vehicles[i].u.disaster.unk2); darkvater@436: break; darkvater@436: } darkvater@436: } darkvater@436: darkvater@436: /* ----------- SIGNS ----------- */ darkvater@436: for (i = 0; i < 40; i++) { // OldSign signs[40]; darkvater@436: m->signs[i].text = BSWAP16(m->signs[i].text); darkvater@436: m->signs[i].x = BSWAP16(m->signs[i].x); darkvater@436: m->signs[i].y = BSWAP16(m->signs[i].y); darkvater@436: m->signs[i].z = BSWAP16(m->signs[i].z); darkvater@436: m->signs[i].sign_left = BSWAP16(m->signs[i].sign_left); darkvater@436: m->signs[i].sign_top = BSWAP16(m->signs[i].sign_top); darkvater@436: } darkvater@436: darkvater@436: /* ----------- ENGINES ----------- */ darkvater@436: for (i = 0; i < 256; i++) { // OldEngine engines[256]; darkvater@436: m->engines[i].player_avail = BSWAP16(m->engines[i].player_avail); darkvater@436: m->engines[i].intro_date = BSWAP16(m->engines[i].intro_date); darkvater@436: m->engines[i].age = BSWAP16(m->engines[i].age); darkvater@436: m->engines[i].reliability = BSWAP16(m->engines[i].reliability); darkvater@436: m->engines[i].reliability_spd_dec = BSWAP16(m->engines[i].reliability_spd_dec); darkvater@436: m->engines[i].reliability_start = BSWAP16(m->engines[i].reliability_start); darkvater@436: m->engines[i].reliability_max = BSWAP16(m->engines[i].reliability_max); darkvater@436: m->engines[i].reliability_final = BSWAP16(m->engines[i].reliability_final); darkvater@436: m->engines[i].duration_phase_1 = BSWAP16(m->engines[i].duration_phase_1); darkvater@436: m->engines[i].duration_phase_2 = BSWAP16(m->engines[i].duration_phase_2); darkvater@436: m->engines[i].duration_phase_3 = BSWAP16(m->engines[i].duration_phase_3); darkvater@436: } darkvater@436: darkvater@436: m->vehicle_id_ctr_day = BSWAP16(m->vehicle_id_ctr_day); darkvater@436: darkvater@436: m->next_competitor_start = BSWAP16(m->next_competitor_start); darkvater@436: m->saved_main_scrollpos_x = BSWAP16(m->saved_main_scrollpos_x); darkvater@436: m->saved_main_scrollpos_y = BSWAP16(m->saved_main_scrollpos_y); darkvater@436: m->saved_main_scrollpos_zoom = BSWAP16(m->saved_main_scrollpos_zoom); darkvater@436: m->maximum_loan = BSWAP32(m->maximum_loan); darkvater@436: m->maximum_loan_unround = BSWAP32(m->maximum_loan_unround); darkvater@436: m->economy_fluct = BSWAP16(m->economy_fluct); darkvater@436: m->disaster_delay = BSWAP16(m->disaster_delay); darkvater@436: darkvater@436: for (i = 0; i < 256; i++) // uint16 engine_name_strings[256]; darkvater@436: m->engine_name_strings[i] = BSWAP16(m->engine_name_strings[i]); darkvater@436: darkvater@436: /* ----------- GAME SETTINGS ----------- */ darkvater@436: m->game_diff.max_no_competitors = BSWAP16(m->game_diff.max_no_competitors); darkvater@436: m->game_diff.competitor_start_time = BSWAP16(m->game_diff.competitor_start_time); darkvater@436: m->game_diff.number_towns = BSWAP16(m->game_diff.number_towns); darkvater@436: m->game_diff.number_industries = BSWAP16(m->game_diff.number_industries); darkvater@436: m->game_diff.max_loan = BSWAP16(m->game_diff.max_loan); darkvater@436: m->game_diff.initial_interest = BSWAP16(m->game_diff.initial_interest); darkvater@436: m->game_diff.vehicle_costs = BSWAP16(m->game_diff.vehicle_costs); darkvater@436: m->game_diff.competitor_speed = BSWAP16(m->game_diff.competitor_speed); darkvater@436: m->game_diff.competitor_intelligence= BSWAP16(m->game_diff.competitor_intelligence); darkvater@436: m->game_diff.vehicle_breakdowns = BSWAP16(m->game_diff.vehicle_breakdowns); darkvater@436: m->game_diff.subsidy_multiplier = BSWAP16(m->game_diff.subsidy_multiplier); darkvater@436: m->game_diff.construction_cost = BSWAP16(m->game_diff.construction_cost); darkvater@436: m->game_diff.terrain_type = BSWAP16(m->game_diff.terrain_type); darkvater@436: m->game_diff.quantity_sea_lakes = BSWAP16(m->game_diff.quantity_sea_lakes); darkvater@436: m->game_diff.economy = BSWAP16(m->game_diff.economy); darkvater@436: m->game_diff.line_reverse_mode = BSWAP16(m->game_diff.line_reverse_mode); darkvater@436: m->game_diff.disasters = BSWAP16(m->game_diff.disasters); darkvater@436: } darkvater@436: #endif truelight@0: truelight@0: // loader for old style savegames truelight@0: bool LoadOldSaveGame(const char *file) truelight@0: { truelight@0: LoadSavegameState lss; truelight@0: OldMain *m; tron@695: uint map_size; truelight@0: int i; truelight@0: truelight@0: _cur_state = &lss; truelight@0: memset(&lss, 0, sizeof(lss)); truelight@0: truelight@0: lss.fin = fopen(file, "rb"); truelight@0: if (lss.fin == NULL) return false; truelight@0: darkvater@4: /* B - byte 8bit (1) darkvater@4: * W - word 16bit (2 bytes) darkvater@4: * L - 'long' word 32bit (4 bytes) darkvater@4: */ darkvater@4: fseek(lss.fin, 49, SEEK_SET); // 47B TITLE, W Checksum - Total 49 truelight@0: darkvater@4: /* Load the file into memory darkvater@4: * Game Data 0x77179 + L4 (256x256) + L5 (256x256) darkvater@4: */ truelight@0: m = (OldMain *)malloc(sizeof(OldMain)); truelight@0: LoadSavegameBytes(m, sizeof(OldMain)); darkvater@436: #ifdef TTD_BIG_ENDIAN darkvater@436: FixEndianness(m); darkvater@436: #endif truelight@0: truelight@0: // copy sections of it to our datastructures. tron@695: map_size = MapSize(); tron@695: memcpy(_map_owner, m->map_owner, map_size); tron@695: memcpy(_map_type_and_height, m->map_type_and_height, map_size); tron@695: memcpy(_map5, m->map5, map_size); tron@695: for (i = 0; i != map_size; i++) { truelight@817: _map2[i] = m->map2[i]; truelight@0: _map3_lo[i] = m->map3[i] & 0xFF; truelight@0: _map3_hi[i] = m->map3[i] >> 8; truelight@0: } tron@695: memcpy(_map_extra_bits, m->map_extra, map_size / 4); truelight@0: truelight@0: // go through the tables and see if we can find any ttdpatch presignals. Then convert those to our format. tron@695: for (i = 0; i != map_size; i++) { truelight@0: if (IS_TILETYPE(i, MP_RAILWAY) && (_map5[i] & 0xC0) == 0x40) { truelight@0: // this byte is always zero in real ttd. truelight@193: if (_map3_hi[i]) { truelight@0: // convert ttdpatch presignal format to openttd presignal format. truelight@0: _map3_hi[i] = (_map3_hi[i] >> 1) & 7; truelight@0: } truelight@0: } truelight@0: } truelight@0: tron@577: for (i = 0; i < lengthof(m->order_list); ++i) tron@577: _order_array[i] = UnpackOldOrder(m->order_list[i]); truelight@0: _ptr_to_next_order = _order_array + REMAP_ORDER_IDX(m->ptr_to_next_order); truelight@0: truelight@919: FixTown(m->town_list, lengthof(m->town_list), m->town_name_type); truelight@919: FixIndustry(m->industries, lengthof(m->industries)); truelight@919: FixStation(m->stations, lengthof(m->stations)); truelight@0: truelight@0: FixDepot(_depots, m->depots, lengthof(m->depots)); truelight@919: FixVehicle(m->vehicles, lengthof(m->vehicles)); truelight@0: FixSubsidy(_subsidies, m->subsidies, lengthof(m->subsidies)); truelight@193: darkvater@4: FixPlayer(_players, m->players, lengthof(m->players), m->town_name_type); truelight@0: FixName(m->names, lengthof(m->names)); truelight@0: FixSign(_sign_list, m->signs, lengthof(m->signs)); truelight@0: FixEngine(_engines, m->engines, lengthof(m->engines)); truelight@0: truelight@0: _opt.diff_level = m->difficulty_level; truelight@0: _opt.currency = m->currency; truelight@0: _opt.kilometers = m->use_kilometers; truelight@0: _opt.town_name = m->town_name_type; darkvater@392: _opt.landscape = m->landscape_type & 0xf; truelight@0: _opt.snow_line = m->snow_line_height; truelight@0: _opt.autosave = 0; truelight@0: _opt.road_side = m->road_side; truelight@0: FixGameDifficulty(&_opt.diff, &m->game_diff); truelight@0: truelight@0: // Load globals truelight@0: _date = m->date; truelight@0: _date_fract = m->date_fract; truelight@0: _tick_counter = m->tick_counter; truelight@0: _vehicle_id_ctr_day = m->vehicle_id_ctr_day; truelight@0: _age_cargo_skip_counter = m->age_cargo_skip_counter; truelight@0: _avail_aircraft = m->avail_aircraft; truelight@0: _cur_tileloop_tile = m->cur_tileloop_tile; truelight@0: _disaster_delay = m->disaster_delay; truelight@0: _station_tick_ctr = m->station_tick_ctr; signde@206: _random_seeds[0][0] = m->seed_1; signde@206: _random_seeds[0][1] = m->seed_2; truelight@0: _cur_town_ctr = REMAP_TOWN_IDX(m->cur_town_ptr); truelight@0: _cur_player_tick_index = m->cur_player_tick_index; truelight@0: _next_competitor_start = m->next_competitor_start; truelight@0: _trees_tick_ctr = m->trees_tick_ctr; truelight@0: _saved_scrollpos_x = m->saved_main_scrollpos_x; truelight@0: _saved_scrollpos_y = m->saved_main_scrollpos_y; truelight@0: _saved_scrollpos_zoom = m->saved_main_scrollpos_zoom; truelight@0: truelight@0: // Load economy stuff truelight@0: _economy.max_loan = m->maximum_loan; truelight@0: _economy.max_loan_unround = m->maximum_loan_unround; truelight@0: _economy.fluct = m->economy_fluct; truelight@0: _economy.interest_rate = m->interest_rate; truelight@0: _economy.infl_amount = m->inflation_amount; truelight@0: _economy.infl_amount_pr = m->inflation_amount_payment_rates; truelight@0: tron@695: for (i = 0; i != lengthof(m->animated_tile_list); ++i) tron@695: _animated_tile_list[i] = m->animated_tile_list[i]; truelight@0: memcpy(_engine_name_strings, m->engine_name_strings, sizeof(m->engine_name_strings)); truelight@0: truelight@0: for(i=0; i!=lengthof(m->prices); i++) { truelight@0: ((uint32*)&_price)[i] = m->prices[i].price; truelight@0: _price_frac[i] = m->prices[i].frac; truelight@0: } truelight@0: truelight@0: for(i=0; i!=lengthof(m->cargo_payment_rates); i++) { truelight@0: _cargo_payment_rates[i] = -(int32)m->cargo_payment_rates[i].price; truelight@0: _cargo_payment_rates_frac[i] = m->cargo_payment_rates[i].frac; truelight@0: } truelight@193: truelight@0: free(m); truelight@0: fclose(lss.fin); truelight@0: return true; truelight@0: } truelight@0: truelight@0: void GetOldSaveGameName(char *title, const char *file) truelight@0: { truelight@0: FILE *f; truelight@0: truelight@0: f = fopen(file, "rb"); truelight@0: title[0] = 0; truelight@0: title[48] = 0; truelight@0: truelight@0: if (!f) return; truelight@0: if (fread(title, 1, 48, f) != 48) title[0] = 0; truelight@0: fclose(f); truelight@0: } truelight@0: truelight@0: void GetOldScenarioGameName(char *title, const char *file) truelight@0: { truelight@0: GetOldSaveGameName(title, file); truelight@0: }