private void LoadData() { if (m_data == null) { m_logger.debugLog("No data to load"); return; } m_logger.alwaysLog("Save version: " + m_data.ModVersion, Logger.severity.INFO); // network Dictionary<Message.Builder_Message, Message> messages = new Dictionary<Message.Builder_Message, Message>(); SerializableGameTime.Adjust = new TimeSpan(m_data.SaveTime); foreach (RelayStorage.Builder_NetworkStorage bns in m_data.AntennaStorage) { RelayNode node; if (!Registrar.TryGetValue(bns.PrimaryNode, out node)) { m_logger.alwaysLog("Failed to get node for: " + bns.PrimaryNode, Logger.severity.WARNING); continue; } RelayStorage store = node.Storage; if (store == null) // probably always true { node.ForceCreateStorage(); store = node.Storage; if (store == null) { m_logger.debugLog("failed to create storage for " + node.LoggingName, Logger.severity.ERROR); continue; } } foreach (LastSeen.Builder_LastSeen bls in bns.LastSeenList) { LastSeen ls = new LastSeen(bls); if (ls.IsValid) store.Receive(ls); else m_logger.debugLog("failed to create a valid last seen from builder for " + bls.EntityId, Logger.severity.WARNING); } m_logger.debugLog("added " + bns.LastSeenList.Length + " last seen to " + store.PrimaryNode.LoggingName, Logger.severity.DEBUG); foreach (Message.Builder_Message bm in bns.MessageList) { Message msg; if (!messages.TryGetValue(bm, out msg)) { msg = new Message(bm); messages.Add(bm, msg); } else { m_logger.debugLog("found linked message", Logger.severity.TRACE); } if (msg.IsValid) store.Receive(msg); else m_logger.debugLog("failed to create a valid message from builder for " + bm.DestCubeBlock, Logger.severity.WARNING); } m_logger.debugLog("added " + bns.MessageList.Length + " message to " + store.PrimaryNode.LoggingName, Logger.severity.DEBUG); } // system disruption foreach (Disruption.Builder_Disruption bd in m_data.SystemDisruption) { Disruption disrupt; switch (bd.Type) { case "AirVentDepressurize": disrupt = new AirVentDepressurize(); break; case "CryoChamberMurder": disrupt = new CryoChamberMurder(); break; case "DisableTurret": disrupt = new DisableTurret(); break; case "DoorLock": disrupt = new DoorLock(); break; case "EMP": disrupt = new EMP(); break; case "GravityReverse": disrupt = new GravityReverse(); break; case "JumpDriveDrain": disrupt = new JumpDriveDrain(); break; case "MedicalRoom": disrupt = new MedicalRoom(); break; case "TraitorTurret": disrupt = new TraitorTurret(); break; default: m_logger.alwaysLog("Unknown disruption: " + bd.Type, Logger.severity.WARNING); continue; } disrupt.Start(bd); } // autopilot if (m_data.Autopilot != null) foreach (ShipAutopilot.Builder_Autopilot ba in m_data.Autopilot) { ShipAutopilot autopilot; if (Registrar.TryGetValue(ba.AutopilotBlock, out autopilot)) autopilot.Resume = ba; else m_logger.alwaysLog("failed to find autopilot block " + ba.AutopilotBlock, Logger.severity.WARNING); } // programmable block if (m_data.ProgrammableBlock != null) foreach (ProgrammableBlock.Builder_ProgrammableBlock bpa in m_data.ProgrammableBlock) { ProgrammableBlock pb; if (Registrar.TryGetValue(bpa.BlockId, out pb)) pb.ResumeFromSave(bpa); else m_logger.alwaysLog("failed to find programmable block " + bpa.BlockId, Logger.severity.WARNING); } // text panel if (m_data.TextPanel != null) foreach (TextPanel.Builder_TextPanel btp in m_data.TextPanel) { TextPanel panel; if (Registrar.TryGetValue(btp.BlockId, out panel)) panel.ResumeFromSave(btp); else m_logger.alwaysLog("failed to find text panel " + btp.BlockId, Logger.severity.WARNING); } // weapon if (m_data.Weapon != null) foreach (WeaponTargeting.Builder_WeaponTargeting bwt in m_data.Weapon) { WeaponTargeting targeting; if (WeaponTargeting.TryGetWeaponTargeting(bwt.WeaponId, out targeting)) targeting.ResumeFromSave(bwt); else m_logger.alwaysLog("failed to find weapon " + bwt.WeaponId, Logger.severity.WARNING); } // entity values if (m_data.EntityValues != null) EntityValue.ResumeFromSave(m_data.EntityValues); m_data = null; }