/** * Load all kinds of important info from a file. * @param fp The file to load from. * @param length The length of the data chunk. * @return True if and only if all bytes were read successful. */ bool Info_Load(FILE *fp, uint32 length) { if (SaveLoad_GetLength(s_saveInfo) != length) return false; if (!SaveLoad_Load(s_saveInfo, fp, NULL)) return false; g_viewportPosition = g_minimapPosition; g_selectionPosition = g_selectionRectanglePosition; Sprites_LoadTiles(); Map_CreateLandscape(g_scenario.mapSeed); return true; }
bool Scenario_Load(uint16 scenarioID, uint8 houseID) { char filename[14]; int i; if (houseID >= HOUSE_MAX) return false; g_scenarioID = scenarioID; /* Load scenario file */ sprintf(filename, "SCEN%c%03d.INI", g_table_houseInfo[houseID].name[0], scenarioID); if (!File_Exists(filename)) return false; s_scenarioBuffer = File_ReadWholeFile(filename); memset(&g_scenario, 0, sizeof(Scenario)); Scenario_Load_General(); Sprites_LoadTiles(); Map_CreateLandscape(g_scenario.mapSeed); for (i = 0; i < 16; i++) { g_scenario.reinforcement[i].unitID = UNIT_INDEX_INVALID; } Scenario_Load_Houses(); Scenario_Load_Chunk("UNITS", &Scenario_Load_Unit); Scenario_Load_Chunk("STRUCTURES", &Scenario_Load_Structure); Scenario_Load_Chunk("MAP", &Scenario_Load_Map); Scenario_Load_Chunk("REINFORCEMENTS", &Scenario_Load_Reinforcement); Scenario_Load_Chunk("TEAMS", &Scenario_Load_Team); Scenario_Load_Chunk("CHOAM", &Scenario_Load_Choam); Scenario_Load_MapParts("Bloom", Scenario_Load_Map_Bloom); Scenario_Load_MapParts("Field", Scenario_Load_Map_Field); Scenario_Load_MapParts("Special", Scenario_Load_Map_Special); g_tickScenarioStart = g_timerGame; free(s_scenarioBuffer); s_scenarioBuffer = NULL; return true; }
static bool Skirmish_GenerateMapInner(bool generate_houses, SkirmishData* sd) { const MapInfo* mi = &g_mapInfos[0]; if (generate_houses) Skirmish_Prepare(); Game_Init(); Skirmish_GenGeneral(); Sprites_UnloadTiles(); Sprites_LoadTiles(); Tools_RandomLCG_Seed(g_skirmish.seed); Map_CreateLandscape(g_skirmish.seed); if (!generate_houses) return true; /* Create initial island. */ sd->island[0].start = 0; sd->island[0].end = 0; for (int dy = 0; dy < mi->sizeY; dy++) { for (int dx = 0; dx < mi->sizeX; dx++) { const int tx = mi->minX + dx; const int ty = mi->minY + dy; const uint16 packed = Tile_PackXY(tx, ty); sd->buildable[sd->island[0].end].x = tx; sd->buildable[sd->island[0].end].y = ty; sd->buildable[sd->island[0].end].packed = packed; sd->buildable[sd->island[0].end].parent = 0; sd->island[0].end++; } } memset(sd->islandID, 0, MAP_SIZE_MAX * MAP_SIZE_MAX * sizeof(sd->islandID[0])); Skirmish_DivideIsland(HOUSE_INVALID, 0, sd); if (sd->nislands_unused == 0) return false; /* Spawn players. */ for (HouseType houseID = HOUSE_HARKONNEN; houseID < HOUSE_MAX; houseID++) { if (g_skirmish.brain[houseID] == BRAIN_NONE) continue; if (g_skirmish.brain[houseID] == BRAIN_HUMAN) Scenario_Create_House(houseID, g_skirmish.brain[houseID], 2000, 0, 250); else { House* h = Scenario_Create_House(houseID, g_skirmish.brain[houseID], 1000, 0, 250); h->flags.isAIActive = true; if (!Skirmish_GenStructuresAI(houseID, sd)) return false; } } for (HouseType houseID = HOUSE_HARKONNEN; houseID < HOUSE_MAX; houseID++) { if (g_skirmish.brain[houseID] == BRAIN_NONE) continue; if (g_skirmish.brain[houseID] == BRAIN_HUMAN) { if (!Skirmish_GenUnitsHuman(houseID, sd)) return false; } else { Skirmish_GenUnitsAI(houseID); } } Skirmish_GenSpiceBlooms(); Skirmish_GenSandworms(); Skirmish_GenCHOAM(); Game_Prepare(); GUI_ChangeSelectionType(SELECTIONTYPE_STRUCTURE); Scenario_CentreViewport(g_playerHouseID); g_tickScenarioStart = g_timerGame; return true; }