/** * Remove fog around the current structure. * Radius to uncover is taken from the current structure info. * * Stack: *none* * * @param script The script engine to operate on. * @return The value 0. Always. */ uint16 Script_Structure_RemoveFogAroundTile(ScriptEngine *script) { VARIABLE_NOT_USED(script); Structure_RemoveFog(g_scriptCurrentStructure); return 0; }
/** * Prepare the map (after loading scenario or savegame). Does some basic * sanity-check and corrects stuff all over the place. */ void Game_Prepare(void) { PoolFindStruct find; uint16 oldSelectionType; Tile *t; int i; g_validateStrictIfZero++; oldSelectionType = g_selectionType; g_selectionType = SELECTIONTYPE_MENTAT; Structure_Recount(); Unit_Recount(); Team_Recount(); t = &g_map[0]; for (i = 0; i < 64 * 64; i++, t++) { Structure *s; Unit *u; u = Unit_Get_ByPackedTile(i); s = Structure_Get_ByPackedTile(i); if (u == NULL || !u->o.flags.s.used) t->hasUnit = false; if (s == NULL || !s->o.flags.s.used) t->hasStructure = false; if (t->isUnveiled) Map_UnveilTile(i, g_playerHouseID); } find.houseID = HOUSE_INVALID; find.index = 0xFFFF; find.type = 0xFFFF; while (true) { Unit *u; u = Unit_Find(&find); if (u == NULL) break; if (u->o.flags.s.isNotOnMap) continue; Unit_RemoveFog(u); Unit_UpdateMap(1, u); } find.houseID = HOUSE_INVALID; find.index = 0xFFFF; find.type = 0xFFFF; while (true) { Structure *s; s = Structure_Find(&find); if (s == NULL) break; if (s->o.type == STRUCTURE_SLAB_1x1 || s->o.type == STRUCTURE_SLAB_2x2 || s->o.type == STRUCTURE_WALL) continue; if (s->o.flags.s.isNotOnMap) continue; Structure_RemoveFog(s); if (s->o.type == STRUCTURE_STARPORT && s->o.linkedID != 0xFF) { Unit *u = Unit_Get_ByIndex(s->o.linkedID); if (!u->o.flags.s.used || !u->o.flags.s.isNotOnMap) { s->o.linkedID = 0xFF; s->countDown = 0; } else { Structure_SetState(s, STRUCTURE_STATE_READY); } } Script_Load(&s->o.script, s->o.type); if (s->o.type == STRUCTURE_PALACE) { House_Get_ByIndex(s->o.houseID)->palacePosition = s->o.position; } if ((House_Get_ByIndex(s->o.houseID)->palacePosition.x != 0) || (House_Get_ByIndex(s->o.houseID)->palacePosition.y != 0)) continue; House_Get_ByIndex(s->o.houseID)->palacePosition = s->o.position; } find.houseID = HOUSE_INVALID; find.index = 0xFFFF; find.type = 0xFFFF; while (true) { House *h; h = House_Find(&find); if (h == NULL) break; h->structuresBuilt = Structure_GetStructuresBuilt(h); House_UpdateCreditsStorage((uint8)h->index); House_CalculatePowerAndCredit(h); } GUI_Palette_CreateRemap(g_playerHouseID); Map_SetSelection(g_selectionPosition); if (g_structureActiveType != 0xFFFF) { Map_SetSelectionSize(g_table_structureInfo[g_structureActiveType].layout); } else { Structure *s = Structure_Get_ByPackedTile(g_selectionPosition); if (s != NULL) Map_SetSelectionSize(g_table_structureInfo[s->o.type].layout); } Voice_LoadVoices(g_playerHouseID); g_tickHousePowerMaintenance = max(g_timerGame + 70, g_tickHousePowerMaintenance); g_viewport_forceRedraw = true; g_playerCredits = 0xFFFF; g_selectionType = oldSelectionType; g_validateStrictIfZero--; }
/** * Save the game to a filename * * @param fp The filename of the savegame. * @param description The description of the savegame. * @return True if and only if all bytes were written successful. */ bool SaveFile(char *filename, char *description) { FILE *fp; char filenameComplete[1024]; bool res; /* In debug-scenario mode, the whole map is uncovered. Cover it now in * the savegame based on the current position of the units and * structures. */ if (g_debugScenario) { PoolFindStruct find; uint16 i; /* Add fog of war for all tiles on the map */ for (i = 0; i < 0x1000; i++) { Tile *tile = &g_map[i]; tile->isUnveiled = false; tile->overlaySpriteID = g_veiledSpriteID; } find.houseID = HOUSE_INVALID; find.type = 0xFFFF; find.index = 0xFFFF; /* Remove the fog of war for all units */ while (true) { Unit *u; u = Unit_Find(&find); if (u == NULL) break; Unit_RemoveFog(u); } find.houseID = HOUSE_INVALID; find.type = 0xFFFF; find.index = 0xFFFF; /* Remove the fog of war for all structures */ while (true) { Structure *s; s = Structure_Find(&find); if (s == NULL) break; Structure_RemoveFog(s); } } snprintf(filenameComplete, sizeof(filenameComplete), "data/%s", filename); fp = fopen(filenameComplete, "wb"); if (fp == NULL) { Error("Failed to open file '%s' for writing.\n", filenameComplete); return false; } g_var_38BC++; res = Save_Main(fp, description); g_var_38BC--; fclose(fp); if (!res) { /* TODO -- Also remove the savegame now */ Error("Error while writing savegame.\n"); return false; } return true; }