From d23739e3e18eeeeb58fdec9cdf5fca6240f5189e Mon Sep 17 00:00:00 2001 From: Ed Kolis Date: Sun, 9 Jun 2024 16:42:32 -0400 Subject: [PATCH] 300 split freeecore into a hierarchy of projects take2 (#314) * Split out some utility code into a FrEee.Core.Utility project * Rename FrEee project to FrEee.Core (finally!) * Clarify purpose of FrEee.Core.Utility project * Delete an extraneous quote * Move combat from Objects to Processes * Move Parser and some extension methods to FrEee.Core.Utility * Delete some unused extension methods * Move AI from Objects to Processes * Move some galaxy/mod reference type stuff to appropriate places * Delete duplicate class * Move abilities from Objects to Modding * Move AbilityExtensions to Modding.Abilities * Move game setup to Processes * Move MiningModle to FrEee.Core, it doesn't reference game objects but it kind of is one.. --- FrEee.Assets/CommonProjectProperties.xml | 2 +- FrEee.Assets/GameSetups/Quickstart.gsu | 6 +- .../Extensions/EnumerableExtensions.cs | 2 + .../Extensions/MathExtensions.cs | 4 + .../Extensions/Parser.cs | 2 + .../Extensions/StringHandlingExtensions.cs | 4 +- .../Extensions/TypeExtensions.cs | 174 + .../Extensions/UnitHandlingExtensions.cs | 5 +- FrEee.Core.Utility/FrEee.Core.Utility.csproj | 20 + .../Serialization/DoNotSerializeAttribute.cs | 22 + .../Serialization/IData.cs | 1 + .../Serialization/IDataObject.cs | 3 + .../Serialization/IReferenceEnumerable.cs | 5 +- .../Serialization/JsonContractResolver.cs | 2 + .../Stringifiers/IStringifier.cs | 2 + .../Stringifiers/PointStringifier.cs | 2 + .../Stringifiers/SizeStringifier.cs | 2 + .../Serialization/Stringifiers/Stringifier.cs | 2 + .../Stringifiers/StringifierLibrary.cs | 2 + .../Utility/ClientSafeAttribute.cs | 25 +- .../Utility/ClientUtilities.cs | 45 +- .../Utility/DoNotCopyAttribute.cs | 28 + .../Utility/DynamicDictionary.cs | 314 +- .../Utility/HashCodeMasher.cs | 61 +- .../Utility/HeatMap.cs | 114 +- .../Utility/IPopulator.cs | 1 + .../Utility/MathX.cs | 43 +- .../Utility/NameAttribute.cs | 66 +- {FrEee => FrEee.Core.Utility}/Utility/PRNG.cs | 264 +- .../Utility/PopulateAttribute.cs | 2 + .../Utility/Progress.cs | 201 +- .../Utility/ProgressDisplayMode.cs | 44 +- .../Utility/RandomHelper.cs | 200 +- .../Utility/SafeDictionary.cs | 411 +- .../Utility/SafeType.cs | 625 +- .../Utility/SequenceEqualityComparer.cs | 55 +- .../Utility/Status.cs | 124 +- .../Utility/Vector2.cs | 326 +- .../Utility/Vector2Utility.cs | 4 +- {FrEee => FrEee.Core}/App.config | 12 +- {FrEee => FrEee.Core}/ClassDiagram1.cd | 5582 ++++++++--------- .../Extensions/ChecksExtensions.cs | 83 +- .../Extensions/CommonExtensions.cs | 364 +- .../Extensions/ComparisonExtensions.cs | 0 .../Extensions/ConversionExtensions.cs | 1 + .../Extensions/CopyingExtensions.cs | 2 + .../Extensions/GameEnumerableExtensions.cs | 3 +- .../FrEee.Core.csproj | 98 +- {FrEee => FrEee.Core}/FrEee.csproj.old | 0 {FrEee => FrEee.Core}/FrEee.ico | Bin {FrEee => FrEee.Core}/FrEeeConstants.cs | 16 +- {FrEee => FrEee.Core}/FrEeeStrongName.snk | Bin FrEee.Core/Modding/Abilities/Ability.cs | 214 + FrEee.Core/Modding/Abilities/AbilityRule.cs | 291 + .../Modding}/Abilities/AbilityTargets.cs | 3 +- .../Modding}/Abilities/AbilityValueRule.cs | 3 +- .../Modding/Abilities/Extensions.cs | 5 +- .../Modding}/Abilities/IAbilityObject.cs | 2 +- .../Abilities/ICommonAbilityObject.cs | 2 +- .../Abilities/IOwnableAbilityObject.cs | 2 +- .../Modding/ComputedFormula.cs | 337 +- {FrEee => FrEee.Core}/Modding/DamageType.cs | 396 +- {FrEee => FrEee.Core}/Modding/DataFile.cs | 350 +- .../Modding/DataParsingException.cs | 58 +- .../Modding/EmpireTraitRequirement.cs | 72 +- .../Modding/EventMessageTarget.cs | 0 .../Modding/EventSeverity.cs | 0 .../Modding/EventTemplate.cs | 184 +- {FrEee => FrEee.Core}/Modding/EventType.cs | 120 +- {FrEee => FrEee.Core}/Modding/Field.cs | 525 +- {FrEee => FrEee.Core}/Modding/Formula.cs | 434 +- .../Modding/FormulaContext.cs | 100 +- {FrEee => FrEee.Core}/Modding/FormulaType.cs | 0 {FrEee => FrEee.Core}/Modding/IFormula.cs | 1 + {FrEee => FrEee.Core}/Modding/IFormulaHost.cs | 0 {FrEee => FrEee.Core}/Modding/IModObject.cs | 0 .../Modding/LiteralFormula.cs | 261 +- .../Modding/Loaders/AbilityLoader.cs | 240 +- .../Modding/Loaders/AbilityRuleLoader.cs | 132 +- .../Modding/Loaders/ComponentLoader.cs | 427 +- .../Modding/Loaders/CultureLoader.cs | 84 +- .../Modding/Loaders/DamageTypeLoader.cs | 100 +- .../Modding/Loaders/DataFileLoader.cs | 46 +- .../Modding/Loaders/DesignRoleLoader.cs | 62 +- .../Modding/Loaders/EmpireAILoader.cs | 229 +- .../Modding/Loaders/EventLoader.cs | 152 +- .../Modding/Loaders/EventTypeLoader.cs | 75 +- .../Modding/Loaders/FacilityLoader.cs | 116 +- .../Modding/Loaders/GalaxyLoader.cs | 228 +- .../Modding/Loaders/HappinessModelLoader.cs | 144 +- .../Modding/Loaders/HullLoader.cs | 214 +- .../Modding/Loaders/ILoader.cs | 38 +- .../Modding/Loaders/ModInfoLoader.cs | 232 +- .../Modding/Loaders/ModSettingsLoader.cs | 244 +- .../Modding/Loaders/MountLoader.cs | 127 +- .../Loaders/PopulationModifierLoader.cs | 60 +- .../Modding/Loaders/RequirementLoader.cs | 98 +- .../Modding/Loaders/ScriptLoader.cs | 130 +- .../Modding/Loaders/StarSystemLoader.cs | 831 +-- .../Modding/Loaders/StellarAbilityLoader.cs | 180 +- .../Modding/Loaders/StellarObjectLoader.cs | 520 +- .../Loaders/StellarObjectSizeLoader.cs | 82 +- .../Modding/Loaders/TechnologyLoader.cs | 124 +- .../Modding/Loaders/TextLoader.cs | 126 +- .../Modding/Loaders/TraitLoader.cs | 182 +- {FrEee => FrEee.Core}/Modding/MetaRecord.cs | 388 +- .../Modding/MetaRecordParameter.cs | 20 +- {FrEee => FrEee.Core}/Modding/Mod.cs | 960 +-- {FrEee => FrEee.Core}/Modding/ModInfo.cs | 106 +- FrEee.Core/Modding/ModProgress.cs | 18 + {FrEee => FrEee.Core}/Modding/ModReference.cs | 293 +- .../Modding/ModReferenceKeyedDictionary.cs | 28 + FrEee.Core/Modding/ModReferenceList.cs | 17 + FrEee.Core/Modding/ModReferenceSet.cs | 27 + {FrEee => FrEee.Core}/Modding/ModSettings.cs | 1189 ++-- .../Modding/ObjectFormula.cs | 335 +- .../Modding/PopulationModifier.cs | 44 +- {FrEee => FrEee.Core}/Modding/Record.cs | 637 +- {FrEee => FrEee.Core}/Modding/Requirement.cs | 44 +- .../Modding/RequirementType.cs | 0 .../Modding/ResourceFormula.cs | 175 +- .../Modding/Scripts/CSScript.cs | 1 + .../Modding/Scripts/IScript.cs | 0 .../Modding/Scripts/PythonScript.cs | 2 + .../Modding/Scripts/PythonScriptEngine.cs | 4 + .../Modding/Scripts/ScriptRequirement.cs | 0 .../CircleRadiusStellarObjectLocation.cs | 82 +- .../CoordStellarObjectLocation.cs | 83 +- .../IStellarObjectLocation.cs | 1 + .../RingStellarObjectLocation.cs | 86 +- .../SameAsStellarObjectLocation.cs | 61 +- .../Modding/StellarObjectSize.cs | 248 +- .../Templates/AsteroidFieldTemplate.cs | 184 +- .../Modding/Templates/ComponentTemplate.cs | 694 +- .../Modding/Templates/FacilityTemplate.cs | 585 +- .../Modding/Templates/GalaxyTemplate.cs | 948 +-- .../Modding/Templates/PlanetTemplate.cs | 200 +- .../Templates/RandomAbilityTemplate.cs | 161 +- .../Modding/Templates/StarSystemTemplate.cs | 353 +- .../Modding/Templates/StarTemplate.cs | 177 +- .../Modding/Templates/StormTemplate.cs | 131 +- .../Objects/Civilization/Aptitude.cs | 0 .../Civilization/CargoStorage/Cargo.cs | 7 +- .../Civilization/CargoStorage/CargoDelta.cs | 2 + .../CargoStorage/ICargoContainer.cs | 0 .../CargoStorage/ICargoTransferrer.cs | 0 .../Objects/Civilization/Colony.cs | 5 +- .../Construction/ConstructionQueue.cs | 1 + .../Construction/IConstructable.cs | 0 .../Construction/IConstructionOrder.cs | 0 .../Construction/IConstructionTemplate.cs | 0 .../Civilization/Construction/IConstructor.cs | 0 .../Objects/Civilization/Culture.cs | 0 .../Diplomacy/Actions/AcceptProposalAction.cs | 0 .../Diplomacy/Actions/BreakTreatyAction.cs | 0 .../Diplomacy/Actions/DeclareWarAction.cs | 0 .../Diplomacy/Actions/DiplomaticAction.cs | 1 + .../Diplomacy/Actions/RejectProposalAction.cs | 0 .../Civilization/Diplomacy/AllianceLevel.cs | 1 + .../Civilization/Diplomacy/AllowedTrades.cs | 1 + .../Diplomacy/Clauses/AllianceClause.cs | 0 .../Civilization/Diplomacy/Clauses/Clause.cs | 0 .../Clauses/CooperativeResearchClause.cs | 1 + .../Diplomacy/Clauses/FreeTradeClause.cs | 1 + .../Diplomacy/Clauses/ShareAbilityClause.cs | 4 +- .../Clauses/ShareCombatLogsClause.cs | 4 +- .../Diplomacy/Clauses/ShareDesignsClause.cs | 0 .../Diplomacy/Clauses/ShareVisionClause.cs | 0 .../Diplomacy/Clauses/SharingPriority.cs | 0 .../Diplomacy/Clauses/TributeClause.cs | 1 + .../Diplomacy/Messages/ActionMessage.cs | 0 .../Diplomacy/Messages/GeneralMessage.cs | 0 .../Diplomacy/Messages/IMessage.cs | 0 .../Diplomacy/Messages/Message.cs | 0 .../Diplomacy/Messages/ProposalMessage.cs | 0 .../Objects/Civilization/Diplomacy/Package.cs | 1 + .../Civilization/Diplomacy/Proposal.cs | 0 .../Civilization/Diplomacy/Relations.cs | 0 .../Objects/Civilization/Empire.cs | 10 +- .../Objects/Civilization/EmpireStatus.cs | 0 .../Objects/Civilization/HappinessModel.cs | 0 .../Objects/Civilization/IIncomeProducer.cs | 2 +- .../Objects/Civilization/INameable.cs | 0 .../Objects/Civilization/IOrderable.cs | 0 .../Objects/Civilization/IOwnable.cs | 2 +- .../Objects/Civilization/Mood.cs | 0 .../Orders/ActivateAbilityOrder.cs | 7 +- .../Civilization/Orders/ColonizeOrder.cs | 1 + .../Civilization/Orders/ConstructionOrder.cs | 0 .../Objects/Civilization/Orders/EvadeOrder.cs | 1 + .../Civilization/Orders/IMovementOrder.cs | 0 .../Objects/Civilization/Orders/IOrder.cs | 0 .../Civilization/Orders/IPathfindingOrder.cs | 0 .../Civilization/Orders/IRecyclable.cs | 0 .../Civilization/Orders/IRecycleBehavior.cs | 0 .../Objects/Civilization/Orders/MoveOrder.cs | 2 +- .../Civilization/Orders/PathfindingOrder.cs | 1 + .../Civilization/Orders/PursueOrder.cs | 5 +- .../Orders/RecycleBehaviors/ScrapBehavior.cs | 0 .../Orders/RecycleFacilityOrCargoOrder.cs | 2 +- .../Orders/RecycleVehicleInSpaceOrder.cs | 0 .../Civilization/Orders/SentryOrder.cs | 2 +- .../Civilization/Orders/TransferCargoOrder.cs | 0 .../Orders/UpgradeFacilityOrder.cs | 0 .../Objects/Civilization/Orders/WarpOrder.cs | 0 .../Civilization/Orders/WaypointOrder.cs | 1 + .../Objects/Civilization/PlayerInfo.cs | 0 .../Objects/Civilization/Race.cs | 4 +- .../Objects/Civilization/SectorWaypoint.cs | 0 .../Civilization/SpaceObjectWaypoint.cs | 1 + .../Objects/Civilization/Trait.cs | 4 +- .../Objects/Civilization/Waypoint.cs | 0 .../Objects/Commands/AddOrderCommand.cs | 0 .../Commands/ClearPlayerNoteCommand.cs | 1 + .../Commands/ClearPrivateNameCommand.cs | 1 + .../Objects/Commands/Command.cs | 0 .../Objects/Commands/CreateDesignCommand.cs | 0 .../Objects/Commands/CreateFleetCommand.cs | 0 .../Objects/Commands/CreateWaypointCommand.cs | 0 .../Objects/Commands/DeleteMessageCommand.cs | 2 +- .../Objects/Commands/DeleteWaypointCommand.cs | 0 .../Objects/Commands/DisbandFleetCommand.cs | 0 .../Objects/Commands/EditStrategyCommand.cs | 0 .../Objects/Commands/HotkeyWaypointCommand.cs | 0 .../Objects/Commands/ICommand.cs | 0 .../Objects/Commands/ICreateDesignCommand.cs | 0 .../Objects/Commands/IOrderCommand.cs | 0 .../Objects/Commands/JoinFleetCommand.cs | 0 .../Objects/Commands/LeaveFleetCommand.cs | 0 .../Objects/Commands/MinisterToggleCommand.cs | 1 + .../Objects/Commands/OrderCommand.cs | 0 .../Commands/RearrangeOrdersCommand.cs | 0 .../Objects/Commands/RemoveOrderCommand.cs | 0 .../Objects/Commands/ResearchCommand.cs | 1 + .../Objects/Commands/SendMessageCommand.cs | 0 .../Commands/SetObsoleteFlagCommand.cs | 0 .../Objects/Commands/SetPlayerInfoCommand.cs | 0 .../Objects/Commands/SetPlayerNoteCommand.cs | 1 + .../Objects/Commands/SetPrivateNameCommand.cs | 1 + .../Objects/Commands/SetPublicNameCommand.cs | 0 .../Commands/ToggleOrdersOnHoldCommand.cs | 0 .../Commands/ToggleRepeatOrdersCommand.cs | 0 {FrEee => FrEee.Core}/Objects/Events/Event.cs | 2 + .../Objects/Events/EventMessage.cs | 0 .../Objects/GameState/Galaxy.cs | 13 +- .../Objects/GameState/GalaxyProgress.cs | 19 + .../Objects/GameState/GalaxyReference.cs | 183 + .../GalaxyReferenceKeyedDictionary.cs | 27 + .../Objects/GameState/GalaxyReferenceList.cs | 15 + .../Objects/GameState/GalaxyReferenceSet.cs | 25 + .../Objects/GameState/ICleanable.cs | 0 .../Objects/GameState/IContainable.cs | 1 + .../Objects/GameState/IFoggable.cs | 0 .../Objects/GameState/INamed.cs | 0 .../Objects/GameState/IPictorial.cs | 0 .../Objects/GameState/IPromotable.cs | 0 .../Objects/GameState/ITemplate.cs | 0 .../Objects/GameState/IUnlockable.cs | 0 .../Objects/GameState/Visibility.cs | 0 .../Objects/LogMessages/GenericLogMessage.cs | 0 .../LogMessages/IPictorialLogMessage.cs | 0 .../Objects/LogMessages/LogMessage.cs | 0 .../LogMessages/PictorialLogMessage.cs | 0 .../Objects/SimulatedObjectWrappers.cs | 2 +- .../Objects/Space/AsteroidField.cs | 4 +- .../Objects/Space/Conditions.cs | 0 {FrEee => FrEee.Core}/Objects/Space/Fleet.cs | 7 +- .../Objects/Space/ILocated.cs | 0 .../Objects/Space/IMineableSpaceObject.cs | 0 .../Objects/Space/IMobileSpaceObject.cs | 2 +- .../Objects/Space/ISpaceObject.cs | 2 +- .../Objects/Space/IStellarObject.cs | 2 +- .../Objects/Space/ObjectLocation.cs | 0 {FrEee => FrEee.Core}/Objects/Space/Planet.cs | 7 +- {FrEee => FrEee.Core}/Objects/Space/Sector.cs | 4 +- {FrEee => FrEee.Core}/Objects/Space/Star.cs | 4 +- .../Objects/Space/StarSystem.cs | 4 +- .../Objects/Space/StellarObject.cs | 4 +- .../Objects/Space/StellarSize.cs | 0 {FrEee => FrEee.Core}/Objects/Space/Storm.cs | 4 +- .../Objects/Space/WarpPoint.cs | 4 +- .../Objects/Technology/Component.cs | 8 +- .../Objects/Technology/ComponentReference.cs | 0 .../Technology/DirectFireWeaponInfo.cs | 2 +- .../Objects/Technology/Facility.cs | 9 +- .../Objects/Technology/FacilityUpgrade.cs | 3 + .../Objects/Technology/Hull.cs | 5 +- .../Objects/Technology/IHull.cs | 2 +- .../Objects/Technology/IResearchable.cs | 0 .../Objects/Technology/IUpgradeable.cs | 0 .../Objects/Technology/Mount.cs | 6 +- .../Technology/MountedComponentTemplate.cs | 6 +- ...ntedComponentTemplateContainerPopulator.cs | 1 + .../Objects/Technology/SeekingWeaponInfo.cs | 2 +- .../Objects/Technology/Technology.cs | 1 + .../Objects/Technology/TechnologyCost.cs | 0 .../Technology/TechnologyRequirement.cs | 1 + .../Objects/Technology/WarheadWeaponInfo.cs | 2 +- .../Objects/Technology/WeaponInfo.cs | 4 +- .../Objects/Vehicles/Base.cs | 2 +- .../Objects/Vehicles/Design.cs | 4 +- .../Objects/Vehicles/Drone.cs | 4 +- .../Objects/Vehicles/Fighter.cs | 5 +- .../Objects/Vehicles/IDesign.cs | 2 +- .../Objects/Vehicles/IUnit.cs | 0 .../Objects/Vehicles/IVehicle.cs | 6 +- .../Objects/Vehicles/MajorSpaceVehicle.cs | 2 +- .../Objects/Vehicles/Mine.cs | 4 +- .../Objects/Vehicles/Satellite.cs | 4 +- .../Objects/Vehicles/Ship.cs | 4 +- .../Objects/Vehicles/SpaceVehicle.cs | 5 +- .../Objects/Vehicles/Troop.cs | 5 +- .../Objects/Vehicles/Vehicle.cs | 7 +- .../Objects/Vehicles/VehicleTypes.cs | 1 + .../Objects/Vehicles/WeaponPlatform.cs | 5 +- .../VictoryConditions/IVictoryCondition.cs | 0 .../MajorEmpireEliminationVictoryCondition.cs | 0 .../PeaceVictoryCondition.cs | 0 .../ScorePercentageVictoryCondition.cs | 0 .../ScoreVictoryCondition.cs | 0 .../SurvivalVictoryCondition.cs | 0 .../TechnologyVictoryCondition.cs | 0 .../TotalEliminationVictoryCondition.cs | 0 FrEee.Core/Processes/AI/AI.cs | 73 + FrEee.Core/Processes/AI/CSAI.cs | 65 + FrEee.Core/Processes/AI/PythonAI.cs | 27 + .../Combat/BeamWeaponDisplayEffect.cs | 38 + .../Processes}/Combat/Combat2/Battle_Space.cs | 0 .../Processes}/Combat/Combat2/CombatPlanet.cs | 0 .../Combat/Combat2/CombatReplayLog.cs | 0 .../Processes}/Combat/Combat2/CombatSeeker.cs | 0 .../Processes}/Combat/Combat2/CombatShot.cs | 0 .../Combat/Combat2/CombatVehicle.cs | 0 .../Processes}/Combat/Combat2/CombatWeapon.cs | 0 .../Combat/Combat2/ControlledCombatObject.cs | 0 .../Combat/Combat2/StrategyBlocks.cs | 0 .../Combat/Combat2/StrategyObject.cs | 0 .../Combat/Combat2/Tactics/Tactic.cs | 0 .../Combat/Combat2/Tactics/TacticBlock.cs | 0 .../Combat/Combat2/Tactics/TacticNode.cs | 0 .../Combat/Combat2/combatObjects.cs | 0 .../Processes}/Combat/Combat2/lib/FixMath.dll | Bin .../Processes}/Combat/Combat2/lib/FixMath.pdb | Bin .../Combat/Combat2/lib/NewtMath.dll | Bin .../Combat/Combat2/lib/NewtMath.pdb | Bin .../Combat/Combat2/lib/nunit.framework.dll | Bin .../Combat/Combat2/lib/nunit.framework.xml | 0 FrEee.Core/Processes/Combat/Grid/Battle.cs | 761 +++ .../Processes/Combat/Grid/BattleEvent.cs | 35 + .../Combat/Grid/CombatantAppearsEvent.cs | 17 + .../Combat/Grid/CombatantDestroyedEvent.cs | 13 + .../Combat/Grid/CombatantDisappearsEvent.cs | 16 + .../Combat/Grid/CombatantLaunchedEvent.cs | 27 + .../Combat/Grid/CombatantMovesEvent.cs | 12 + .../Combat/Grid/CombatantsCollideEvent.cs | 41 + .../Processes}/Combat/Grid/Extensions.cs | 0 .../Processes/Combat/Grid/GroundBattle.cs | 92 + .../Processes/Combat/Grid/IBattleEvent.cs | 12 + .../Processes/Combat/Grid/SpaceBattle.cs | 140 + .../Processes/Combat/Grid/WeaponFiresEvent.cs | 51 + FrEee.Core/Processes/Combat/Hit.cs | 75 + FrEee.Core/Processes/Combat/IBattle.cs | 22 + .../Processes}/Combat/ICombatSpaceObject.cs | 2 +- .../Processes}/Combat/ICombatant.cs | 2 +- .../Processes}/Combat/IDamageable.cs | 3 +- .../Processes}/Combat/ITargetable.cs | 2 +- .../Combat/ProjectileWeaponDisplayEffect.cs | 38 + FrEee.Core/Processes/Combat/Seeker.cs | 372 ++ .../Combat/SeekerWeaponDisplayEffect.cs | 38 + FrEee.Core/Processes/Combat/Shot.cs | 127 + .../Processes}/Combat/Simple/Battle.cs | 0 .../Processes/Combat/WeaponDisplayEffect.cs | 145 + .../Processes}/Combat/WeaponTargets.cs | 3 +- .../Processes}/Combat/WeaponTypes.cs | 3 +- .../Processes}/Setup/EmpirePlacement.cs | 3 +- FrEee.Core/Processes/Setup/EmpireTemplate.cs | 192 + FrEee.Core/Processes/Setup/GameSetup.cs | 696 ++ .../Processes}/Setup/ScoreDisplay.cs | 3 +- .../ClusteredStarSystemPlacementStrategy.cs | 64 + .../DiffuseStarSystemPlacementStrategy.cs | 32 + .../GridStarSystemPlacementStrategy.cs | 50 + .../IStarSystemPlacementStrategy.cs | 3 +- .../RandomStarSystemPlacementStrategy.cs | 27 + .../SpiralStarSystemPlacementStrategy.cs | 35 + .../Setup/StartingTechnologyLevel.cs | 2 +- .../CenterWarpPointPlacementStrategy.cs | 26 + .../EdgeAlignedWarpPointPlacementStrategy.cs | 34 + .../PlanetWarpPointPlacementStrategy.cs | 36 + ...RandomAlignedWarpPointPlacementStrategy.cs | 36 + .../RandomWarpPointPlacementStrategy.cs | 29 + .../StarWarpPointPlacementStrategy.cs | 36 + .../WarpPointPlacementStrategy.cs | 102 + .../Processes/TurnProcessor.cs | 7 +- .../FrEee.Game.Space.Planet.datasource | 18 +- .../Properties/Resources.Designer.cs | 124 +- .../Properties/Resources.resources | 2 +- .../Properties/Resources.resx | 238 +- .../Properties/Settings.Designer.cs | 50 +- .../Properties/Settings.settings | 14 +- .../Serialization/DataReference.cs | 2 + .../Serialization/DataScalar.cs | 3 + .../Serialization/JsonSerializer.cs | 1 + .../Serialization/LegacySerializer.cs | 4 + .../Serialization/ObjectGraphParser.cs | 22 +- .../Serialization/Serializer.cs | 12 - .../Serialization/SimpleDataObject.cs | 3 + .../DoubleLiteralFormulaStringifier.cs | 1 + .../IntLiteralFormulaStringifier.cs | 1 + .../PopulationModifierStringifier.cs | 1 + .../ResourceQuantityStringifier.cs | 1 + .../StringLiteralFormulaStringifier.cs | 1 + .../Utility/ClientSideCache.cs | 144 +- .../Utility/ConnectivityGraph.cs | 826 +-- .../Utility}/IReference.cs | 0 .../Utility}/IReferrable.cs | 0 {FrEee => FrEee.Core}/Utility/Library.cs | 263 +- {FrEee => FrEee.Core}/Utility/MiningModel.cs | 175 +- {FrEee => FrEee.Core}/Utility/Pathfinder.cs | 1030 +-- {FrEee => FrEee.Core}/Utility/Pictures.cs | 2137 +++---- FrEee.Core/Utility/Progress.cs | 37 + .../Utility}/ReferenceKeyedDictionary.cs | 38 +- .../Utility}/ReferenceList.cs | 11 +- .../Utility}/ReferenceSet.cs | 31 +- {FrEee => FrEee.Core}/Utility/Resource.cs | 499 +- .../Utility/ResourceProgress.cs | 75 +- .../Utility/ResourceQuantity.cs | 459 +- {FrEee => FrEee.Core}/xbuild.sh | 0 FrEee.Tests/FrEee.Tests.csproj | 4 +- FrEee.Tests/Modding/FormulaTest.cs | 2 +- FrEee.Tests/Objects/Abilities/AbilityTest.cs | 2 +- FrEee.Tests/Objects/Combat/DamageTypesTest.cs | 179 - .../Objects/Technology/WeaponInfoTest.cs | 2 +- FrEee.Tests/Objects/Vehicles/CloakingTest.cs | 4 +- FrEee.Tests/Objects/Vehicles/DamageTest.cs | 3 +- .../Processes/Combat/DamageTypesTest.cs | 180 + FrEee.Tests/Savegame/freeefurball_1.gam | 4480 ++++++------- FrEee.Tests/Setup/GameSetupTest.cs | 4 +- FrEee.Tests/Utility/DataTest.cs | 2 + .../Extensions/CommonExtensionsTest.cs | 1 + .../Extensions/EnumerableExtensionsTest.cs | 1 + FrEee.Tests/Utility/Extensions/ParserTest.cs | 2 + FrEee.Tests/Utility/MathXTest.cs | 1 + FrEee.Tests/Utility/PrngTest.cs | 1 + FrEee.Tests/Utility/SerializerTest.cs | 13 +- FrEee.Tests/Utility/VectorTest.cs | 1 + FrEee.UI.Blazor/FrEee.UI.Blazor.csproj | 4 +- .../Views/GalaxyMapModes/PresenceMode.cs | 1 + FrEee.UI.Blazor/Views/PieChartViewModel.cs | 1 + FrEee.UI.Blazor/Views/ProgressBarViewModel.cs | 2 + .../Views/ResourceDisplayViewModel.cs | 1 + FrEee.UI.WinForms/Controls/AbilityTreeView.cs | 2 +- FrEee.UI.WinForms/Controls/AptitudePicker.cs | 1 + .../Controls/AsteroidFieldReport.cs | 1 + FrEee.UI.WinForms/Controls/BattleView.cs | 6 +- .../Controls/Blazor/GameProgressBar.cs | 1 + FrEee.UI.WinForms/Controls/Cargolist.cs | 1 + FrEee.UI.WinForms/Controls/ComponentReport.cs | 4 +- FrEee.UI.WinForms/Controls/DesignReport.cs | 1 + FrEee.UI.WinForms/Controls/FleetReport.cs | 1 + FrEee.UI.WinForms/Controls/GameGridView.cs | 1 + FrEee.UI.WinForms/Controls/GameTabControl.cs | 1 + FrEee.UI.WinForms/Controls/LineGraph.cs | 1 + FrEee.UI.WinForms/Controls/MountReport.cs | 2 + FrEee.UI.WinForms/Controls/PlanetReport.cs | 1 + .../Controls/SpaceVehicleReport.cs | 2 + .../Controls/StarSystemReport.cs | 1 + .../DataGridView/DataGridViewProgressCell.cs | 2 + .../DataGridViewProgressColumn.cs | 1 + .../DataGridView/GridColumnConfig.cs | 1 + .../Forms/ActivateAbilityForm.cs | 5 +- FrEee.UI.WinForms/Forms/BattleReplayForm.cs | 4 +- FrEee.UI.WinForms/Forms/BattleResultsForm.cs | 8 +- FrEee.UI.WinForms/Forms/CargoTransferForm.cs | 1 + .../Forms/CombatSimulatorForm.cs | 5 +- .../Forms/ConstructionQueueForm.cs | 1 + .../Forms/ConstructionQueueListForm.cs | 1 + FrEee.UI.WinForms/Forms/DesignListForm.cs | 1 + FrEee.UI.WinForms/Forms/DiplomacyForm.cs | 3 +- FrEee.UI.WinForms/Forms/EditorForm.cs | 1 + FrEee.UI.WinForms/Forms/EmpireListForm.cs | 1 + FrEee.UI.WinForms/Forms/EmpireSetupForm.cs | 2 +- .../Forms/GameSetupForm.Designer.cs | 6 +- FrEee.UI.WinForms/Forms/GameSetupForm.cs | 6 +- FrEee.UI.WinForms/Forms/HostConsoleForm.cs | 1 + FrEee.UI.WinForms/Forms/HullPickerForm.cs | 1 + FrEee.UI.WinForms/Forms/LogForm.cs | 5 +- FrEee.UI.WinForms/Forms/MainGameForm.cs | 4 +- FrEee.UI.WinForms/Forms/MainMenuForm.cs | 4 +- FrEee.UI.WinForms/Forms/MinistersForm.cs | 1 + FrEee.UI.WinForms/Forms/ModPickerForm.cs | 1 + FrEee.UI.WinForms/Forms/PlanetListForm.cs | 1 + FrEee.UI.WinForms/Forms/RecycleForm.cs | 1 + .../Forms/ResearchForm.Designer.cs | 4 +- FrEee.UI.WinForms/Forms/ResearchForm.cs | 1 + FrEee.UI.WinForms/Forms/ScoresForm.cs | 1 + FrEee.UI.WinForms/Forms/StatusForm.cs | 1 + FrEee.UI.WinForms/Forms/TechTreeForm.cs | 1 + FrEee.UI.WinForms/Forms/VehicleDesignForm.cs | 1 + FrEee.UI.WinForms/FrEee.UI.WinForms.csproj | 4 +- FrEee.UI.WinForms/GamePropertyGrid.cs | 1 + FrEee.UI.WinForms/Objects/ClientSettings.cs | 1 + FrEee.UI.WinForms/Objects/Music.cs | 1 + FrEee.UI.WinForms/Program.cs | 1 + ...gies.WarpPointPlacementStrategy.datasource | 2 +- FrEee.sln | 42 +- FrEee/Objects/AI/AI.cs | 72 - FrEee/Objects/AI/CSAI.cs | 64 - FrEee/Objects/AI/PythonAI.cs | 26 - FrEee/Objects/Abilities/Ability.cs | 212 - FrEee/Objects/Abilities/AbilityRule.cs | 290 - .../Objects/Combat/BeamWeaponDisplayEffect.cs | 38 - FrEee/Objects/Combat/Grid/Battle.cs | 761 --- FrEee/Objects/Combat/Grid/BattleEvent.cs | 32 - .../Combat/Grid/CombatantAppearsEvent.cs | 15 - .../Combat/Grid/CombatantDestroyedEvent.cs | 11 - .../Combat/Grid/CombatantDisappearsEvent.cs | 14 - .../Combat/Grid/CombatantLaunchedEvent.cs | 24 - .../Combat/Grid/CombatantMovesEvent.cs | 10 - .../Combat/Grid/CombatantsCollideEvent.cs | 38 - FrEee/Objects/Combat/Grid/GroundBattle.cs | 90 - FrEee/Objects/Combat/Grid/IBattleEvent.cs | 10 - FrEee/Objects/Combat/Grid/SpaceBattle.cs | 137 - FrEee/Objects/Combat/Grid/WeaponFiresEvent.cs | 48 - FrEee/Objects/Combat/Hit.cs | 73 - FrEee/Objects/Combat/IBattle.cs | 21 - .../Combat/ProjectileWeaponDisplayEffect.cs | 38 - FrEee/Objects/Combat/Seeker.cs | 370 -- .../Combat/SeekerWeaponDisplayEffect.cs | 38 - FrEee/Objects/Combat/Shot.cs | 125 - FrEee/Objects/Combat/WeaponDisplayEffect.cs | 145 - FrEee/Serialization/GalaxyReference.cs | 182 - FrEee/Setup/EmpireTemplate.cs | 191 - FrEee/Setup/GameSetup.cs | 693 -- .../ClusteredStarSystemPlacementStrategy.cs | 62 - .../DiffuseStarSystemPlacementStrategy.cs | 30 - .../GridStarSystemPlacementStrategy.cs | 49 - .../RandomStarSystemPlacementStrategy.cs | 25 - .../SpiralStarSystemPlacementStrategy.cs | 33 - .../CenterWarpPointPlacementStrategy.cs | 26 - .../EdgeAlignedWarpPointPlacementStrategy.cs | 34 - .../PlanetWarpPointPlacementStrategy.cs | 35 - ...RandomAlignedWarpPointPlacementStrategy.cs | 35 - .../RandomWarpPointPlacementStrategy.cs | 28 - .../StarWarpPointPlacementStrategy.cs | 35 - .../WarpPointPlacementStrategy.cs | 101 - 545 files changed, 23133 insertions(+), 22834 deletions(-) rename {FrEee => FrEee.Core.Utility}/Extensions/EnumerableExtensions.cs (99%) rename {FrEee => FrEee.Core.Utility}/Extensions/MathExtensions.cs (97%) rename {FrEee => FrEee.Core.Utility}/Extensions/Parser.cs (98%) rename {FrEee => FrEee.Core.Utility}/Extensions/StringHandlingExtensions.cs (97%) create mode 100644 FrEee.Core.Utility/Extensions/TypeExtensions.cs rename {FrEee => FrEee.Core.Utility}/Extensions/UnitHandlingExtensions.cs (98%) create mode 100644 FrEee.Core.Utility/FrEee.Core.Utility.csproj create mode 100644 FrEee.Core.Utility/Serialization/DoNotSerializeAttribute.cs rename {FrEee => FrEee.Core.Utility}/Serialization/IData.cs (92%) rename {FrEee => FrEee.Core.Utility}/Serialization/IDataObject.cs (92%) rename {FrEee => FrEee.Core.Utility}/Serialization/IReferenceEnumerable.cs (74%) rename {FrEee => FrEee.Core.Utility}/Serialization/JsonContractResolver.cs (92%) rename {FrEee => FrEee.Core.Utility}/Serialization/Stringifiers/IStringifier.cs (78%) rename {FrEee => FrEee.Core.Utility}/Serialization/Stringifiers/PointStringifier.cs (85%) rename {FrEee => FrEee.Core.Utility}/Serialization/Stringifiers/SizeStringifier.cs (85%) rename {FrEee => FrEee.Core.Utility}/Serialization/Stringifiers/Stringifier.cs (87%) rename {FrEee => FrEee.Core.Utility}/Serialization/Stringifiers/StringifierLibrary.cs (89%) rename {FrEee => FrEee.Core.Utility}/Utility/ClientSafeAttribute.cs (94%) rename {FrEee => FrEee.Core.Utility}/Utility/ClientUtilities.cs (94%) create mode 100644 FrEee.Core.Utility/Utility/DoNotCopyAttribute.cs rename {FrEee => FrEee.Core.Utility}/Utility/DynamicDictionary.cs (95%) rename {FrEee => FrEee.Core.Utility}/Utility/HashCodeMasher.cs (64%) rename {FrEee => FrEee.Core.Utility}/Utility/HeatMap.cs (94%) rename {FrEee => FrEee.Core.Utility}/Utility/IPopulator.cs (94%) rename {FrEee => FrEee.Core.Utility}/Utility/MathX.cs (96%) rename {FrEee => FrEee.Core.Utility}/Utility/NameAttribute.cs (94%) rename {FrEee => FrEee.Core.Utility}/Utility/PRNG.cs (96%) rename {FrEee => FrEee.Core.Utility}/Utility/PopulateAttribute.cs (73%) rename {FrEee => FrEee.Core.Utility}/Utility/Progress.cs (58%) rename {FrEee => FrEee.Core.Utility}/Utility/ProgressDisplayMode.cs (83%) rename {FrEee => FrEee.Core.Utility}/Utility/RandomHelper.cs (96%) rename {FrEee => FrEee.Core.Utility}/Utility/SafeDictionary.cs (94%) rename {FrEee => FrEee.Core.Utility}/Utility/SafeType.cs (96%) rename {FrEee => FrEee.Core.Utility}/Utility/SequenceEqualityComparer.cs (95%) rename {FrEee => FrEee.Core.Utility}/Utility/Status.cs (93%) rename {FrEee => FrEee.Core.Utility}/Utility/Vector2.cs (95%) rename {FrEee => FrEee.Core.Utility}/Utility/Vector2Utility.cs (96%) rename {FrEee => FrEee.Core}/App.config (96%) rename {FrEee => FrEee.Core}/ClassDiagram1.cd (93%) rename {FrEee => FrEee.Core}/Extensions/ChecksExtensions.cs (82%) rename {FrEee => FrEee.Core}/Extensions/CommonExtensions.cs (83%) rename {FrEee => FrEee.Core}/Extensions/ComparisonExtensions.cs (100%) rename {FrEee => FrEee.Core}/Extensions/ConversionExtensions.cs (99%) rename {FrEee => FrEee.Core}/Extensions/CopyingExtensions.cs (99%) rename {FrEee => FrEee.Core}/Extensions/GameEnumerableExtensions.cs (99%) rename FrEee/FrEee.csproj => FrEee.Core/FrEee.Core.csproj (82%) rename {FrEee => FrEee.Core}/FrEee.csproj.old (100%) rename {FrEee => FrEee.Core}/FrEee.ico (100%) rename {FrEee => FrEee.Core}/FrEeeConstants.cs (96%) rename {FrEee => FrEee.Core}/FrEeeStrongName.snk (100%) create mode 100644 FrEee.Core/Modding/Abilities/Ability.cs create mode 100644 FrEee.Core/Modding/Abilities/AbilityRule.cs rename {FrEee/Objects => FrEee.Core/Modding}/Abilities/AbilityTargets.cs (96%) rename {FrEee/Objects => FrEee.Core/Modding}/Abilities/AbilityValueRule.cs (95%) rename FrEee/Extensions/AbilityExtensions.cs => FrEee.Core/Modding/Abilities/Extensions.cs (99%) rename {FrEee/Objects => FrEee.Core/Modding}/Abilities/IAbilityObject.cs (97%) rename {FrEee/Objects => FrEee.Core/Modding}/Abilities/ICommonAbilityObject.cs (92%) rename {FrEee/Objects => FrEee.Core/Modding}/Abilities/IOwnableAbilityObject.cs (84%) rename {FrEee => FrEee.Core}/Modding/ComputedFormula.cs (95%) rename {FrEee => FrEee.Core}/Modding/DamageType.cs (96%) rename {FrEee => FrEee.Core}/Modding/DataFile.cs (96%) rename {FrEee => FrEee.Core}/Modding/DataParsingException.cs (95%) rename {FrEee => FrEee.Core}/Modding/EmpireTraitRequirement.cs (96%) rename {FrEee => FrEee.Core}/Modding/EventMessageTarget.cs (100%) rename {FrEee => FrEee.Core}/Modding/EventSeverity.cs (100%) rename {FrEee => FrEee.Core}/Modding/EventTemplate.cs (95%) rename {FrEee => FrEee.Core}/Modding/EventType.cs (95%) rename {FrEee => FrEee.Core}/Modding/Field.cs (96%) rename {FrEee => FrEee.Core}/Modding/Formula.cs (96%) rename {FrEee => FrEee.Core}/Modding/FormulaContext.cs (95%) rename {FrEee => FrEee.Core}/Modding/FormulaType.cs (100%) rename {FrEee => FrEee.Core}/Modding/IFormula.cs (96%) rename {FrEee => FrEee.Core}/Modding/IFormulaHost.cs (100%) rename {FrEee => FrEee.Core}/Modding/IModObject.cs (100%) rename {FrEee => FrEee.Core}/Modding/LiteralFormula.cs (94%) rename {FrEee => FrEee.Core}/Modding/Loaders/AbilityLoader.cs (95%) rename {FrEee => FrEee.Core}/Modding/Loaders/AbilityRuleLoader.cs (94%) rename {FrEee => FrEee.Core}/Modding/Loaders/ComponentLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/CultureLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/DamageTypeLoader.cs (97%) rename {FrEee => FrEee.Core}/Modding/Loaders/DataFileLoader.cs (95%) rename {FrEee => FrEee.Core}/Modding/Loaders/DesignRoleLoader.cs (95%) rename {FrEee => FrEee.Core}/Modding/Loaders/EmpireAILoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/EventLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/EventTypeLoader.cs (94%) rename {FrEee => FrEee.Core}/Modding/Loaders/FacilityLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/GalaxyLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/HappinessModelLoader.cs (97%) rename {FrEee => FrEee.Core}/Modding/Loaders/HullLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/ILoader.cs (95%) rename {FrEee => FrEee.Core}/Modding/Loaders/ModInfoLoader.cs (95%) rename {FrEee => FrEee.Core}/Modding/Loaders/ModSettingsLoader.cs (97%) rename {FrEee => FrEee.Core}/Modding/Loaders/MountLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/PopulationModifierLoader.cs (97%) rename {FrEee => FrEee.Core}/Modding/Loaders/RequirementLoader.cs (97%) rename {FrEee => FrEee.Core}/Modding/Loaders/ScriptLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/StarSystemLoader.cs (97%) rename {FrEee => FrEee.Core}/Modding/Loaders/StellarAbilityLoader.cs (95%) rename {FrEee => FrEee.Core}/Modding/Loaders/StellarObjectLoader.cs (97%) rename {FrEee => FrEee.Core}/Modding/Loaders/StellarObjectSizeLoader.cs (97%) rename {FrEee => FrEee.Core}/Modding/Loaders/TechnologyLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/TextLoader.cs (96%) rename {FrEee => FrEee.Core}/Modding/Loaders/TraitLoader.cs (95%) rename {FrEee => FrEee.Core}/Modding/MetaRecord.cs (96%) rename {FrEee => FrEee.Core}/Modding/MetaRecordParameter.cs (95%) rename {FrEee => FrEee.Core}/Modding/Mod.cs (96%) rename {FrEee => FrEee.Core}/Modding/ModInfo.cs (95%) create mode 100644 FrEee.Core/Modding/ModProgress.cs rename {FrEee => FrEee.Core}/Modding/ModReference.cs (96%) create mode 100644 FrEee.Core/Modding/ModReferenceKeyedDictionary.cs create mode 100644 FrEee.Core/Modding/ModReferenceList.cs create mode 100644 FrEee.Core/Modding/ModReferenceSet.cs rename {FrEee => FrEee.Core}/Modding/ModSettings.cs (96%) rename {FrEee => FrEee.Core}/Modding/ObjectFormula.cs (95%) rename {FrEee => FrEee.Core}/Modding/PopulationModifier.cs (97%) rename {FrEee => FrEee.Core}/Modding/Record.cs (97%) rename {FrEee => FrEee.Core}/Modding/Requirement.cs (96%) rename {FrEee => FrEee.Core}/Modding/RequirementType.cs (100%) rename {FrEee => FrEee.Core}/Modding/ResourceFormula.cs (95%) rename {FrEee => FrEee.Core}/Modding/Scripts/CSScript.cs (99%) rename {FrEee => FrEee.Core}/Modding/Scripts/IScript.cs (100%) rename {FrEee => FrEee.Core}/Modding/Scripts/PythonScript.cs (99%) rename {FrEee => FrEee.Core}/Modding/Scripts/PythonScriptEngine.cs (98%) rename {FrEee => FrEee.Core}/Modding/Scripts/ScriptRequirement.cs (100%) rename {FrEee => FrEee.Core}/Modding/StellarObjectLocations/CircleRadiusStellarObjectLocation.cs (96%) rename {FrEee => FrEee.Core}/Modding/StellarObjectLocations/CoordStellarObjectLocation.cs (97%) rename {FrEee => FrEee.Core}/Modding/StellarObjectLocations/IStellarObjectLocation.cs (97%) rename {FrEee => FrEee.Core}/Modding/StellarObjectLocations/RingStellarObjectLocation.cs (96%) rename {FrEee => FrEee.Core}/Modding/StellarObjectLocations/SameAsStellarObjectLocation.cs (97%) rename {FrEee => FrEee.Core}/Modding/StellarObjectSize.cs (96%) rename {FrEee => FrEee.Core}/Modding/Templates/AsteroidFieldTemplate.cs (96%) rename {FrEee => FrEee.Core}/Modding/Templates/ComponentTemplate.cs (94%) rename {FrEee => FrEee.Core}/Modding/Templates/FacilityTemplate.cs (94%) rename {FrEee => FrEee.Core}/Modding/Templates/GalaxyTemplate.cs (96%) rename {FrEee => FrEee.Core}/Modding/Templates/PlanetTemplate.cs (96%) rename {FrEee => FrEee.Core}/Modding/Templates/RandomAbilityTemplate.cs (93%) rename {FrEee => FrEee.Core}/Modding/Templates/StarSystemTemplate.cs (95%) rename {FrEee => FrEee.Core}/Modding/Templates/StarTemplate.cs (96%) rename {FrEee => FrEee.Core}/Modding/Templates/StormTemplate.cs (95%) rename {FrEee => FrEee.Core}/Objects/Civilization/Aptitude.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/CargoStorage/Cargo.cs (98%) rename {FrEee => FrEee.Core}/Objects/Civilization/CargoStorage/CargoDelta.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/CargoStorage/ICargoContainer.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/CargoStorage/ICargoTransferrer.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Colony.cs (98%) rename {FrEee => FrEee.Core}/Objects/Civilization/Construction/ConstructionQueue.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/Construction/IConstructable.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Construction/IConstructionOrder.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Construction/IConstructionTemplate.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Construction/IConstructor.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Culture.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Actions/AcceptProposalAction.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Actions/BreakTreatyAction.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Actions/DeclareWarAction.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Actions/DiplomaticAction.cs (95%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Actions/RejectProposalAction.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/AllianceLevel.cs (98%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/AllowedTrades.cs (95%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/AllianceClause.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/Clause.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/CooperativeResearchClause.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/FreeTradeClause.cs (98%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/ShareAbilityClause.cs (95%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/ShareCombatLogsClause.cs (91%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/ShareDesignsClause.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/ShareVisionClause.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/SharingPriority.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Clauses/TributeClause.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Messages/ActionMessage.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Messages/GeneralMessage.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Messages/IMessage.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Messages/Message.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Messages/ProposalMessage.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Package.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Proposal.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Diplomacy/Relations.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Empire.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/EmpireStatus.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/HappinessModel.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/IIncomeProducer.cs (96%) rename {FrEee => FrEee.Core}/Objects/Civilization/INameable.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/IOrderable.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/IOwnable.cs (92%) rename {FrEee => FrEee.Core}/Objects/Civilization/Mood.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/ActivateAbilityOrder.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/ColonizeOrder.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/ConstructionOrder.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/EvadeOrder.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/IMovementOrder.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/IOrder.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/IPathfindingOrder.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/IRecyclable.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/IRecycleBehavior.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/MoveOrder.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/PathfindingOrder.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/PursueOrder.cs (95%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/RecycleBehaviors/ScrapBehavior.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/RecycleFacilityOrCargoOrder.cs (98%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/RecycleVehicleInSpaceOrder.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/SentryOrder.cs (98%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/TransferCargoOrder.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/UpgradeFacilityOrder.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/WarpOrder.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Orders/WaypointOrder.cs (99%) rename {FrEee => FrEee.Core}/Objects/Civilization/PlayerInfo.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/Race.cs (98%) rename {FrEee => FrEee.Core}/Objects/Civilization/SectorWaypoint.cs (100%) rename {FrEee => FrEee.Core}/Objects/Civilization/SpaceObjectWaypoint.cs (96%) rename {FrEee => FrEee.Core}/Objects/Civilization/Trait.cs (97%) rename {FrEee => FrEee.Core}/Objects/Civilization/Waypoint.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/AddOrderCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/ClearPlayerNoteCommand.cs (96%) rename {FrEee => FrEee.Core}/Objects/Commands/ClearPrivateNameCommand.cs (95%) rename {FrEee => FrEee.Core}/Objects/Commands/Command.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/CreateDesignCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/CreateFleetCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/CreateWaypointCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/DeleteMessageCommand.cs (96%) rename {FrEee => FrEee.Core}/Objects/Commands/DeleteWaypointCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/DisbandFleetCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/EditStrategyCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/HotkeyWaypointCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/ICommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/ICreateDesignCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/IOrderCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/JoinFleetCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/LeaveFleetCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/MinisterToggleCommand.cs (94%) rename {FrEee => FrEee.Core}/Objects/Commands/OrderCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/RearrangeOrdersCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/RemoveOrderCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/ResearchCommand.cs (98%) rename {FrEee => FrEee.Core}/Objects/Commands/SendMessageCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/SetObsoleteFlagCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/SetPlayerInfoCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/SetPlayerNoteCommand.cs (95%) rename {FrEee => FrEee.Core}/Objects/Commands/SetPrivateNameCommand.cs (96%) rename {FrEee => FrEee.Core}/Objects/Commands/SetPublicNameCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/ToggleOrdersOnHoldCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Commands/ToggleRepeatOrdersCommand.cs (100%) rename {FrEee => FrEee.Core}/Objects/Events/Event.cs (98%) rename {FrEee => FrEee.Core}/Objects/Events/EventMessage.cs (100%) rename {FrEee => FrEee.Core}/Objects/GameState/Galaxy.cs (99%) create mode 100644 FrEee.Core/Objects/GameState/GalaxyProgress.cs create mode 100644 FrEee.Core/Objects/GameState/GalaxyReference.cs create mode 100644 FrEee.Core/Objects/GameState/GalaxyReferenceKeyedDictionary.cs create mode 100644 FrEee.Core/Objects/GameState/GalaxyReferenceList.cs create mode 100644 FrEee.Core/Objects/GameState/GalaxyReferenceSet.cs rename {FrEee => FrEee.Core}/Objects/GameState/ICleanable.cs (100%) rename {FrEee => FrEee.Core}/Objects/GameState/IContainable.cs (93%) rename {FrEee => FrEee.Core}/Objects/GameState/IFoggable.cs (100%) rename {FrEee => FrEee.Core}/Objects/GameState/INamed.cs (100%) rename {FrEee => FrEee.Core}/Objects/GameState/IPictorial.cs (100%) rename {FrEee => FrEee.Core}/Objects/GameState/IPromotable.cs (100%) rename {FrEee => FrEee.Core}/Objects/GameState/ITemplate.cs (100%) rename {FrEee => FrEee.Core}/Objects/GameState/IUnlockable.cs (100%) rename {FrEee => FrEee.Core}/Objects/GameState/Visibility.cs (100%) rename {FrEee => FrEee.Core}/Objects/LogMessages/GenericLogMessage.cs (100%) rename {FrEee => FrEee.Core}/Objects/LogMessages/IPictorialLogMessage.cs (100%) rename {FrEee => FrEee.Core}/Objects/LogMessages/LogMessage.cs (100%) rename {FrEee => FrEee.Core}/Objects/LogMessages/PictorialLogMessage.cs (100%) rename {FrEee => FrEee.Core}/Objects/SimulatedObjectWrappers.cs (97%) rename {FrEee => FrEee.Core}/Objects/Space/AsteroidField.cs (97%) rename {FrEee => FrEee.Core}/Objects/Space/Conditions.cs (100%) rename {FrEee => FrEee.Core}/Objects/Space/Fleet.cs (99%) rename {FrEee => FrEee.Core}/Objects/Space/ILocated.cs (100%) rename {FrEee => FrEee.Core}/Objects/Space/IMineableSpaceObject.cs (100%) rename {FrEee => FrEee.Core}/Objects/Space/IMobileSpaceObject.cs (97%) rename {FrEee => FrEee.Core}/Objects/Space/ISpaceObject.cs (98%) rename {FrEee => FrEee.Core}/Objects/Space/IStellarObject.cs (96%) rename {FrEee => FrEee.Core}/Objects/Space/ObjectLocation.cs (100%) rename {FrEee => FrEee.Core}/Objects/Space/Planet.cs (99%) rename {FrEee => FrEee.Core}/Objects/Space/Sector.cs (99%) rename {FrEee => FrEee.Core}/Objects/Space/Star.cs (96%) rename {FrEee => FrEee.Core}/Objects/Space/StarSystem.cs (99%) rename {FrEee => FrEee.Core}/Objects/Space/StellarObject.cs (98%) rename {FrEee => FrEee.Core}/Objects/Space/StellarSize.cs (100%) rename {FrEee => FrEee.Core}/Objects/Space/Storm.cs (93%) rename {FrEee => FrEee.Core}/Objects/Space/WarpPoint.cs (97%) rename {FrEee => FrEee.Core}/Objects/Technology/Component.cs (98%) rename {FrEee => FrEee.Core}/Objects/Technology/ComponentReference.cs (100%) rename {FrEee => FrEee.Core}/Objects/Technology/DirectFireWeaponInfo.cs (93%) rename {FrEee => FrEee.Core}/Objects/Technology/Facility.cs (98%) rename {FrEee => FrEee.Core}/Objects/Technology/FacilityUpgrade.cs (98%) rename {FrEee => FrEee.Core}/Objects/Technology/Hull.cs (98%) rename {FrEee => FrEee.Core}/Objects/Technology/IHull.cs (98%) rename {FrEee => FrEee.Core}/Objects/Technology/IResearchable.cs (100%) rename {FrEee => FrEee.Core}/Objects/Technology/IUpgradeable.cs (100%) rename {FrEee => FrEee.Core}/Objects/Technology/Mount.cs (98%) rename {FrEee => FrEee.Core}/Objects/Technology/MountedComponentTemplate.cs (98%) rename {FrEee => FrEee.Core}/Objects/Technology/MountedComponentTemplateContainerPopulator.cs (96%) rename {FrEee => FrEee.Core}/Objects/Technology/SeekingWeaponInfo.cs (94%) rename {FrEee => FrEee.Core}/Objects/Technology/Technology.cs (99%) rename {FrEee => FrEee.Core}/Objects/Technology/TechnologyCost.cs (100%) rename {FrEee => FrEee.Core}/Objects/Technology/TechnologyRequirement.cs (98%) rename {FrEee => FrEee.Core}/Objects/Technology/WarheadWeaponInfo.cs (90%) rename {FrEee => FrEee.Core}/Objects/Technology/WeaponInfo.cs (97%) rename {FrEee => FrEee.Core}/Objects/Vehicles/Base.cs (95%) rename {FrEee => FrEee.Core}/Objects/Vehicles/Design.cs (99%) rename {FrEee => FrEee.Core}/Objects/Vehicles/Drone.cs (95%) rename {FrEee => FrEee.Core}/Objects/Vehicles/Fighter.cs (94%) rename {FrEee => FrEee.Core}/Objects/Vehicles/IDesign.cs (99%) rename {FrEee => FrEee.Core}/Objects/Vehicles/IUnit.cs (100%) rename {FrEee => FrEee.Core}/Objects/Vehicles/IVehicle.cs (90%) rename {FrEee => FrEee.Core}/Objects/Vehicles/MajorSpaceVehicle.cs (99%) rename {FrEee => FrEee.Core}/Objects/Vehicles/Mine.cs (95%) rename {FrEee => FrEee.Core}/Objects/Vehicles/Satellite.cs (95%) rename {FrEee => FrEee.Core}/Objects/Vehicles/Ship.cs (89%) rename {FrEee => FrEee.Core}/Objects/Vehicles/SpaceVehicle.cs (98%) rename {FrEee => FrEee.Core}/Objects/Vehicles/Troop.cs (96%) rename {FrEee => FrEee.Core}/Objects/Vehicles/Vehicle.cs (99%) rename {FrEee => FrEee.Core}/Objects/Vehicles/VehicleTypes.cs (97%) rename {FrEee => FrEee.Core}/Objects/Vehicles/WeaponPlatform.cs (96%) rename {FrEee => FrEee.Core}/Objects/VictoryConditions/IVictoryCondition.cs (100%) rename {FrEee => FrEee.Core}/Objects/VictoryConditions/MajorEmpireEliminationVictoryCondition.cs (100%) rename {FrEee => FrEee.Core}/Objects/VictoryConditions/PeaceVictoryCondition.cs (100%) rename {FrEee => FrEee.Core}/Objects/VictoryConditions/ScorePercentageVictoryCondition.cs (100%) rename {FrEee => FrEee.Core}/Objects/VictoryConditions/ScoreVictoryCondition.cs (100%) rename {FrEee => FrEee.Core}/Objects/VictoryConditions/SurvivalVictoryCondition.cs (100%) rename {FrEee => FrEee.Core}/Objects/VictoryConditions/TechnologyVictoryCondition.cs (100%) rename {FrEee => FrEee.Core}/Objects/VictoryConditions/TotalEliminationVictoryCondition.cs (100%) create mode 100644 FrEee.Core/Processes/AI/AI.cs create mode 100644 FrEee.Core/Processes/AI/CSAI.cs create mode 100644 FrEee.Core/Processes/AI/PythonAI.cs create mode 100644 FrEee.Core/Processes/Combat/BeamWeaponDisplayEffect.cs rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/Battle_Space.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/CombatPlanet.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/CombatReplayLog.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/CombatSeeker.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/CombatShot.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/CombatVehicle.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/CombatWeapon.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/ControlledCombatObject.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/StrategyBlocks.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/StrategyObject.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/Tactics/Tactic.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/Tactics/TacticBlock.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/Tactics/TacticNode.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/combatObjects.cs (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/lib/FixMath.dll (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/lib/FixMath.pdb (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/lib/NewtMath.dll (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/lib/NewtMath.pdb (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/lib/nunit.framework.dll (100%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Combat2/lib/nunit.framework.xml (100%) create mode 100644 FrEee.Core/Processes/Combat/Grid/Battle.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/BattleEvent.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/CombatantAppearsEvent.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/CombatantDestroyedEvent.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/CombatantDisappearsEvent.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/CombatantLaunchedEvent.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/CombatantMovesEvent.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/CombatantsCollideEvent.cs rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Grid/Extensions.cs (100%) create mode 100644 FrEee.Core/Processes/Combat/Grid/GroundBattle.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/IBattleEvent.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/SpaceBattle.cs create mode 100644 FrEee.Core/Processes/Combat/Grid/WeaponFiresEvent.cs create mode 100644 FrEee.Core/Processes/Combat/Hit.cs create mode 100644 FrEee.Core/Processes/Combat/IBattle.cs rename {FrEee/Objects => FrEee.Core/Processes}/Combat/ICombatSpaceObject.cs (83%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/ICombatant.cs (98%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/IDamageable.cs (96%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/ITargetable.cs (92%) create mode 100644 FrEee.Core/Processes/Combat/ProjectileWeaponDisplayEffect.cs create mode 100644 FrEee.Core/Processes/Combat/Seeker.cs create mode 100644 FrEee.Core/Processes/Combat/SeekerWeaponDisplayEffect.cs create mode 100644 FrEee.Core/Processes/Combat/Shot.cs rename {FrEee/Objects => FrEee.Core/Processes}/Combat/Simple/Battle.cs (100%) create mode 100644 FrEee.Core/Processes/Combat/WeaponDisplayEffect.cs rename {FrEee/Objects => FrEee.Core/Processes}/Combat/WeaponTargets.cs (92%) rename {FrEee/Objects => FrEee.Core/Processes}/Combat/WeaponTypes.cs (96%) rename {FrEee => FrEee.Core/Processes}/Setup/EmpirePlacement.cs (79%) create mode 100644 FrEee.Core/Processes/Setup/EmpireTemplate.cs create mode 100644 FrEee.Core/Processes/Setup/GameSetup.cs rename {FrEee => FrEee.Core/Processes}/Setup/ScoreDisplay.cs (87%) create mode 100644 FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/ClusteredStarSystemPlacementStrategy.cs create mode 100644 FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/DiffuseStarSystemPlacementStrategy.cs create mode 100644 FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/GridStarSystemPlacementStrategy.cs rename {FrEee => FrEee.Core/Processes}/Setup/StarSystemPlacementStrategies/IStarSystemPlacementStrategy.cs (90%) create mode 100644 FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/RandomStarSystemPlacementStrategy.cs create mode 100644 FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/SpiralStarSystemPlacementStrategy.cs rename {FrEee => FrEee.Core/Processes}/Setup/StartingTechnologyLevel.cs (65%) create mode 100644 FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/CenterWarpPointPlacementStrategy.cs create mode 100644 FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/EdgeAlignedWarpPointPlacementStrategy.cs create mode 100644 FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/PlanetWarpPointPlacementStrategy.cs create mode 100644 FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/RandomAlignedWarpPointPlacementStrategy.cs create mode 100644 FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/RandomWarpPointPlacementStrategy.cs create mode 100644 FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/StarWarpPointPlacementStrategy.cs create mode 100644 FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/WarpPointPlacementStrategy.cs rename {FrEee => FrEee.Core}/Processes/TurnProcessor.cs (99%) rename {FrEee => FrEee.Core}/Properties/DataSources/FrEee.Game.Space.Planet.datasource (94%) rename {FrEee => FrEee.Core}/Properties/Resources.Designer.cs (97%) rename {FrEee => FrEee.Core}/Properties/Resources.resources (50%) rename {FrEee => FrEee.Core}/Properties/Resources.resx (97%) rename {FrEee => FrEee.Core}/Properties/Settings.Designer.cs (97%) rename {FrEee => FrEee.Core}/Properties/Settings.settings (97%) rename {FrEee => FrEee.Core}/Serialization/DataReference.cs (97%) rename {FrEee => FrEee.Core}/Serialization/DataScalar.cs (94%) rename {FrEee => FrEee.Core}/Serialization/JsonSerializer.cs (99%) rename {FrEee => FrEee.Core}/Serialization/LegacySerializer.cs (99%) rename {FrEee => FrEee.Core}/Serialization/ObjectGraphParser.cs (94%) rename {FrEee => FrEee.Core}/Serialization/Serializer.cs (90%) rename {FrEee => FrEee.Core}/Serialization/SimpleDataObject.cs (98%) rename {FrEee => FrEee.Core}/Serialization/Stringifiers/DoubleLiteralFormulaStringifier.cs (91%) rename {FrEee => FrEee.Core}/Serialization/Stringifiers/IntLiteralFormulaStringifier.cs (91%) rename {FrEee => FrEee.Core}/Serialization/Stringifiers/PopulationModifierStringifier.cs (94%) rename {FrEee => FrEee.Core}/Serialization/Stringifiers/ResourceQuantityStringifier.cs (90%) rename {FrEee => FrEee.Core}/Serialization/Stringifiers/StringLiteralFormulaStringifier.cs (91%) rename {FrEee => FrEee.Core}/Utility/ClientSideCache.cs (93%) rename {FrEee => FrEee.Core}/Utility/ConnectivityGraph.cs (95%) rename {FrEee/Serialization => FrEee.Core/Utility}/IReference.cs (100%) rename {FrEee/Serialization => FrEee.Core/Utility}/IReferrable.cs (100%) rename {FrEee => FrEee.Core}/Utility/Library.cs (96%) rename {FrEee => FrEee.Core}/Utility/MiningModel.cs (95%) rename {FrEee => FrEee.Core}/Utility/Pathfinder.cs (96%) rename {FrEee => FrEee.Core}/Utility/Pictures.cs (97%) create mode 100644 FrEee.Core/Utility/Progress.cs rename {FrEee/Serialization => FrEee.Core/Utility}/ReferenceKeyedDictionary.cs (79%) rename {FrEee/Serialization => FrEee.Core/Utility}/ReferenceList.cs (91%) rename {FrEee/Serialization => FrEee.Core/Utility}/ReferenceSet.cs (88%) rename {FrEee => FrEee.Core}/Utility/Resource.cs (95%) rename {FrEee => FrEee.Core}/Utility/ResourceProgress.cs (96%) rename {FrEee => FrEee.Core}/Utility/ResourceQuantity.cs (95%) rename {FrEee => FrEee.Core}/xbuild.sh (100%) mode change 100755 => 100644 delete mode 100644 FrEee.Tests/Objects/Combat/DamageTypesTest.cs create mode 100644 FrEee.Tests/Processes/Combat/DamageTypesTest.cs delete mode 100644 FrEee/Objects/AI/AI.cs delete mode 100644 FrEee/Objects/AI/CSAI.cs delete mode 100644 FrEee/Objects/AI/PythonAI.cs delete mode 100644 FrEee/Objects/Abilities/Ability.cs delete mode 100644 FrEee/Objects/Abilities/AbilityRule.cs delete mode 100644 FrEee/Objects/Combat/BeamWeaponDisplayEffect.cs delete mode 100644 FrEee/Objects/Combat/Grid/Battle.cs delete mode 100644 FrEee/Objects/Combat/Grid/BattleEvent.cs delete mode 100644 FrEee/Objects/Combat/Grid/CombatantAppearsEvent.cs delete mode 100644 FrEee/Objects/Combat/Grid/CombatantDestroyedEvent.cs delete mode 100644 FrEee/Objects/Combat/Grid/CombatantDisappearsEvent.cs delete mode 100644 FrEee/Objects/Combat/Grid/CombatantLaunchedEvent.cs delete mode 100644 FrEee/Objects/Combat/Grid/CombatantMovesEvent.cs delete mode 100644 FrEee/Objects/Combat/Grid/CombatantsCollideEvent.cs delete mode 100644 FrEee/Objects/Combat/Grid/GroundBattle.cs delete mode 100644 FrEee/Objects/Combat/Grid/IBattleEvent.cs delete mode 100644 FrEee/Objects/Combat/Grid/SpaceBattle.cs delete mode 100644 FrEee/Objects/Combat/Grid/WeaponFiresEvent.cs delete mode 100644 FrEee/Objects/Combat/Hit.cs delete mode 100644 FrEee/Objects/Combat/IBattle.cs delete mode 100644 FrEee/Objects/Combat/ProjectileWeaponDisplayEffect.cs delete mode 100644 FrEee/Objects/Combat/Seeker.cs delete mode 100644 FrEee/Objects/Combat/SeekerWeaponDisplayEffect.cs delete mode 100644 FrEee/Objects/Combat/Shot.cs delete mode 100644 FrEee/Objects/Combat/WeaponDisplayEffect.cs delete mode 100644 FrEee/Serialization/GalaxyReference.cs delete mode 100644 FrEee/Setup/EmpireTemplate.cs delete mode 100644 FrEee/Setup/GameSetup.cs delete mode 100644 FrEee/Setup/StarSystemPlacementStrategies/ClusteredStarSystemPlacementStrategy.cs delete mode 100644 FrEee/Setup/StarSystemPlacementStrategies/DiffuseStarSystemPlacementStrategy.cs delete mode 100644 FrEee/Setup/StarSystemPlacementStrategies/GridStarSystemPlacementStrategy.cs delete mode 100644 FrEee/Setup/StarSystemPlacementStrategies/RandomStarSystemPlacementStrategy.cs delete mode 100644 FrEee/Setup/StarSystemPlacementStrategies/SpiralStarSystemPlacementStrategy.cs delete mode 100644 FrEee/Setup/WarpPointPlacementStrategies/CenterWarpPointPlacementStrategy.cs delete mode 100644 FrEee/Setup/WarpPointPlacementStrategies/EdgeAlignedWarpPointPlacementStrategy.cs delete mode 100644 FrEee/Setup/WarpPointPlacementStrategies/PlanetWarpPointPlacementStrategy.cs delete mode 100644 FrEee/Setup/WarpPointPlacementStrategies/RandomAlignedWarpPointPlacementStrategy.cs delete mode 100644 FrEee/Setup/WarpPointPlacementStrategies/RandomWarpPointPlacementStrategy.cs delete mode 100644 FrEee/Setup/WarpPointPlacementStrategies/StarWarpPointPlacementStrategy.cs delete mode 100644 FrEee/Setup/WarpPointPlacementStrategies/WarpPointPlacementStrategy.cs diff --git a/FrEee.Assets/CommonProjectProperties.xml b/FrEee.Assets/CommonProjectProperties.xml index f0ffa0fe1..3e37b36ab 100644 --- a/FrEee.Assets/CommonProjectProperties.xml +++ b/FrEee.Assets/CommonProjectProperties.xml @@ -4,7 +4,7 @@ FrEee 0.0.9 Copyright © 2013-2024 - FrEee.ico + ../FrEee.Assets/FrEee.ico enable \ No newline at end of file diff --git a/FrEee.Assets/GameSetups/Quickstart.gsu b/FrEee.Assets/GameSetups/Quickstart.gsu index ba6e1f651..50c91d3d0 100644 --- a/FrEee.Assets/GameSetups/Quickstart.gsu +++ b/FrEee.Assets/GameSetups/Quickstart.gsu @@ -1,4 +1,4 @@ -FrEee.Setup.GameSetup, FrEee.Core: +FrEee.Processes.Setup.GameSetup, FrEee.Core: p31: AllowedTrades: :All; @@ -7,7 +7,7 @@ p31: EmpirePoints: :2000; EmpireTemplates: - System.Collections.Generic.List`1[[FrEee.Setup.EmpireTemplate, FrEee.Core]], System.Private.CoreLib: + System.Collections.Generic.List`1[[FrEee.Processes.Setup.EmpireTemplate, FrEee.Core]], System.Private.CoreLib: c1: :p10: AIName: @@ -181,7 +181,7 @@ p31: ; ; WarpPointPlacementStrategy: - FrEee.Setup.WarpPointPlacementStrategies.EdgeAlignedWarpPointPlacementStrategy, FrEee.Core: + FrEee.Processes.Setup.WarpPointPlacementStrategies.EdgeAlignedWarpPointPlacementStrategy, FrEee.Core: p2: Description: :"Places warp points along the edge of the system, aligned with the star systems they lead to."; diff --git a/FrEee/Extensions/EnumerableExtensions.cs b/FrEee.Core.Utility/Extensions/EnumerableExtensions.cs similarity index 99% rename from FrEee/Extensions/EnumerableExtensions.cs rename to FrEee.Core.Utility/Extensions/EnumerableExtensions.cs index 0c20133c6..0041872f4 100644 --- a/FrEee/Extensions/EnumerableExtensions.cs +++ b/FrEee.Core.Utility/Extensions/EnumerableExtensions.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using FrEee.Extensions; using FrEee.Utility; + namespace FrEee.Extensions; /// diff --git a/FrEee/Extensions/MathExtensions.cs b/FrEee.Core.Utility/Extensions/MathExtensions.cs similarity index 97% rename from FrEee/Extensions/MathExtensions.cs rename to FrEee.Core.Utility/Extensions/MathExtensions.cs index 98cdecd28..b9656b357 100644 --- a/FrEee/Extensions/MathExtensions.cs +++ b/FrEee.Core.Utility/Extensions/MathExtensions.cs @@ -4,6 +4,10 @@ using System.Linq; using System.Numerics; using FrEee.Utility; +using FrEee.Extensions; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Extensions; namespace FrEee.Extensions; public static class MathExtensions diff --git a/FrEee/Extensions/Parser.cs b/FrEee.Core.Utility/Extensions/Parser.cs similarity index 98% rename from FrEee/Extensions/Parser.cs rename to FrEee.Core.Utility/Extensions/Parser.cs index 0f85493f4..2197366c4 100644 --- a/FrEee/Extensions/Parser.cs +++ b/FrEee.Core.Utility/Extensions/Parser.cs @@ -3,6 +3,8 @@ using System.Linq; using System.Reflection; using FrEee.Utility; +using FrEee.Extensions; +using FrEee.Extensions; namespace FrEee.Extensions; /// diff --git a/FrEee/Extensions/StringHandlingExtensions.cs b/FrEee.Core.Utility/Extensions/StringHandlingExtensions.cs similarity index 97% rename from FrEee/Extensions/StringHandlingExtensions.cs rename to FrEee.Core.Utility/Extensions/StringHandlingExtensions.cs index 083b8c20b..df67e03bf 100644 --- a/FrEee/Extensions/StringHandlingExtensions.cs +++ b/FrEee.Core.Utility/Extensions/StringHandlingExtensions.cs @@ -1,4 +1,6 @@ using System.Linq; +using FrEee.Extensions; +using FrEee.Extensions; namespace FrEee.Extensions; @@ -90,4 +92,4 @@ public static string Possessive(this string s, bool isStart = false) return s + "'"; return s + "'s"; } -} \ No newline at end of file +} diff --git a/FrEee.Core.Utility/Extensions/TypeExtensions.cs b/FrEee.Core.Utility/Extensions/TypeExtensions.cs new file mode 100644 index 000000000..0b78de217 --- /dev/null +++ b/FrEee.Core.Utility/Extensions/TypeExtensions.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; +using FrEee.Extensions; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Extensions; + +public static class TypeExtensions +{ + private static SafeDictionary> attributeCache = new SafeDictionary>(); + + private static SafeDictionary> interfaceCache = new SafeDictionary>(); + + private static SafeDictionary> memberCache = new SafeDictionary>(); + + public static object Instantiate(this Type type, params object[] args) + { + if (type.GetConstructors().Where(c => c.GetParameters().Length == (args == null ? 0 : args.Length)).Any()) + return Activator.CreateInstance(type, args) ?? throw new NullReferenceException($"Couldn't create instance of type {type}."); + else + return FormatterServices.GetSafeUninitializedObject(type); + } + + public static T Instantiate(params object[] args) + { + return (T)typeof(T).Instantiate(args); + } + + /// + /// Equals method that doesn't throw an exception when objects are null. + /// Null is not equal to anything else, except other nulls. + /// + /// + /// + /// + public static bool SafeEquals(this object o1, object o2) + { + if (o1 == null && o2 == null) + return true; + if (o1 == null || o2 == null) + return false; + return o1.Equals(o2); + } + + public static bool SafeSequenceEqual(this IEnumerable e1, IEnumerable e2) + { + if (e1.SafeEquals(null) && e2.SafeEquals(null)) + return true; + if (e1.SafeEquals(null) || e2.SafeEquals(null)) + return false; + return e1.SequenceEqual(e2); + } + + /// + /// Checks for attributes in a class or its interfaces. + /// + /// + /// + /// + public static bool HasAttribute(this MemberInfo mi) + { + return mi.HasAttribute(typeof(T)); + } + + /// + /// Checks for attributes in a class or its interfaces. + /// + /// + /// + /// + public static bool HasAttribute(this MemberInfo mi, Type attributeType, bool checkInterfaces = true) + { + if (attributeCache[mi] == null) + attributeCache[mi] = Attribute.GetCustomAttributes(mi).ToArray(); + if (attributeCache[mi].Where(a => attributeType.IsAssignableFrom(a.GetType())).Any()) + return true; + var dt = mi is Type ? mi as Type : mi.DeclaringType; + if (checkInterfaces) + { + if (interfaceCache[dt] == null) + interfaceCache[dt] = dt.GetInterfaces(); + foreach (var i in interfaceCache[dt]) + { + if (memberCache[i] == null) + memberCache[i] = i.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).ToArray(); // TODO - refactor into method + if (memberCache[i].Any(m => m.Name == mi.Name && m.MemberType == mi.MemberType && m.HasAttribute(attributeType, false))) // no need to check interfaces of interfaces, they're already listed by GetInterfaces + return true; + } + } + return false; + } + + public static bool HasProperty(this ExpandoObject obj, string propertyName) + { + return obj.GetType().GetProperty(propertyName) != null; + } + + /// + /// Checks for attributes in a class or its interfaces. + /// + /// + /// + /// + public static IEnumerable GetAttributes(this MemberInfo mi) where T : Attribute + { + if (attributeCache[mi] == null) + attributeCache[mi] = Attribute.GetCustomAttributes(mi).ToArray(); + var atts = attributeCache[mi].OfType(); + foreach (var att in atts) + yield return att; + if (interfaceCache[mi.DeclaringType] == null) + interfaceCache[mi.DeclaringType] = mi.DeclaringType.GetInterfaces(); + foreach (var i in interfaceCache[mi.DeclaringType]) + { + if (memberCache[i] == null) + memberCache[i] = i.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).ToArray(); // TODO - refactor into method + var mi2 = memberCache[i].SingleOrDefault(x => x.MemberType == mi.MemberType && x.Name == mi.Name); + if (mi2 != null) + { + foreach (var att2 in mi2.GetAttributes()) + yield return att2; + } + } + } + + /// + /// Gets all names for a property, class, etc. including custom names and the actual item name. + /// + /// + /// + public static IEnumerable GetNames(this MemberInfo m) + { + return m.GetAttributes().Select(a => a.Name).UnionSingle(m.Name); + } + + /// + /// Gets the canonical name for a property, class, etc. + /// This is taken from the [CanonicalName] attribute if present, otherwise the name of the item itself. + /// + /// + /// + public static string GetCanonicalName(this MemberInfo m) + { + // TODO - use most derived class's attribute? + var name = m.GetAttributes().Select(a => a.Name).SingleOrDefault(); + if (name == null) + return m.Name; + return name; + } + + /// + /// Gets a property value from an object using reflection. + /// If the property does not exist, returns null. + /// + /// + /// + /// + public static object GetPropertyValue(this object o, string propertyName) + { + if (o == null) + return null; + var prop = o.GetType().GetProperty(propertyName); + if (prop == null) + return null; + return prop.GetValue(o, new object[0]); + } +} diff --git a/FrEee/Extensions/UnitHandlingExtensions.cs b/FrEee.Core.Utility/Extensions/UnitHandlingExtensions.cs similarity index 98% rename from FrEee/Extensions/UnitHandlingExtensions.cs rename to FrEee.Core.Utility/Extensions/UnitHandlingExtensions.cs index 3c1ed1eb5..1aa187a61 100644 --- a/FrEee/Extensions/UnitHandlingExtensions.cs +++ b/FrEee.Core.Utility/Extensions/UnitHandlingExtensions.cs @@ -1,6 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; +using FrEee.Extensions; +using FrEee.Extensions; +using FrEee.Extensions; namespace FrEee.Extensions; @@ -247,4 +250,4 @@ public static string ToUnitString(this double? value, bool bForBillions = false, return undefinedValue; return value.Value.ToUnitString(bForBillions, sigfigs); } -} \ No newline at end of file +} diff --git a/FrEee.Core.Utility/FrEee.Core.Utility.csproj b/FrEee.Core.Utility/FrEee.Core.Utility.csproj new file mode 100644 index 000000000..cd07aa838 --- /dev/null +++ b/FrEee.Core.Utility/FrEee.Core.Utility.csproj @@ -0,0 +1,20 @@ + + + net8.0 + Library + FrEee.Core.Utility + Utility code for FrEee. This is low level utility code that doesn't need to know about any game objects. + + + + + + false + FrEee + + + + + + + diff --git a/FrEee.Core.Utility/Serialization/DoNotSerializeAttribute.cs b/FrEee.Core.Utility/Serialization/DoNotSerializeAttribute.cs new file mode 100644 index 000000000..93502e795 --- /dev/null +++ b/FrEee.Core.Utility/Serialization/DoNotSerializeAttribute.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Utility; +using FrEee.Serialization; + +namespace FrEee.Serialization +{ + /// + /// Prevents a property from being serialized, or copied when the containing object is copied. + /// + [AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)] + public sealed class DoNotSerializeAttribute : DoNotCopyAttribute + { + public DoNotSerializeAttribute(bool allowSafeCopy = true) + : base(allowSafeCopy) + { + } + } +} diff --git a/FrEee/Serialization/IData.cs b/FrEee.Core.Utility/Serialization/IData.cs similarity index 92% rename from FrEee/Serialization/IData.cs rename to FrEee.Core.Utility/Serialization/IData.cs index dcc532105..14aa11a95 100644 --- a/FrEee/Serialization/IData.cs +++ b/FrEee.Core.Utility/Serialization/IData.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using FrEee.Serialization; namespace FrEee.Serialization; diff --git a/FrEee/Serialization/IDataObject.cs b/FrEee.Core.Utility/Serialization/IDataObject.cs similarity index 92% rename from FrEee/Serialization/IDataObject.cs rename to FrEee.Core.Utility/Serialization/IDataObject.cs index 4b4fb0bae..35155dda6 100644 --- a/FrEee/Serialization/IDataObject.cs +++ b/FrEee.Core.Utility/Serialization/IDataObject.cs @@ -1,4 +1,7 @@ using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Serialization; +using FrEee.Utility; namespace FrEee.Serialization; /// diff --git a/FrEee/Serialization/IReferenceEnumerable.cs b/FrEee.Core.Utility/Serialization/IReferenceEnumerable.cs similarity index 74% rename from FrEee/Serialization/IReferenceEnumerable.cs rename to FrEee.Core.Utility/Serialization/IReferenceEnumerable.cs index b613c64a4..39a632e29 100644 --- a/FrEee/Serialization/IReferenceEnumerable.cs +++ b/FrEee.Core.Utility/Serialization/IReferenceEnumerable.cs @@ -1,8 +1,9 @@ -namespace FrEee.Serialization; +using FrEee.Serialization; +namespace FrEee.Serialization; /// /// Flag interface for enumerables that should not be serialized as enumerables because they contain references. /// public interface IReferenceEnumerable { -} \ No newline at end of file +} diff --git a/FrEee/Serialization/JsonContractResolver.cs b/FrEee.Core.Utility/Serialization/JsonContractResolver.cs similarity index 92% rename from FrEee/Serialization/JsonContractResolver.cs rename to FrEee.Core.Utility/Serialization/JsonContractResolver.cs index 4d0969b53..f41fd4632 100644 --- a/FrEee/Serialization/JsonContractResolver.cs +++ b/FrEee.Core.Utility/Serialization/JsonContractResolver.cs @@ -3,6 +3,8 @@ using System; using System.Linq; using System.Reflection; +using FrEee.Serialization; +using FrEee.Serialization; namespace FrEee.Serialization; diff --git a/FrEee/Serialization/Stringifiers/IStringifier.cs b/FrEee.Core.Utility/Serialization/Stringifiers/IStringifier.cs similarity index 78% rename from FrEee/Serialization/Stringifiers/IStringifier.cs rename to FrEee.Core.Utility/Serialization/Stringifiers/IStringifier.cs index 409a466b4..750d61f18 100644 --- a/FrEee/Serialization/Stringifiers/IStringifier.cs +++ b/FrEee.Core.Utility/Serialization/Stringifiers/IStringifier.cs @@ -1,4 +1,6 @@ using System; +using FrEee.Serialization.Stringifiers; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Serialization/Stringifiers/PointStringifier.cs b/FrEee.Core.Utility/Serialization/Stringifiers/PointStringifier.cs similarity index 85% rename from FrEee/Serialization/Stringifiers/PointStringifier.cs rename to FrEee.Core.Utility/Serialization/Stringifiers/PointStringifier.cs index 37cea331c..4acc39bc4 100644 --- a/FrEee/Serialization/Stringifiers/PointStringifier.cs +++ b/FrEee.Core.Utility/Serialization/Stringifiers/PointStringifier.cs @@ -1,6 +1,8 @@ using System.ComponentModel.Composition; using System.Drawing; using System.Linq; +using FrEee.Serialization.Stringifiers; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Serialization/Stringifiers/SizeStringifier.cs b/FrEee.Core.Utility/Serialization/Stringifiers/SizeStringifier.cs similarity index 85% rename from FrEee/Serialization/Stringifiers/SizeStringifier.cs rename to FrEee.Core.Utility/Serialization/Stringifiers/SizeStringifier.cs index 0b708bc59..3e7a91c37 100644 --- a/FrEee/Serialization/Stringifiers/SizeStringifier.cs +++ b/FrEee.Core.Utility/Serialization/Stringifiers/SizeStringifier.cs @@ -1,6 +1,8 @@ using System.ComponentModel.Composition; using System.Drawing; using System.Linq; +using FrEee.Serialization.Stringifiers; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Serialization/Stringifiers/Stringifier.cs b/FrEee.Core.Utility/Serialization/Stringifiers/Stringifier.cs similarity index 87% rename from FrEee/Serialization/Stringifiers/Stringifier.cs rename to FrEee.Core.Utility/Serialization/Stringifiers/Stringifier.cs index 230454527..6793e8b69 100644 --- a/FrEee/Serialization/Stringifiers/Stringifier.cs +++ b/FrEee.Core.Utility/Serialization/Stringifiers/Stringifier.cs @@ -1,4 +1,6 @@ using System; +using FrEee.Serialization.Stringifiers; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Serialization/Stringifiers/StringifierLibrary.cs b/FrEee.Core.Utility/Serialization/Stringifiers/StringifierLibrary.cs similarity index 89% rename from FrEee/Serialization/Stringifiers/StringifierLibrary.cs rename to FrEee.Core.Utility/Serialization/Stringifiers/StringifierLibrary.cs index bcc27a6bd..b67dc13fb 100644 --- a/FrEee/Serialization/Stringifiers/StringifierLibrary.cs +++ b/FrEee.Core.Utility/Serialization/Stringifiers/StringifierLibrary.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.ComponentModel.Composition; using System.ComponentModel.Composition.Hosting; +using FrEee.Serialization.Stringifiers; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Utility/ClientSafeAttribute.cs b/FrEee.Core.Utility/Utility/ClientSafeAttribute.cs similarity index 94% rename from FrEee/Utility/ClientSafeAttribute.cs rename to FrEee.Core.Utility/Utility/ClientSafeAttribute.cs index 8f293a74a..ce4c6a668 100644 --- a/FrEee/Utility/ClientSafeAttribute.cs +++ b/FrEee.Core.Utility/Utility/ClientSafeAttribute.cs @@ -1,12 +1,13 @@ -using System; - -namespace FrEee.Utility; - -/// -/// Marks a type as safe to pass from the client to the server. -/// -[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = true, AllowMultiple = false)] -[Obsolete("ClientSafeAttribute is obsolete; please implement IPromotable instead.")] -internal sealed class ClientSafeAttribute : Attribute -{ -} \ No newline at end of file +using System; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// Marks a type as safe to pass from the client to the server. +/// +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = true, AllowMultiple = false)] +[Obsolete("ClientSafeAttribute is obsolete; please implement IPromotable instead.")] +internal sealed class ClientSafeAttribute : Attribute +{ +} diff --git a/FrEee/Utility/ClientUtilities.cs b/FrEee.Core.Utility/Utility/ClientUtilities.cs similarity index 94% rename from FrEee/Utility/ClientUtilities.cs rename to FrEee.Core.Utility/Utility/ClientUtilities.cs index 857e2c03f..881b1d681 100644 --- a/FrEee/Utility/ClientUtilities.cs +++ b/FrEee.Core.Utility/Utility/ClientUtilities.cs @@ -1,22 +1,23 @@ -using System; -using System.IO; - -namespace FrEee.Utility; - -public static class ClientUtilities -{ - /// - /// The path to FrEee's user roaming application data folder. - /// - public static string ApplicationDataPath - { - get - { - return Path.Combine - ( - Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), - "FrEee" - ); - } - } -} \ No newline at end of file +using System; +using System.IO; +using FrEee.Utility; + +namespace FrEee.Utility; + +public static class ClientUtilities +{ + /// + /// The path to FrEee's user roaming application data folder. + /// + public static string ApplicationDataPath + { + get + { + return Path.Combine + ( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + "FrEee" + ); + } + } +} diff --git a/FrEee.Core.Utility/Utility/DoNotCopyAttribute.cs b/FrEee.Core.Utility/Utility/DoNotCopyAttribute.cs new file mode 100644 index 000000000..bbc7186ac --- /dev/null +++ b/FrEee.Core.Utility/Utility/DoNotCopyAttribute.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FrEee.Utility +{ + /// + /// Prevents an property or class's value from being copied when the containing object is copied. + /// Instead, the original value will be used, or the known copy if the value has already been copied. + /// + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = true, AllowMultiple = false)] + public class DoNotCopyAttribute : Attribute + { + public DoNotCopyAttribute(bool allowSafeCopy = true) + { + AllowSafeCopy = allowSafeCopy; + } + + /// + /// Is "safe" copying (using the original property value) allowed? + /// If false, even this will not be attempted, and the property will be completely ignored. + /// Setting to false is useful for properties whose setters throw NotSupportedException. + /// + public bool AllowSafeCopy { get; private set; } + } +} diff --git a/FrEee/Utility/DynamicDictionary.cs b/FrEee.Core.Utility/Utility/DynamicDictionary.cs similarity index 95% rename from FrEee/Utility/DynamicDictionary.cs rename to FrEee.Core.Utility/Utility/DynamicDictionary.cs index da40dda08..1995041d7 100644 --- a/FrEee/Utility/DynamicDictionary.cs +++ b/FrEee.Core.Utility/Utility/DynamicDictionary.cs @@ -1,156 +1,158 @@ -using System.Collections.Generic; -using System.Dynamic; -using System.Linq; - -namespace FrEee.Utility; - -/// -/// A dynamic dictionary that's dynamic dictionaries all the way down. -/// About as close as you can get to a Perl hash in C#. -/// -public class DynamicDictionary : DynamicObject, IDictionary -{ - public DynamicDictionary() - { - dict = new SafeDictionary(); - } - - public int Count - { - get { return dict.Count; } - } - - public bool IsEmpty - { - get { return dict.Count == 0; } - } - - public bool IsReadOnly - { - get { return dict.IsReadOnly; } - } - - public ICollection Keys - { - get { return dict.Keys; } - } - - public ICollection Values - { - get { return dict.Values; } - } - - private SafeDictionary dict { get; set; } - - public object this[object key] - { - get - { - if (!dict.ContainsKey(key)) - dict[key] = new DynamicDictionary(); - return dict[key]; - } - set - { - dict[key] = value; - } - } - - public void Add(object key, object value) - { - dict.Add(key, value); - } - - public void Add(KeyValuePair item) - { - dict.Add(item); - } - - public void Clear() - { - dict.Clear(); - } - - public bool Contains(KeyValuePair item) - { - return dict.Contains(item); - } - - public bool ContainsKey(object key) - { - return dict.ContainsKey(key); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - dict.CopyTo(array, arrayIndex); - } - - public override IEnumerable GetDynamicMemberNames() - { - return dict.Keys.OfType(); - } - - public IEnumerator> GetEnumerator() - { - return dict.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public bool HasProperty(string prop) - { - return dict.ContainsKey(prop); - } - - public bool Remove(object key) - { - return dict.Remove(key); - } - - public bool Remove(KeyValuePair item) - { - return dict.Remove(item); - } - - public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) - { - var key = string.Join(",", indexes.Select(o => o.ToString()).ToArray()); - if (!dict.ContainsKey(key)) - dict[key] = new DynamicDictionary(); - result = dict[key]; - return true; - } - - public override bool TryGetMember(GetMemberBinder binder, out object result) - { - if (!dict.ContainsKey(binder.Name)) - dict[binder.Name] = new DynamicDictionary(); - result = dict[binder.Name]; - return true; - } - - public bool TryGetValue(object key, out object value) - { - if (!dict.ContainsKey(key)) - dict[key] = new DynamicDictionary(); - value = dict[key]; - return true; - } - - public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object? value) - { - var key = string.Join(",", indexes.Select(o => o.ToString()).ToArray()); - dict[key] = value; - return true; - } - - public override bool TrySetMember(SetMemberBinder binder, object? value) - { - dict[binder.Name] = value; - return true; - } -} \ No newline at end of file +using System.Collections.Generic; +using System.Dynamic; +using System.Linq; +using FrEee.Utility; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// A dynamic dictionary that's dynamic dictionaries all the way down. +/// About as close as you can get to a Perl hash in C#. +/// +public class DynamicDictionary : DynamicObject, IDictionary +{ + public DynamicDictionary() + { + dict = new SafeDictionary(); + } + + public int Count + { + get { return dict.Count; } + } + + public bool IsEmpty + { + get { return dict.Count == 0; } + } + + public bool IsReadOnly + { + get { return dict.IsReadOnly; } + } + + public ICollection Keys + { + get { return dict.Keys; } + } + + public ICollection Values + { + get { return dict.Values; } + } + + private SafeDictionary dict { get; set; } + + public object this[object key] + { + get + { + if (!dict.ContainsKey(key)) + dict[key] = new DynamicDictionary(); + return dict[key]; + } + set + { + dict[key] = value; + } + } + + public void Add(object key, object value) + { + dict.Add(key, value); + } + + public void Add(KeyValuePair item) + { + dict.Add(item); + } + + public void Clear() + { + dict.Clear(); + } + + public bool Contains(KeyValuePair item) + { + return dict.Contains(item); + } + + public bool ContainsKey(object key) + { + return dict.ContainsKey(key); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + dict.CopyTo(array, arrayIndex); + } + + public override IEnumerable GetDynamicMemberNames() + { + return dict.Keys.OfType(); + } + + public IEnumerator> GetEnumerator() + { + return dict.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool HasProperty(string prop) + { + return dict.ContainsKey(prop); + } + + public bool Remove(object key) + { + return dict.Remove(key); + } + + public bool Remove(KeyValuePair item) + { + return dict.Remove(item); + } + + public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) + { + var key = string.Join(",", indexes.Select(o => o.ToString()).ToArray()); + if (!dict.ContainsKey(key)) + dict[key] = new DynamicDictionary(); + result = dict[key]; + return true; + } + + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + if (!dict.ContainsKey(binder.Name)) + dict[binder.Name] = new DynamicDictionary(); + result = dict[binder.Name]; + return true; + } + + public bool TryGetValue(object key, out object value) + { + if (!dict.ContainsKey(key)) + dict[key] = new DynamicDictionary(); + value = dict[key]; + return true; + } + + public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object? value) + { + var key = string.Join(",", indexes.Select(o => o.ToString()).ToArray()); + dict[key] = value; + return true; + } + + public override bool TrySetMember(SetMemberBinder binder, object? value) + { + dict[binder.Name] = value; + return true; + } +} diff --git a/FrEee/Utility/HashCodeMasher.cs b/FrEee.Core.Utility/Utility/HashCodeMasher.cs similarity index 64% rename from FrEee/Utility/HashCodeMasher.cs rename to FrEee.Core.Utility/Utility/HashCodeMasher.cs index 762a4fcec..e5da3d9ae 100644 --- a/FrEee/Utility/HashCodeMasher.cs +++ b/FrEee.Core.Utility/Utility/HashCodeMasher.cs @@ -1,25 +1,36 @@ -using FrEee.Extensions; -using System.Collections; - -namespace FrEee.Utility; - -/// -/// Mashes objects' hash codes together, using zeroes for nulls. -/// -public static class HashCodeMasher -{ - public static int Mash(params object?[] objs) - { - return MashList(objs); - } - - public static int MashList(IEnumerable objs) - { - if (objs == null) - return 0; - var h = 0; - foreach (var obj in objs) - h ^= obj.GetSafeHashCode(); - return h; - } -} \ No newline at end of file +using FrEee.Extensions; +using System.Collections; +using FrEee.Utility; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// Mashes objects' hash codes together, using zeroes for nulls. +/// +public static class HashCodeMasher +{ + public static int Mash(params object?[] objs) + { + return MashList(objs); + } + + public static int MashList(IEnumerable objs) + { + if (objs == null) + return 0; + var h = 0; + foreach (var obj in objs) + h ^= obj.GetSafeHashCode(); + return h; + } + + /// + /// Returns an object's hash code, or 0 for null. + /// + /// + public static int GetSafeHashCode(this object o) + { + return o == null ? 0 : o.GetHashCode(); + } +} diff --git a/FrEee/Utility/HeatMap.cs b/FrEee.Core.Utility/Utility/HeatMap.cs similarity index 94% rename from FrEee/Utility/HeatMap.cs rename to FrEee.Core.Utility/Utility/HeatMap.cs index ac2c2ed43..30529a51f 100644 --- a/FrEee/Utility/HeatMap.cs +++ b/FrEee.Core.Utility/Utility/HeatMap.cs @@ -1,56 +1,58 @@ -namespace FrEee.Utility; - -/// -/// A heatmap, used for pathfinding and the like. -/// Maps points on a plane to heat values with positive values being hotter. -/// -public class HeatMap : SafeDictionary, double> -{ - public double this[int x, int y] - { - get => this[new Vector2(x, y)]; - set => this[new Vector2(x, y)] = value; - } - - public void AddLinearGradientEightWay(Vector2 pos, double startValue, int range, double deltaPerDistance) - { - for (var x = pos.X - range; x <= pos.X + range; x++) - { - for (var y = pos.Y - range; y <= pos.Y + range; y++) - { - var pos2 = new Vector2(x, y); - var dist = (pos2 - pos).LengthEightWay; - var val = startValue + deltaPerDistance * dist; - this[pos2] += val; - } - } - } - - public Vector2 FindMax(Vector2 pos, int range) - { - Vector2? result = null; - for (var x = pos.X - range; x <= pos.X + range; x++) - { - for (var y = pos.Y - range; y <= pos.Y + range; y++) - { - if (this.ContainsKey(new Vector2(x, y)) && (result == null || this[x, y] > this[result])) - result = new Vector2(x, y); - } - } - return result ?? pos; - } - - public Vector2 FindMin(Vector2 pos, int range) - { - Vector2? result = null; - for (var x = pos.X - range; x <= pos.X + range; x++) - { - for (var y = pos.Y - range; y <= pos.Y + range; y++) - { - if (this.ContainsKey(new Vector2(x, y)) && (result == null || this[x, y] < this[result])) - result = new Vector2(x, y); - } - } - return result ?? pos; - } -} \ No newline at end of file +using FrEee.Utility; +using FrEee.Utility; +namespace FrEee.Utility; + +/// +/// A heatmap, used for pathfinding and the like. +/// Maps points on a plane to heat values with positive values being hotter. +/// +public class HeatMap : SafeDictionary, double> +{ + public double this[int x, int y] + { + get => this[new Vector2(x, y)]; + set => this[new Vector2(x, y)] = value; + } + + public void AddLinearGradientEightWay(Vector2 pos, double startValue, int range, double deltaPerDistance) + { + for (var x = pos.X - range; x <= pos.X + range; x++) + { + for (var y = pos.Y - range; y <= pos.Y + range; y++) + { + var pos2 = new Vector2(x, y); + var dist = (pos2 - pos).LengthEightWay; + var val = startValue + deltaPerDistance * dist; + this[pos2] += val; + } + } + } + + public Vector2 FindMax(Vector2 pos, int range) + { + Vector2? result = null; + for (var x = pos.X - range; x <= pos.X + range; x++) + { + for (var y = pos.Y - range; y <= pos.Y + range; y++) + { + if (this.ContainsKey(new Vector2(x, y)) && (result == null || this[x, y] > this[result])) + result = new Vector2(x, y); + } + } + return result ?? pos; + } + + public Vector2 FindMin(Vector2 pos, int range) + { + Vector2? result = null; + for (var x = pos.X - range; x <= pos.X + range; x++) + { + for (var y = pos.Y - range; y <= pos.Y + range; y++) + { + if (this.ContainsKey(new Vector2(x, y)) && (result == null || this[x, y] < this[result])) + result = new Vector2(x, y); + } + } + return result ?? pos; + } +} diff --git a/FrEee/Utility/IPopulator.cs b/FrEee.Core.Utility/Utility/IPopulator.cs similarity index 94% rename from FrEee/Utility/IPopulator.cs rename to FrEee.Core.Utility/Utility/IPopulator.cs index b8ff9d017..b386b8a95 100644 --- a/FrEee/Utility/IPopulator.cs +++ b/FrEee.Core.Utility/Utility/IPopulator.cs @@ -1,3 +1,4 @@ +using FrEee.Utility; namespace FrEee.Utility; public interface IPopulator diff --git a/FrEee/Utility/MathX.cs b/FrEee.Core.Utility/Utility/MathX.cs similarity index 96% rename from FrEee/Utility/MathX.cs rename to FrEee.Core.Utility/Utility/MathX.cs index a02017efe..ece3729e1 100644 --- a/FrEee/Utility/MathX.cs +++ b/FrEee.Core.Utility/Utility/MathX.cs @@ -1,21 +1,22 @@ -using System; - -namespace FrEee.Utility; - -/// -/// Custom math operations. -/// -public static class MathX -{ - /// - /// Finds the ceiling of the specified number to the specified number of decimal places. - /// - /// The number. - /// The number of decimal places. - /// - public static double Ceiling(double num, int decimalPlaces = 0) - { - var dec = Math.Pow(0.1, decimalPlaces); - return dec * Math.Ceiling(num / dec); - } -} +using System; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// Custom math operations. +/// +public static class MathX +{ + /// + /// Finds the ceiling of the specified number to the specified number of decimal places. + /// + /// The number. + /// The number of decimal places. + /// + public static double Ceiling(double num, int decimalPlaces = 0) + { + var dec = Math.Pow(0.1, decimalPlaces); + return dec * Math.Ceiling(num / dec); + } +} diff --git a/FrEee/Utility/NameAttribute.cs b/FrEee.Core.Utility/Utility/NameAttribute.cs similarity index 94% rename from FrEee/Utility/NameAttribute.cs rename to FrEee.Core.Utility/Utility/NameAttribute.cs index 36d19b2bf..012d7773c 100644 --- a/FrEee/Utility/NameAttribute.cs +++ b/FrEee.Core.Utility/Utility/NameAttribute.cs @@ -1,32 +1,34 @@ -using System; - -namespace FrEee.Utility; - -/// -/// Provides a custom name to use that is the singular definitive name, not an alias. -/// -[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)] -public class CanonicalNameAttribute : NameAttribute -{ - public CanonicalNameAttribute(string name) - : base(name) - { - } -} - -/// -/// Provides a custom name to use on a class, field, or property. -/// -[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)] -public class NameAttribute : Attribute -{ - public NameAttribute(string name) - { - Name = name; - } - - /// - /// The name to assign. - /// - public string Name { get; private set; } -} \ No newline at end of file +using System; +using FrEee.Utility; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// Provides a custom name to use that is the singular definitive name, not an alias. +/// +[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)] +public class CanonicalNameAttribute : NameAttribute +{ + public CanonicalNameAttribute(string name) + : base(name) + { + } +} + +/// +/// Provides a custom name to use on a class, field, or property. +/// +[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)] +public class NameAttribute : Attribute +{ + public NameAttribute(string name) + { + Name = name; + } + + /// + /// The name to assign. + /// + public string Name { get; private set; } +} diff --git a/FrEee/Utility/PRNG.cs b/FrEee.Core.Utility/Utility/PRNG.cs similarity index 96% rename from FrEee/Utility/PRNG.cs rename to FrEee.Core.Utility/Utility/PRNG.cs index 68a6874da..b6a4ce110 100644 --- a/FrEee/Utility/PRNG.cs +++ b/FrEee.Core.Utility/Utility/PRNG.cs @@ -1,131 +1,133 @@ -using System; - -namespace FrEee.Utility; - -/// -/// PredictibleRandomNumberGenerator. -/// pretty much the same as RandomHelper, but not static, and requires a seed. -/// -public class PRNG -{ - public PRNG(int seed) - { - this.Seed = seed; - prng = new Random(seed); - } - - /// - /// The number of times that this PRNG has been called. - /// - public long Iteration { get; private set; } - - /// - /// The number used to seed this PRNG. - /// - public int Seed { get; private set; } - - private Random prng; - - public static bool operator !=(PRNG r1, PRNG r2) - { - return !(r1 == r2); - } - - public static bool operator ==(PRNG r1, PRNG r2) - { - if (r1 is null && r2 is null) - return true; - if (r1 is null || r2 is null) - return false; - return r1.Seed == r2.Seed && r1.Iteration == r2.Iteration; - } - - public override bool Equals(object? obj) - { - // TODO - upgrade equals to use "as" operator - if (obj is PRNG) - return this == (PRNG)obj; - return false; - } - - public override int GetHashCode() - { - return HashCodeMasher.Mash(Seed, Iteration); - } - - public int Next(int upper) - { - Iteration++; - return prng.Next(upper); - } - - /// - /// Generates a random number >= 0 but less than the upper bound. - /// Increments Iteration 3 times due to needing to generate 3 integers. - /// TODO - find a way to do this with only 2 integers - /// - /// The upper bound. - /// - public long Next(long upper) - { - // don't Iteration++ here; we're already calling Next - long result; - do - { - result = Next((int)(upper / (long)int.MaxValue / 4L)) * (long)int.MaxValue * 4L + Next((int)(upper % ((long)int.MaxValue))) * 2 + Next(2); - } while (result > upper); // HACK - why are we getting out of range values?! - return result; - } - - /// - /// Generates a random number >= 0 but less than the upper bound. - /// - /// The upper bound. - /// - public double Next(double upper) - { - Iteration++; - return prng.NextDouble() * upper; - } - - /// - /// Generates a random number within a range (inclusive). - /// - /// The minimum. - /// The maximum. - /// - public int Range(int min, int max) - { - Iteration++; - return prng.Next(min, max + 1); - } - - /// - /// Generates a random number within a range (inclusive). - /// - /// The minimum. - /// The maximum. - /// - public long Range(long min, long max) - { - // don't Iteration++ here; we're already calling Next - return Next(max - min + 1) + min; - } - - /// - /// Generates a random number within a range (inclusive). - /// - /// The minimum. - /// The maximum. - /// - public double Range(double min, double max) - { - Iteration++; - return prng.NextDouble() * (max + double.Epsilon - min) + min; - } - - public override string ToString() - { - return "Seed: " + Seed + ", Iteration: " + Iteration; - } -} \ No newline at end of file +using System; +using FrEee.Utility; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// PredictibleRandomNumberGenerator. +/// pretty much the same as RandomHelper, but not static, and requires a seed. +/// +public class PRNG +{ + public PRNG(int seed) + { + this.Seed = seed; + prng = new Random(seed); + } + + /// + /// The number of times that this PRNG has been called. + /// + public long Iteration { get; private set; } + + /// + /// The number used to seed this PRNG. + /// + public int Seed { get; private set; } + + private Random prng; + + public static bool operator !=(PRNG r1, PRNG r2) + { + return !(r1 == r2); + } + + public static bool operator ==(PRNG r1, PRNG r2) + { + if (r1 is null && r2 is null) + return true; + if (r1 is null || r2 is null) + return false; + return r1.Seed == r2.Seed && r1.Iteration == r2.Iteration; + } + + public override bool Equals(object? obj) + { + // TODO - upgrade equals to use "as" operator + if (obj is PRNG) + return this == (PRNG)obj; + return false; + } + + public override int GetHashCode() + { + return HashCodeMasher.Mash(Seed, Iteration); + } + + public int Next(int upper) + { + Iteration++; + return prng.Next(upper); + } + + /// + /// Generates a random number >= 0 but less than the upper bound. + /// Increments Iteration 3 times due to needing to generate 3 integers. + /// TODO - find a way to do this with only 2 integers + /// + /// The upper bound. + /// + public long Next(long upper) + { + // don't Iteration++ here; we're already calling Next + long result; + do + { + result = Next((int)(upper / (long)int.MaxValue / 4L)) * (long)int.MaxValue * 4L + Next((int)(upper % ((long)int.MaxValue))) * 2 + Next(2); + } while (result > upper); // HACK - why are we getting out of range values?! + return result; + } + + /// + /// Generates a random number >= 0 but less than the upper bound. + /// + /// The upper bound. + /// + public double Next(double upper) + { + Iteration++; + return prng.NextDouble() * upper; + } + + /// + /// Generates a random number within a range (inclusive). + /// + /// The minimum. + /// The maximum. + /// + public int Range(int min, int max) + { + Iteration++; + return prng.Next(min, max + 1); + } + + /// + /// Generates a random number within a range (inclusive). + /// + /// The minimum. + /// The maximum. + /// + public long Range(long min, long max) + { + // don't Iteration++ here; we're already calling Next + return Next(max - min + 1) + min; + } + + /// + /// Generates a random number within a range (inclusive). + /// + /// The minimum. + /// The maximum. + /// + public double Range(double min, double max) + { + Iteration++; + return prng.NextDouble() * (max + double.Epsilon - min) + min; + } + + public override string ToString() + { + return "Seed: " + Seed + ", Iteration: " + Iteration; + } +} diff --git a/FrEee/Utility/PopulateAttribute.cs b/FrEee.Core.Utility/Utility/PopulateAttribute.cs similarity index 73% rename from FrEee/Utility/PopulateAttribute.cs rename to FrEee.Core.Utility/Utility/PopulateAttribute.cs index 947f460f8..a6b096ee9 100644 --- a/FrEee/Utility/PopulateAttribute.cs +++ b/FrEee.Core.Utility/Utility/PopulateAttribute.cs @@ -1,4 +1,6 @@ using System; +using FrEee.Utility; +using FrEee.Utility; namespace FrEee.Utility; diff --git a/FrEee/Utility/Progress.cs b/FrEee.Core.Utility/Utility/Progress.cs similarity index 58% rename from FrEee/Utility/Progress.cs rename to FrEee.Core.Utility/Utility/Progress.cs index cf79773e7..d3bab0801 100644 --- a/FrEee/Utility/Progress.cs +++ b/FrEee.Core.Utility/Utility/Progress.cs @@ -1,122 +1,79 @@ -using FrEee.Modding; -using FrEee.Extensions; -using System; -using FrEee.Serialization; - -namespace FrEee.Utility; - -public class GalaxyProgress : Progress, T> - where T: IReferrable -{ - public GalaxyProgress(T item, long value, long maximum, long incrementalProgressBeforeDelay = 0, double? delay = 0, long extraIncrementalProgressAfterDelay = 0) - : base(item, value, maximum, incrementalProgressBeforeDelay, delay, extraIncrementalProgressAfterDelay) - { - } -} - -public class ModProgress : Progress, T> - where T : IModObject -{ - public ModProgress(T item, long value, long maximum, long incrementalProgressBeforeDelay = 0, double? delay = 0, long extraIncrementalProgressAfterDelay = 0) - : base(item, value, maximum, incrementalProgressBeforeDelay, delay, extraIncrementalProgressAfterDelay) - { - } -} - -/// -/// Progress towards completing something. -/// -public class Progress -{ - public Progress(long value, long maximum, long incrementalProgressBeforeDelay = 0, double? delay = null, long extraIncrementalProgressAfterDelay = 0) - { - Value = value; - Maximum = maximum; - IncrementalProgressBeforeDelay = incrementalProgressBeforeDelay; - Delay = delay; - ExtraIncrementalProgressAfterDelay = extraIncrementalProgressAfterDelay; - } - - public double? Delay { get; set; } - - /// - /// ETA rounded up to the next turn. - /// - public int? Eta - { - get - { - if (RawEta == null) - return null; - return (int)Math.Ceiling(RawEta.Value); - } - } - - public long ExtraIncrementalProgressAfterDelay { get; set; } - public long IncrementalProgressBeforeDelay { get; set; } - public long Maximum { get; set; } - - /// - /// Estimated time to completion (null for never). - /// - public double? RawEta - { - get - { - if (Delay == double.PositiveInfinity) - return null; // When the delay is infinite, like the research queue having 0 research points, it never finishes - else if (IncrementalProgressBeforeDelay <= 0 && ExtraIncrementalProgressAfterDelay <= 0) - return null; - else if (Delay == null) - { - if (IncrementalProgressBeforeDelay <= 0) - return null; - else - return (double)(Maximum - Value) / (double)(IncrementalProgressBeforeDelay); - } - else if (Delay <= 0) - return (double)(Maximum - Value) / (double)(IncrementalProgressBeforeDelay + ExtraIncrementalProgressAfterDelay); - else - { - var progressAfterDelay = new Progress(0, Maximum, IncrementalProgressBeforeDelay + ExtraIncrementalProgressAfterDelay); - return progressAfterDelay.RawEta + Delay; - } - } - } - - public long Value { get; set; } - - public override string ToString() - { - if (ExtraIncrementalProgressAfterDelay != 0) - return string.Format("{0} / {1} ({2:+#;-#;0} per turn, {3:+#;-#;0} more per turn after {4} turns)", Value, Maximum, IncrementalProgressBeforeDelay, ExtraIncrementalProgressAfterDelay, Delay); - else - return string.Format("{0} / {1} ({2:+#;-#;0} per turn", Value, Maximum, IncrementalProgressBeforeDelay); - } -} - -/// -/// Progress towards completing something. -/// -/// -public class Progress : Progress - where TRef : IReference -{ - public Progress(T item, long value, long maximum, long incrementalProgressBeforeDelay = 0, double? delay = 0, long extraIncrementalProgressAfterDelay = 0) - : base(value, maximum, incrementalProgressBeforeDelay, delay, extraIncrementalProgressAfterDelay) - { - Item = item; - } - - /// - /// The item being worked towards. - /// - public T Item { get { return item.Value; } set { item = value.Refer(); } } - - private TRef item { get; set; } - - public override string ToString() - { - return string.Format("{0}: {1}", Item, base.ToString()); - } -} +using FrEee.Extensions; +using System; +using FrEee.Serialization; +using FrEee.Utility; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// Progress towards completing something. +/// +public class Progress +{ + public Progress(long value, long maximum, long incrementalProgressBeforeDelay = 0, double? delay = null, long extraIncrementalProgressAfterDelay = 0) + { + Value = value; + Maximum = maximum; + IncrementalProgressBeforeDelay = incrementalProgressBeforeDelay; + Delay = delay; + ExtraIncrementalProgressAfterDelay = extraIncrementalProgressAfterDelay; + } + + public double? Delay { get; set; } + + /// + /// ETA rounded up to the next turn. + /// + public int? Eta + { + get + { + if (RawEta == null) + return null; + return (int)Math.Ceiling(RawEta.Value); + } + } + + public long ExtraIncrementalProgressAfterDelay { get; set; } + public long IncrementalProgressBeforeDelay { get; set; } + public long Maximum { get; set; } + + /// + /// Estimated time to completion (null for never). + /// + public double? RawEta + { + get + { + if (Delay == double.PositiveInfinity) + return null; // When the delay is infinite, like the research queue having 0 research points, it never finishes + else if (IncrementalProgressBeforeDelay <= 0 && ExtraIncrementalProgressAfterDelay <= 0) + return null; + else if (Delay == null) + { + if (IncrementalProgressBeforeDelay <= 0) + return null; + else + return (double)(Maximum - Value) / (double)(IncrementalProgressBeforeDelay); + } + else if (Delay <= 0) + return (double)(Maximum - Value) / (double)(IncrementalProgressBeforeDelay + ExtraIncrementalProgressAfterDelay); + else + { + var progressAfterDelay = new Progress(0, Maximum, IncrementalProgressBeforeDelay + ExtraIncrementalProgressAfterDelay); + return progressAfterDelay.RawEta + Delay; + } + } + } + + public long Value { get; set; } + + public override string ToString() + { + if (ExtraIncrementalProgressAfterDelay != 0) + return string.Format("{0} / {1} ({2:+#;-#;0} per turn, {3:+#;-#;0} more per turn after {4} turns)", Value, Maximum, IncrementalProgressBeforeDelay, ExtraIncrementalProgressAfterDelay, Delay); + else + return string.Format("{0} / {1} ({2:+#;-#;0} per turn", Value, Maximum, IncrementalProgressBeforeDelay); + } +} diff --git a/FrEee/Utility/ProgressDisplayMode.cs b/FrEee.Core.Utility/Utility/ProgressDisplayMode.cs similarity index 83% rename from FrEee/Utility/ProgressDisplayMode.cs rename to FrEee.Core.Utility/Utility/ProgressDisplayMode.cs index 28ca9bd3a..33295d3bc 100644 --- a/FrEee/Utility/ProgressDisplayMode.cs +++ b/FrEee.Core.Utility/Utility/ProgressDisplayMode.cs @@ -1,22 +1,22 @@ -namespace FrEee.UI.WinForms.DataGridView; - -/// -/// Display modes for progress bars. -/// -public enum ProgressDisplayMode -{ - /// - /// Displays the raw numbers. - /// - Raw, - - /// - /// Displays numbers as percentages. - /// - Percentage, - - /// - /// Displays estimated time to completion. - /// - Eta -} \ No newline at end of file +namespace FrEee.Utility; + +/// +/// Display modes for progress bars. +/// +public enum ProgressDisplayMode +{ + /// + /// Displays the raw numbers. + /// + Raw, + + /// + /// Displays numbers as percentages. + /// + Percentage, + + /// + /// Displays estimated time to completion. + /// + Eta +} diff --git a/FrEee/Utility/RandomHelper.cs b/FrEee.Core.Utility/Utility/RandomHelper.cs similarity index 96% rename from FrEee/Utility/RandomHelper.cs rename to FrEee.Core.Utility/Utility/RandomHelper.cs index fff55fb68..1965feaff 100644 --- a/FrEee/Utility/RandomHelper.cs +++ b/FrEee.Core.Utility/Utility/RandomHelper.cs @@ -1,99 +1,101 @@ -using System; - -namespace FrEee.Utility; - -/// -/// Generates random numbers. -/// -public static class RandomHelper -{ - static RandomHelper() - { - PRNG = new PRNG((int)DateTime.Now.Ticks); - } - - public static PRNG PRNG { get; private set; } - - /// - /// Generates a random number >= 0 but less than the upper bound. - /// - /// The upper bound. - /// - public static int Next(int upper, PRNG prng = null) - { - return (prng ?? PRNG).Next(upper); - } - - /// - /// Generates a random number >= 0 but less than the upper bound. - /// - /// The upper bound. - /// - public static long Next(long upper, PRNG prng = null) - { - return (prng ?? PRNG).Next(upper); - } - - /// - /// Generates a random number >= 0 but less than the upper bound. - /// - /// The upper bound. - /// - public static double Next(double upper, PRNG prng = null) - { - return (prng ?? PRNG).Next(upper); - } - - /// - /// Generates a random number within a range (inclusive). - /// - /// The minimum. - /// The maximum. - /// - public static int Range(int min, int max, PRNG prng = null) - { - return (prng ?? PRNG).Range(min, max); - } - - /// - /// Generates a random number within a range (inclusive). - /// - /// The minimum. - /// The maximum. - /// - public static long Range(long min, long max, PRNG prng = null) - { - return (prng ?? PRNG).Range(min, max); - } - - /// - /// Generates a random number within a range (inclusive). - /// - /// The minimum. - /// The maximum. - /// - public static double Range(double min, double max, PRNG prng = null) - { - return (prng ?? PRNG).Range(min, max); - } - - /// - /// Determines if something happens based on a percentage chance. - /// - /// The chance of something happening, between 0 and 100. - /// Should something happen? - public static bool PercentageChance(double chance, PRNG prng = null) - { - return Range(0d, 100d, prng) < chance; - } - - /// - /// Determines if something happens based on a per mille chance. - /// - /// The chance of something happening, between 0 and 1000. - /// Should something happen? - public static bool PerMilleChance(double chance, PRNG prng = null) - { - return Range(0d, 1000d, prng) < chance; - } -} \ No newline at end of file +using System; +using FrEee.Utility; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// Generates random numbers. +/// +public static class RandomHelper +{ + static RandomHelper() + { + PRNG = new PRNG((int)DateTime.Now.Ticks); + } + + public static PRNG PRNG { get; private set; } + + /// + /// Generates a random number >= 0 but less than the upper bound. + /// + /// The upper bound. + /// + public static int Next(int upper, PRNG prng = null) + { + return (prng ?? PRNG).Next(upper); + } + + /// + /// Generates a random number >= 0 but less than the upper bound. + /// + /// The upper bound. + /// + public static long Next(long upper, PRNG prng = null) + { + return (prng ?? PRNG).Next(upper); + } + + /// + /// Generates a random number >= 0 but less than the upper bound. + /// + /// The upper bound. + /// + public static double Next(double upper, PRNG prng = null) + { + return (prng ?? PRNG).Next(upper); + } + + /// + /// Generates a random number within a range (inclusive). + /// + /// The minimum. + /// The maximum. + /// + public static int Range(int min, int max, PRNG prng = null) + { + return (prng ?? PRNG).Range(min, max); + } + + /// + /// Generates a random number within a range (inclusive). + /// + /// The minimum. + /// The maximum. + /// + public static long Range(long min, long max, PRNG prng = null) + { + return (prng ?? PRNG).Range(min, max); + } + + /// + /// Generates a random number within a range (inclusive). + /// + /// The minimum. + /// The maximum. + /// + public static double Range(double min, double max, PRNG prng = null) + { + return (prng ?? PRNG).Range(min, max); + } + + /// + /// Determines if something happens based on a percentage chance. + /// + /// The chance of something happening, between 0 and 100. + /// Should something happen? + public static bool PercentageChance(double chance, PRNG prng = null) + { + return Range(0d, 100d, prng) < chance; + } + + /// + /// Determines if something happens based on a per mille chance. + /// + /// The chance of something happening, between 0 and 1000. + /// Should something happen? + public static bool PerMilleChance(double chance, PRNG prng = null) + { + return Range(0d, 1000d, prng) < chance; + } +} diff --git a/FrEee/Utility/SafeDictionary.cs b/FrEee.Core.Utility/Utility/SafeDictionary.cs similarity index 94% rename from FrEee/Utility/SafeDictionary.cs rename to FrEee.Core.Utility/Utility/SafeDictionary.cs index 04058ce8c..849dfd9ea 100644 --- a/FrEee/Utility/SafeDictionary.cs +++ b/FrEee.Core.Utility/Utility/SafeDictionary.cs @@ -1,204 +1,207 @@ -using FrEee.Extensions; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Utility; - -/// -/// A dictionary that does not throw exceptions when manipulating nonexistent data or overwriting old data. -/// -/// -/// -[Serializable] -public class SafeDictionary : IDictionary -{ - public SafeDictionary() - : this(false) - { - } - - public SafeDictionary(bool autoInit) - { - InitDict(); - AutoInit = autoInit; - } - - public SafeDictionary(IDictionary tocopy, bool autoInit = false) - : this(autoInit) - { - foreach (var kvp in tocopy) - Add(kvp); - } - - /// - /// Should newly referenced values be initialized to new objects or left null? - /// - public bool AutoInit { get; set; } - - /// - /// For initializing newly created values. - /// - public object[] AutoInitArgs { get; set; } - - public int Count - { - get - { - if (dict == null) - return 0; - return dict.Count; - } - } - - public bool IsReadOnly - { - get - { - return false; - } - } - - public ICollection Keys - { - get - { - if (dict == null) - return new List(); - return dict.Keys; - } - } - - public ICollection Values - { - get - { - if (dict == null) - return new List(); - return dict.Values; - } - } - - private ConcurrentDictionary dict; - - public TValue this[TKey key] - { - get - { - if (dict == null) - return default(TValue); - TValue val; - if (dict.TryGetValue(key, out val)) - return val; - else - { - if (AutoInit) - { - try - { - val = (TValue)typeof(TValue).Instantiate(AutoInitArgs); - this[key] = val; - return val; - } - catch - { - // can't instantiate the object - return default(TValue); - } - } - else - return default(TValue); - } - } - set - { - InitDict(); - dict[key] = value; - } - } - - public virtual void Add(TKey key, TValue value) - { - this[key] = value; - } - - public virtual void Add(KeyValuePair item) - { - this[item.Key] = item.Value; - } - - public void Clear() - { - if (dict != null) - dict.Clear(); - } - - public bool Contains(KeyValuePair item) - { - if (dict == null) - return false; - return dict.Contains(item); - } - - public bool ContainsKey(TKey key) - { - if (key == null) - return false; // dicts can't contain null keys anyway - - if (dict == null) - return false; // obviously empty, no need to InitDict - - return dict.ContainsKey(key); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - if (dict != null) - ((IDictionary)dict).CopyTo(array, arrayIndex); - } - - public IEnumerator> GetEnumerator() - { - if (dict == null) - return Enumerable.Empty>().GetEnumerator(); - return dict.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public bool Remove(TKey key) - { - if (dict == null) - return false; - return dict.TryRemove(key, out _); - } - - public bool Remove(KeyValuePair item) - { - if (dict == null) - return false; - return ((IDictionary)dict).Remove(item); - } - - public bool TryGetValue(TKey key, out TValue value) - { - if (dict == null) - value = default(TValue); - else - value = this[key]; - return true; - } - - /// - /// Somehow we can't guarantee that dict will be initialized on freshly instantiated objects otherwise... - /// - private void InitDict() - { - if (dict == null) - dict = new ConcurrentDictionary(); - } -} \ No newline at end of file +using FrEee.Extensions; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using FrEee.Utility; +using FrEee.Utility; +using FrEee.Extensions; + +namespace FrEee.Utility; + +/// +/// A dictionary that does not throw exceptions when manipulating nonexistent data or overwriting old data. +/// +/// +/// +[Serializable] +public class SafeDictionary : IDictionary +{ + public SafeDictionary() + : this(false) + { + } + + public SafeDictionary(bool autoInit) + { + InitDict(); + AutoInit = autoInit; + } + + public SafeDictionary(IDictionary tocopy, bool autoInit = false) + : this(autoInit) + { + foreach (var kvp in tocopy) + Add(kvp); + } + + /// + /// Should newly referenced values be initialized to new objects or left null? + /// + public bool AutoInit { get; set; } + + /// + /// For initializing newly created values. + /// + public object[] AutoInitArgs { get; set; } + + public int Count + { + get + { + if (dict == null) + return 0; + return dict.Count; + } + } + + public bool IsReadOnly + { + get + { + return false; + } + } + + public ICollection Keys + { + get + { + if (dict == null) + return new List(); + return dict.Keys; + } + } + + public ICollection Values + { + get + { + if (dict == null) + return new List(); + return dict.Values; + } + } + + private ConcurrentDictionary dict; + + public TValue this[TKey key] + { + get + { + if (dict == null) + return default(TValue); + TValue val; + if (dict.TryGetValue(key, out val)) + return val; + else + { + if (AutoInit) + { + try + { + val = (TValue)typeof(TValue).Instantiate(AutoInitArgs); + this[key] = val; + return val; + } + catch + { + // can't instantiate the object + return default(TValue); + } + } + else + return default(TValue); + } + } + set + { + InitDict(); + dict[key] = value; + } + } + + public virtual void Add(TKey key, TValue value) + { + this[key] = value; + } + + public virtual void Add(KeyValuePair item) + { + this[item.Key] = item.Value; + } + + public void Clear() + { + if (dict != null) + dict.Clear(); + } + + public bool Contains(KeyValuePair item) + { + if (dict == null) + return false; + return dict.Contains(item); + } + + public bool ContainsKey(TKey key) + { + if (key == null) + return false; // dicts can't contain null keys anyway + + if (dict == null) + return false; // obviously empty, no need to InitDict + + return dict.ContainsKey(key); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + if (dict != null) + ((IDictionary)dict).CopyTo(array, arrayIndex); + } + + public IEnumerator> GetEnumerator() + { + if (dict == null) + return Enumerable.Empty>().GetEnumerator(); + return dict.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool Remove(TKey key) + { + if (dict == null) + return false; + return dict.TryRemove(key, out _); + } + + public bool Remove(KeyValuePair item) + { + if (dict == null) + return false; + return ((IDictionary)dict).Remove(item); + } + + public bool TryGetValue(TKey key, out TValue value) + { + if (dict == null) + value = default(TValue); + else + value = this[key]; + return true; + } + + /// + /// Somehow we can't guarantee that dict will be initialized on freshly instantiated objects otherwise... + /// + private void InitDict() + { + if (dict == null) + dict = new ConcurrentDictionary(); + } +} diff --git a/FrEee/Utility/SafeType.cs b/FrEee.Core.Utility/Utility/SafeType.cs similarity index 96% rename from FrEee/Utility/SafeType.cs rename to FrEee.Core.Utility/Utility/SafeType.cs index 1152329d9..ab7d22fbf 100644 --- a/FrEee/Utility/SafeType.cs +++ b/FrEee.Core.Utility/Utility/SafeType.cs @@ -1,311 +1,314 @@ -using FrEee.Serialization; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; - -namespace FrEee.Utility; - -/// -/// A reference to a data type which can be safely serialized and cross-version matched. -/// -public class SafeType -{ - static SafeType() - { - RegisterAssembly(Assembly.GetEntryAssembly()); - RegisterAssembly(Assembly.GetExecutingAssembly()); - - /*ReferencedAssemblies = LoadReferencedAssemblies().ToDictionary(a => a.GetName().Name); - ReferencedTypes = new Dictionary, Type>(); - foreach (var a in ReferencedAssemblies.Values) - tpy - foreach (var t in a.GetTypes()) - ReferencedTypes.Add(Tuple.Create(a, t.FullName), t); - }*/ - } - - public SafeType(string name) - { - Name = name; - } - - public SafeType(Type type) - { - Type = type; - } - - public string Name { get; set; } - - [DoNotSerialize] - [JsonIgnore] - public Type Type - { - get - { - if (Name.Contains("Version=")) - return Type.GetType(Name); // legacy junk - if (Name.Contains("[[")) - { - var regex = new Regex(@"(.*?)(\[\[.*\]\]), (.*)"); - var match = regex.Match(Name); - var tname = match.Groups[1].Captures[0].Value.Trim(); // type name - var gtparmnames = match.Groups[2].Captures[0].Value.Trim(); // generic type parameter names - var aname = match.Groups[3].Captures[0].Value.Trim(); // assembly name - if (aname.Contains(",")) - aname = aname.Substring(0, aname.IndexOf(",")); // strip legacy junk - var t = FindType(tname); - var gtparmnameslist = gtparmnames.Trim('[', ']').Split(','); - var gtparmnameslist2 = new List(); - var brackets = 0; - foreach (var gtparmname in gtparmnameslist) - { - var gtparmname2 = gtparmname.Trim(); - if (gtparmname2.StartsWith("Version") || gtparmname2.StartsWith("Culture") || gtparmname2.StartsWith("PublicKeyToken")) - continue; // legacy junk - if (brackets == 0) - gtparmnameslist2.Add(gtparmname2); - else - gtparmnameslist2[gtparmnameslist2.Count - 1] += ", " + gtparmname2; - if (gtparmname2.Contains("[[")) - brackets++; - if (gtparmname2.Contains("]]")) - brackets--; - } - var gtparmnameslist3 = new List(); - for (var i = 0; i < gtparmnameslist2.Count; i++) - { - if (i % 2 == 0) - gtparmnameslist3.Add(gtparmnameslist2[i]); - else - gtparmnameslist3[gtparmnameslist3.Count - 1] += ", " + gtparmnameslist2[i]; - } - for (var i = 0; i < gtparmnameslist3.Count; i++) - { - gtparmnameslist3[i] = gtparmnameslist3[i].Trim('[', ']'); - } - if (gtparmnameslist3.Last().Contains("[[") && !gtparmnameslist3.Last().Contains("]]")) - gtparmnameslist3[gtparmnameslist3.Count - 1] += "]], " + aname; - else if (!gtparmnameslist3.Last().Contains(",")) - gtparmnameslist3[gtparmnameslist3.Count - 1] += ", " + aname; - var gtparms = gtparmnameslist3.Select(x => new SafeType(x).Type).ToArray(); - return t.MakeGenericType(gtparms.Where(x => x != null).ToArray()); // HACK - nulls are getting in due to assembly names appearing twice or something - } - else - { - var regex = new Regex(@"(.*?), (.*)"); - var match = regex.Match(Name); - var tname = match.Groups[1].Captures[0].Value.Trim(); // type name - var aname = match.Groups[2].Captures[0].Value.Trim().Trim('[', ']'); // assembly name - var t = FindType(FindAssembly(aname), tname); - return t; - } - } - set - { - Name = GetShortTypeName(value); - } - } - - private static List<(Regex, string)> shortTypeNameRegexes { get; } = new List<(Regex, string)> - { - (new Regex(@"(.*?), (.*?), Version=.*?, Culture=.*?, PublicKeyToken=.*?\],\[", RegexOptions.Compiled), "$1, $2],["), - (new Regex(@"(.*?), (.*?), Version=.*?, Culture=.*?, PublicKeyToken=.*?\]\]", RegexOptions.Compiled), "$1, $2]]"), - (new Regex(@"(.*?), (.*?), Version=.*?, Culture=.*?, PublicKeyToken=.*?\]", RegexOptions.Compiled), "$1, $2]"), - (new Regex(@"(.*?), (.*?), Version=.*?, Culture=.*?, PublicKeyToken=.*\z", RegexOptions.Compiled), "$1, $2"), - }; - - public static string GetShortTypeName(Type t) - { - if (!ShortTypeNames.ContainsKey(t)) - { - var tname = t.AssemblyQualifiedName; - foreach (var r in shortTypeNameRegexes) - tname = r.Item1.Replace(tname, r.Item2); - ShortTypeNames[t] = tname; - } - return ShortTypeNames[t]; - } - - private static SafeDictionary ShortTypeNames { get; set; } = new SafeDictionary(); - - private static SafeDictionary ReferencedAssemblies { get; set; } = new SafeDictionary(); - - private static SafeDictionary> ReferencedTypes { get; set; } = new SafeDictionary>(true); - - public static void ForceLoadType(Type t) - { - RegisterAssembly(t.Assembly); - FindType(t.Assembly, GetShortTypeName(t)); - } - - public static implicit operator SafeType(Type t) - { - return new SafeType(t); - } - - public static implicit operator Type(SafeType t) - { - return t.Type; - } - - public override string ToString() - { - return Name; - } - - private static Assembly FindAssembly(string n) - { - // FrEee, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null - // ignore all but the assembly's base name since the version etc. could change - var whereIsComma = n.IndexOf(","); - if (whereIsComma < 0) - whereIsComma = n.Length; - var regex = new Regex($"{n.Substring(0, whereIsComma)}, Version=(.*), Culture=(.*), PublicKeyToken=(.*)"); - foreach (var kvp in ReferencedAssemblies) - { - if (regex.IsMatch(kvp.Value.FullName)) - return kvp.Value; - } - - // no such assembly? find any referenced assemblies and keep on searching - try - { - return FindMoreAssemblies(a => a, a => a.FullName.Substring(0, a.FullName.IndexOf(",")) == n); - } - catch (Exception ex) - { - throw new ArgumentException("Could not find assembly named " + n + ".", ex); - } - } - - private static T FindMoreAssemblies(Func resultor, Func foundit = null) - { - bool more = false; - var done = new List(); // full names of scanned assemblies - do - { - more = false; - foreach (var a in ReferencedAssemblies.Values.Where(x => !done.Contains(x.FullName)).ToArray()) - { - if (LoadReferencedAssemblies(a)) - more = true; - foreach (var a2 in ReferencedAssemblies.Values) - { - if (foundit != null) - { - // use foundit condition - if (foundit(a2)) - return resultor(a2); - } - else - { - // use result being not null as the condition - var result = resultor(a2); - if (result != null) - return result; - } - done.Add(a2.FullName); - } - } - } while (more); - - throw new Exception("No assemblies matched the criteria."); - } - - private static Type FindType(string name) - { - // do we already know about it? - foreach (var a in ReferencedAssemblies.Values) - { - var t = FindType(a, name); - if (t != null) - return t; - } - - // scan for new assemblies containing the type - try - { - return FindMoreAssemblies(a => FindType(a, name)); - } - catch (Exception ex) - { - throw new ArgumentException($"Could not find type named {name}.", ex); - } - } - - private static Type FindType(Assembly a, string name) - { - int arrayDim = 0; - if (name.EndsWith("[]")) - arrayDim = 1; - else if (name.EndsWith("[,]")) - arrayDim = 2; - - var realname = name.TrimEnd('[', ',', ']'); - - // do we already know about it? - if (!ReferencedTypes[a].Any()) - { - foreach (var t in a.GetTypes()) - ReferencedTypes[a][t.FullName] = t; - } - var type = ReferencedTypes[a][realname]; - if (arrayDim == 0) - return type; - else if (arrayDim == 1) - return type.MakeArrayType(); - else - return type.MakeArrayType(arrayDim); - } - - private static bool LoadReferencedAssemblies(Assembly a) - { - bool more = false; - foreach (var n2 in a.GetReferencedAssemblies().Select(a2 => a2.FullName).Except(ReferencedAssemblies.Values.Select(x => x.FullName))) - { - more = true; // discovered assemblies - var a2 = Assembly.Load(n2); - RegisterAssembly(a2); - FindAssembly(n2); - } - return more; - } - - private static void RegisterAssembly(Assembly a) - { - if (a != null) - ReferencedAssemblies[a.GetName().Name] = a; - } - - /*/// - /// Finds and loads all referenced assemblies from a given root assembly, recursively. - /// - /// The root assembly. If not specified, Assembly.GetEntryAssembly() and Assembly.GetExecutingAssembly() will be used. - /// Any already-loaded assemblies. Apparently built-in CLR assemblies are allowed to have circular references? - /// - private static IEnumerable LoadReferencedAssemblies(Assembly rootAssembly = null, ISet alreadyLoaded = null) - { - if (alreadyLoaded == null) - alreadyLoaded = new HashSet(); - if (rootAssembly == null) - { - if (Assembly.GetEntryAssembly() != null) // python scripts don't have an entry assembly I guess? - LoadReferencedAssemblies(Assembly.GetEntryAssembly(), alreadyLoaded); - LoadReferencedAssemblies(Assembly.GetExecutingAssembly(), alreadyLoaded); - } - else - { - alreadyLoaded.Add(rootAssembly); - foreach (var subAssemblyName in rootAssembly.GetReferencedAssemblies()) - { - var subAssembly = Assembly.Load(subAssemblyName); - if (!alreadyLoaded.Contains(subAssembly)) - LoadReferencedAssemblies(subAssembly, alreadyLoaded); - } - } - return alreadyLoaded; - }*/ -} +using FrEee.Serialization; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; +using FrEee.Utility; +using FrEee.Utility; +using FrEee.Serialization; + +namespace FrEee.Utility; + +/// +/// A reference to a data type which can be safely serialized and cross-version matched. +/// +public class SafeType +{ + static SafeType() + { + RegisterAssembly(Assembly.GetEntryAssembly()); + RegisterAssembly(Assembly.GetExecutingAssembly()); + + /*ReferencedAssemblies = LoadReferencedAssemblies().ToDictionary(a => a.GetName().Name); + ReferencedTypes = new Dictionary, Type>(); + foreach (var a in ReferencedAssemblies.Values) + tpy + foreach (var t in a.GetTypes()) + ReferencedTypes.Add(Tuple.Create(a, t.FullName), t); + }*/ + } + + public SafeType(string name) + { + Name = name; + } + + public SafeType(Type type) + { + Type = type; + } + + public string Name { get; set; } + + [DoNotSerialize] + [JsonIgnore] + public Type Type + { + get + { + if (Name.Contains("Version=")) + return Type.GetType(Name); // legacy junk + if (Name.Contains("[[")) + { + var regex = new Regex(@"(.*?)(\[\[.*\]\]), (.*)"); + var match = regex.Match(Name); + var tname = match.Groups[1].Captures[0].Value.Trim(); // type name + var gtparmnames = match.Groups[2].Captures[0].Value.Trim(); // generic type parameter names + var aname = match.Groups[3].Captures[0].Value.Trim(); // assembly name + if (aname.Contains(",")) + aname = aname.Substring(0, aname.IndexOf(",")); // strip legacy junk + var t = FindType(tname); + var gtparmnameslist = gtparmnames.Trim('[', ']').Split(','); + var gtparmnameslist2 = new List(); + var brackets = 0; + foreach (var gtparmname in gtparmnameslist) + { + var gtparmname2 = gtparmname.Trim(); + if (gtparmname2.StartsWith("Version") || gtparmname2.StartsWith("Culture") || gtparmname2.StartsWith("PublicKeyToken")) + continue; // legacy junk + if (brackets == 0) + gtparmnameslist2.Add(gtparmname2); + else + gtparmnameslist2[gtparmnameslist2.Count - 1] += ", " + gtparmname2; + if (gtparmname2.Contains("[[")) + brackets++; + if (gtparmname2.Contains("]]")) + brackets--; + } + var gtparmnameslist3 = new List(); + for (var i = 0; i < gtparmnameslist2.Count; i++) + { + if (i % 2 == 0) + gtparmnameslist3.Add(gtparmnameslist2[i]); + else + gtparmnameslist3[gtparmnameslist3.Count - 1] += ", " + gtparmnameslist2[i]; + } + for (var i = 0; i < gtparmnameslist3.Count; i++) + { + gtparmnameslist3[i] = gtparmnameslist3[i].Trim('[', ']'); + } + if (gtparmnameslist3.Last().Contains("[[") && !gtparmnameslist3.Last().Contains("]]")) + gtparmnameslist3[gtparmnameslist3.Count - 1] += "]], " + aname; + else if (!gtparmnameslist3.Last().Contains(",")) + gtparmnameslist3[gtparmnameslist3.Count - 1] += ", " + aname; + var gtparms = gtparmnameslist3.Select(x => new SafeType(x).Type).ToArray(); + return t.MakeGenericType(gtparms.Where(x => x != null).ToArray()); // HACK - nulls are getting in due to assembly names appearing twice or something + } + else + { + var regex = new Regex(@"(.*?), (.*)"); + var match = regex.Match(Name); + var tname = match.Groups[1].Captures[0].Value.Trim(); // type name + var aname = match.Groups[2].Captures[0].Value.Trim().Trim('[', ']'); // assembly name + var t = FindType(FindAssembly(aname), tname); + return t; + } + } + set + { + Name = GetShortTypeName(value); + } + } + + private static List<(Regex, string)> shortTypeNameRegexes { get; } = new List<(Regex, string)> + { + (new Regex(@"(.*?), (.*?), Version=.*?, Culture=.*?, PublicKeyToken=.*?\],\[", RegexOptions.Compiled), "$1, $2],["), + (new Regex(@"(.*?), (.*?), Version=.*?, Culture=.*?, PublicKeyToken=.*?\]\]", RegexOptions.Compiled), "$1, $2]]"), + (new Regex(@"(.*?), (.*?), Version=.*?, Culture=.*?, PublicKeyToken=.*?\]", RegexOptions.Compiled), "$1, $2]"), + (new Regex(@"(.*?), (.*?), Version=.*?, Culture=.*?, PublicKeyToken=.*\z", RegexOptions.Compiled), "$1, $2"), + }; + + public static string GetShortTypeName(Type t) + { + if (!ShortTypeNames.ContainsKey(t)) + { + var tname = t.AssemblyQualifiedName; + foreach (var r in shortTypeNameRegexes) + tname = r.Item1.Replace(tname, r.Item2); + ShortTypeNames[t] = tname; + } + return ShortTypeNames[t]; + } + + private static SafeDictionary ShortTypeNames { get; set; } = new SafeDictionary(); + + private static SafeDictionary ReferencedAssemblies { get; set; } = new SafeDictionary(); + + private static SafeDictionary> ReferencedTypes { get; set; } = new SafeDictionary>(true); + + public static void ForceLoadType(Type t) + { + RegisterAssembly(t.Assembly); + FindType(t.Assembly, GetShortTypeName(t)); + } + + public static implicit operator SafeType(Type t) + { + return new SafeType(t); + } + + public static implicit operator Type(SafeType t) + { + return t.Type; + } + + public override string ToString() + { + return Name; + } + + private static Assembly FindAssembly(string n) + { + // FrEee, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null + // ignore all but the assembly's base name since the version etc. could change + var whereIsComma = n.IndexOf(","); + if (whereIsComma < 0) + whereIsComma = n.Length; + var regex = new Regex($"{n.Substring(0, whereIsComma)}, Version=(.*), Culture=(.*), PublicKeyToken=(.*)"); + foreach (var kvp in ReferencedAssemblies) + { + if (regex.IsMatch(kvp.Value.FullName)) + return kvp.Value; + } + + // no such assembly? find any referenced assemblies and keep on searching + try + { + return FindMoreAssemblies(a => a, a => a.FullName.Substring(0, a.FullName.IndexOf(",")) == n); + } + catch (Exception ex) + { + throw new ArgumentException("Could not find assembly named " + n + ".", ex); + } + } + + private static T FindMoreAssemblies(Func resultor, Func foundit = null) + { + bool more = false; + var done = new List(); // full names of scanned assemblies + do + { + more = false; + foreach (var a in ReferencedAssemblies.Values.Where(x => !done.Contains(x.FullName)).ToArray()) + { + if (LoadReferencedAssemblies(a)) + more = true; + foreach (var a2 in ReferencedAssemblies.Values) + { + if (foundit != null) + { + // use foundit condition + if (foundit(a2)) + return resultor(a2); + } + else + { + // use result being not null as the condition + var result = resultor(a2); + if (result != null) + return result; + } + done.Add(a2.FullName); + } + } + } while (more); + + throw new Exception("No assemblies matched the criteria."); + } + + private static Type FindType(string name) + { + // do we already know about it? + foreach (var a in ReferencedAssemblies.Values) + { + var t = FindType(a, name); + if (t != null) + return t; + } + + // scan for new assemblies containing the type + try + { + return FindMoreAssemblies(a => FindType(a, name)); + } + catch (Exception ex) + { + throw new ArgumentException($"Could not find type named {name}.", ex); + } + } + + private static Type FindType(Assembly a, string name) + { + int arrayDim = 0; + if (name.EndsWith("[]")) + arrayDim = 1; + else if (name.EndsWith("[,]")) + arrayDim = 2; + + var realname = name.TrimEnd('[', ',', ']'); + + // do we already know about it? + if (!ReferencedTypes[a].Any()) + { + foreach (var t in a.GetTypes()) + ReferencedTypes[a][t.FullName] = t; + } + var type = ReferencedTypes[a][realname]; + if (arrayDim == 0) + return type; + else if (arrayDim == 1) + return type.MakeArrayType(); + else + return type.MakeArrayType(arrayDim); + } + + private static bool LoadReferencedAssemblies(Assembly a) + { + bool more = false; + foreach (var n2 in a.GetReferencedAssemblies().Select(a2 => a2.FullName).Except(ReferencedAssemblies.Values.Select(x => x.FullName))) + { + more = true; // discovered assemblies + var a2 = Assembly.Load(n2); + RegisterAssembly(a2); + FindAssembly(n2); + } + return more; + } + + private static void RegisterAssembly(Assembly a) + { + if (a != null) + ReferencedAssemblies[a.GetName().Name] = a; + } + + /*/// + /// Finds and loads all referenced assemblies from a given root assembly, recursively. + /// + /// The root assembly. If not specified, Assembly.GetEntryAssembly() and Assembly.GetExecutingAssembly() will be used. + /// Any already-loaded assemblies. Apparently built-in CLR assemblies are allowed to have circular references? + /// + private static IEnumerable LoadReferencedAssemblies(Assembly rootAssembly = null, ISet alreadyLoaded = null) + { + if (alreadyLoaded == null) + alreadyLoaded = new HashSet(); + if (rootAssembly == null) + { + if (Assembly.GetEntryAssembly() != null) // python scripts don't have an entry assembly I guess? + LoadReferencedAssemblies(Assembly.GetEntryAssembly(), alreadyLoaded); + LoadReferencedAssemblies(Assembly.GetExecutingAssembly(), alreadyLoaded); + } + else + { + alreadyLoaded.Add(rootAssembly); + foreach (var subAssemblyName in rootAssembly.GetReferencedAssemblies()) + { + var subAssembly = Assembly.Load(subAssemblyName); + if (!alreadyLoaded.Contains(subAssembly)) + LoadReferencedAssemblies(subAssembly, alreadyLoaded); + } + } + return alreadyLoaded; + }*/ +} diff --git a/FrEee/Utility/SequenceEqualityComparer.cs b/FrEee.Core.Utility/Utility/SequenceEqualityComparer.cs similarity index 95% rename from FrEee/Utility/SequenceEqualityComparer.cs rename to FrEee.Core.Utility/Utility/SequenceEqualityComparer.cs index cf1e4a65d..1cf9e9630 100644 --- a/FrEee/Utility/SequenceEqualityComparer.cs +++ b/FrEee.Core.Utility/Utility/SequenceEqualityComparer.cs @@ -1,27 +1,28 @@ -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Utility; - -internal class SequenceEqualityComparer : IEqualityComparer> -{ - public bool Equals(IEnumerable x, IEnumerable y) - { - if (x.Count() != y.Count()) - return false; - for (int i = 0; i < x.Count(); i++) - { - if (!x.ElementAt(i).Equals(y.ElementAt(i))) - return false; - } - return true; - } - - public int GetHashCode(IEnumerable obj) - { - var hash = 0; - foreach (var item in obj) - hash ^= obj.GetHashCode(); - return hash; - } -} \ No newline at end of file +using System.Collections.Generic; +using System.Linq; +using FrEee.Utility; + +namespace FrEee.Utility; + +internal class SequenceEqualityComparer : IEqualityComparer> +{ + public bool Equals(IEnumerable x, IEnumerable y) + { + if (x.Count() != y.Count()) + return false; + for (int i = 0; i < x.Count(); i++) + { + if (!x.ElementAt(i).Equals(y.ElementAt(i))) + return false; + } + return true; + } + + public int GetHashCode(IEnumerable obj) + { + var hash = 0; + foreach (var item in obj) + hash ^= obj.GetHashCode(); + return hash; + } +} diff --git a/FrEee/Utility/Status.cs b/FrEee.Core.Utility/Utility/Status.cs similarity index 93% rename from FrEee/Utility/Status.cs rename to FrEee.Core.Utility/Utility/Status.cs index 1e07400c7..7720fd120 100644 --- a/FrEee/Utility/Status.cs +++ b/FrEee.Core.Utility/Utility/Status.cs @@ -1,61 +1,63 @@ -using System; - -namespace FrEee.Utility; - -/// -/// Status for an operation. -/// -public class Status -{ - /// - /// Any exception that may have occurred. - /// - public Exception Exception - { - get { return exception; } - set - { - exception = value; - if (Changed != null) - Changed(); - } - } - - /// - /// Message indicating current sub-operation. - /// - public string Message - { - get { return message; } - set - { - message = value; - if (Changed != null) - Changed(); - } - } - - /// - /// Progress to completion. - /// 0 = just started. - /// 1 = done. - /// - public double Progress - { - get { return progress; } - set - { - progress = value; - if (Changed != null) - Changed(); - } - } - - private Exception exception; - private string message; - private double progress; - - public event ChangedDelegate Changed; - - public delegate void ChangedDelegate(); -} \ No newline at end of file +using System; +using FrEee.Utility; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// Status for an operation. +/// +public class Status +{ + /// + /// Any exception that may have occurred. + /// + public Exception Exception + { + get { return exception; } + set + { + exception = value; + if (Changed != null) + Changed(); + } + } + + /// + /// Message indicating current sub-operation. + /// + public string Message + { + get { return message; } + set + { + message = value; + if (Changed != null) + Changed(); + } + } + + /// + /// Progress to completion. + /// 0 = just started. + /// 1 = done. + /// + public double Progress + { + get { return progress; } + set + { + progress = value; + if (Changed != null) + Changed(); + } + } + + private Exception exception; + private string message; + private double progress; + + public event ChangedDelegate Changed; + + public delegate void ChangedDelegate(); +} diff --git a/FrEee/Utility/Vector2.cs b/FrEee.Core.Utility/Utility/Vector2.cs similarity index 95% rename from FrEee/Utility/Vector2.cs rename to FrEee.Core.Utility/Utility/Vector2.cs index 0f8152e12..ec8e64234 100644 --- a/FrEee/Utility/Vector2.cs +++ b/FrEee.Core.Utility/Utility/Vector2.cs @@ -1,162 +1,164 @@ -using FrEee.Extensions; -using System; -using System.Numerics; - -namespace FrEee.Utility; - -/// -/// A generic two dimensional vector. -/// -/// -public record Vector2(T X, T Y) - : IEquatable> - where T : INumber, ISignedNumber -{ - /// - /// Creates a vector with both values initialized to zero. - /// - public Vector2() : this(T.Zero, T.Zero) { } - - /// - /// Copies a vector. - /// - /// The vector to copy. - public Vector2(Vector2 other) : base() - { - X = other.X; - Y = other.Y; - } - - /// - /// Length of this vector moving in 8 directions along the grid. - /// - public T LengthEightWay - { - get - { - var dx = T.Abs(X); - var dy = T.Abs(Y); - return T.Max(dx, dy); - } - } - - /// - /// Length of this vector moving only in the 4 cardinal directions. - /// - public T LengthManhattan - { - get - { - var dx = T.Abs(X); - var dy = T.Abs(Y); - return dx + dy; - } - } - - /// - /// Interpolates between two vectors. - /// - /// - /// - /// - /// Should we skip moving to the endpoint? (say because it is occupied...) - /// - public static Vector2 InterpolateEightWay(Vector2 start, Vector2 end, T distance, Func, bool> skip = null) - { - if (distance <= T.Zero) - return start; - var trip = end - start; - var tripLength = trip.LengthEightWay; - if (distance >= tripLength) - return end; - var dx = trip.X; - var dy = trip.Y; - var pos = new Vector2(start); - var remainingDistance = distance; - while (remainingDistance > T.Zero) - { - if (dx == T.Zero && dy == T.Zero) - break; - if (dx != T.Zero) - { - pos = new(pos.X + TSign(dx), pos.Y); - dx -= TSign(dx); - } - if (dy != T.Zero) - { - pos = new(pos.X, pos.Y + TSign(dy)); - dy -= TSign(dy); - } - remainingDistance--; - } - if (skip != null && skip(pos)) - return InterpolateEightWay(start, end, distance - T.One, skip); // TODO - find alternate endpoint rather than just stopping the journey one tile short - return pos; - } - - public static Vector2 operator -(Vector2 v) - { - return new Vector2(-v.X, -v.Y); - } - - public static Vector2 operator -(Vector2 v1, Vector2 v2) - { - return v1 + -v2; - } - - public static Vector2 operator *(Vector2 v, T s) - { - return new Vector2(v.X * s, v.Y * s); - } - - public static Vector2 operator *(T s, Vector2 v) - { - return v * s; - } - - public static Vector2 operator /(Vector2 v, T s) - { - return new Vector2(v.X / s, v.Y / s); - } - - public static Vector2 operator +(Vector2 v1, Vector2 v2) - { - return new Vector2(v1.X + v2.X, v1.Y + v2.Y); - } - - public T DistanceToEightWay(Vector2 dest) - { - return (dest - this).LengthEightWay; - } - - public T DistanceToManhattan(Vector2 dest) - { - return (dest - this).LengthManhattan; - } - - public override int GetHashCode() - { - return HashCodeMasher.Mash(X, Y); - } - - public override string ToString() - { - return $"({X}, {Y})"; - } - - private static T TSign(T num) - { - if (num < T.Zero) - { - return T.NegativeOne; - } - else if (num > T.Zero) - { - return T.One; - } - else - { - return T.Zero; - } - } -} \ No newline at end of file +using FrEee.Extensions; +using System; +using System.Numerics; +using FrEee.Utility; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// A generic two dimensional vector. +/// +/// +public record Vector2(T X, T Y) + : IEquatable> + where T : INumber, ISignedNumber +{ + /// + /// Creates a vector with both values initialized to zero. + /// + public Vector2() : this(T.Zero, T.Zero) { } + + /// + /// Copies a vector. + /// + /// The vector to copy. + public Vector2(Vector2 other) : base() + { + X = other.X; + Y = other.Y; + } + + /// + /// Length of this vector moving in 8 directions along the grid. + /// + public T LengthEightWay + { + get + { + var dx = T.Abs(X); + var dy = T.Abs(Y); + return T.Max(dx, dy); + } + } + + /// + /// Length of this vector moving only in the 4 cardinal directions. + /// + public T LengthManhattan + { + get + { + var dx = T.Abs(X); + var dy = T.Abs(Y); + return dx + dy; + } + } + + /// + /// Interpolates between two vectors. + /// + /// + /// + /// + /// Should we skip moving to the endpoint? (say because it is occupied...) + /// + public static Vector2 InterpolateEightWay(Vector2 start, Vector2 end, T distance, Func, bool> skip = null) + { + if (distance <= T.Zero) + return start; + var trip = end - start; + var tripLength = trip.LengthEightWay; + if (distance >= tripLength) + return end; + var dx = trip.X; + var dy = trip.Y; + var pos = new Vector2(start); + var remainingDistance = distance; + while (remainingDistance > T.Zero) + { + if (dx == T.Zero && dy == T.Zero) + break; + if (dx != T.Zero) + { + pos = new(pos.X + TSign(dx), pos.Y); + dx -= TSign(dx); + } + if (dy != T.Zero) + { + pos = new(pos.X, pos.Y + TSign(dy)); + dy -= TSign(dy); + } + remainingDistance--; + } + if (skip != null && skip(pos)) + return InterpolateEightWay(start, end, distance - T.One, skip); // TODO - find alternate endpoint rather than just stopping the journey one tile short + return pos; + } + + public static Vector2 operator -(Vector2 v) + { + return new Vector2(-v.X, -v.Y); + } + + public static Vector2 operator -(Vector2 v1, Vector2 v2) + { + return v1 + -v2; + } + + public static Vector2 operator *(Vector2 v, T s) + { + return new Vector2(v.X * s, v.Y * s); + } + + public static Vector2 operator *(T s, Vector2 v) + { + return v * s; + } + + public static Vector2 operator /(Vector2 v, T s) + { + return new Vector2(v.X / s, v.Y / s); + } + + public static Vector2 operator +(Vector2 v1, Vector2 v2) + { + return new Vector2(v1.X + v2.X, v1.Y + v2.Y); + } + + public T DistanceToEightWay(Vector2 dest) + { + return (dest - this).LengthEightWay; + } + + public T DistanceToManhattan(Vector2 dest) + { + return (dest - this).LengthManhattan; + } + + public override int GetHashCode() + { + return HashCodeMasher.Mash(X, Y); + } + + public override string ToString() + { + return $"({X}, {Y})"; + } + + private static T TSign(T num) + { + if (num < T.Zero) + { + return T.NegativeOne; + } + else if (num > T.Zero) + { + return T.One; + } + else + { + return T.Zero; + } + } +} diff --git a/FrEee/Utility/Vector2Utility.cs b/FrEee.Core.Utility/Utility/Vector2Utility.cs similarity index 96% rename from FrEee/Utility/Vector2Utility.cs rename to FrEee.Core.Utility/Utility/Vector2Utility.cs index dde153458..0a405168e 100644 --- a/FrEee/Utility/Vector2Utility.cs +++ b/FrEee.Core.Utility/Utility/Vector2Utility.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; +using FrEee.Utility; +using FrEee.Utility; namespace FrEee.Utility; @@ -41,4 +43,4 @@ public static IEnumerable> AtRadius(T radius) // TODO: improve performance by just checking edges return WithinRadius(radius).Except(WithinRadius(radius - T.One)); } -} \ No newline at end of file +} diff --git a/FrEee/App.config b/FrEee.Core/App.config similarity index 96% rename from FrEee/App.config rename to FrEee.Core/App.config index 282e032ca..c8ea3192e 100644 --- a/FrEee/App.config +++ b/FrEee.Core/App.config @@ -1,6 +1,6 @@ - - - - - - + + + + + + diff --git a/FrEee/ClassDiagram1.cd b/FrEee.Core/ClassDiagram1.cd similarity index 93% rename from FrEee/ClassDiagram1.cd rename to FrEee.Core/ClassDiagram1.cd index a75104258..c3f6bdc96 100644 --- a/FrEee/ClassDiagram1.cd +++ b/FrEee.Core/ClassDiagram1.cd @@ -1,2792 +1,2792 @@ - - - - - - AAAAAABAAAAAAAAAAAIAAAAAAAAAAAAgAAAAAAAAAAA= - FrEeeConstants.cs - - - - - - AAAAAAAAAAAAgAAAAAAAAAAAAACAAAAAAQAAAAAAAAA= - Game\Interfaces\IReference.cs - - - - - - - AAAAQESAAGAggAAEAAAAABAAAAAAAAAAAAAgAAAAAAA= - Game\Objects\Abilities\Ability.cs - - - - - - - ABCAQAAAACAiAAAEgAEAAAQIgAAAAEAAAAABAAAAAAE= - Game\Objects\Abilities\AbilityRule.cs - - - - - - - AAAAAAAAACAAAAAEgAQAAAQAAAAAAAAAAAAAAAAgAEA= - Game\Objects\AI\AI.cs - - - - - - - CQAEMAICBAAAAAAAAAAAIBQBACAAGEAAAIAiBAAIACA= - Game\Objects\Civilization\Aptitude.cs - - - - - - - AAAAAEAAIBAAgAMYSAAQQAQACCQAgAAAMgAAgAAUBAA= - Game\Objects\Civilization\Cargo.cs - - - - - - - ACAAAAAgAAAAAAAEAABAAgFAAgAAAAAAEAAAAAAEAAA= - Game\Objects\Civilization\CargoDelta.cs - - - - - - - AACAAASAACAAgAAICAAGQBABAEAAwCABJACAAAAAAAg= - Game\Objects\Civilization\Colony.cs - - - - - - - SAUAACSgAKgAgAAECAAGABQCMCIAjACAIQQBACGAAAw= - Game\Objects\Civilization\ConstructionQueue.cs - - - - - - - AAAEAAAAACggAABFgAAAAAQAACAAAJIAJAAAAAAAACA= - Game\Objects\Civilization\Culture.cs - - - - - - - SQBAogCBACIBxAw8CkDXatQjCYhAgFM+J6yDlGFEAYw= - Game\Objects\Civilization\Empire.cs - - - - - - - ACAAAAAAAAAgAAAAAABAAAQAAAAAAAAAAQAAAAAIAAA= - Game\Objects\Civilization\EmpireStatus.cs - - - - - - AKgMAgMgAiAoAIA0ogAAFMQKghQABABBCIAIEMIIAgQ= - Game\Objects\Civilization\HappinessModel.cs - - - - - - - AgABgYCAACgAgAEEgAAEQBQBACAAoAEABAAAEAMAAAA= - Game\Objects\Civilization\Race.cs - - - - - - - AAAAAAAACAAAAAAAAAAAAAQAAAAAAQAAAAAAAAAAAAA= - Game\Objects\Civilization\SectorWaypoint.cs - - - - - - QAAAAEAACAAAAAAAAAAAAAQAAAAAAQAAAAAAAAAAAAA= - Game\Objects\Civilization\SpaceObjectWaypoint.cs - - - - - - AAAAAQCAACAwAAAEgAAEQBQBAAAAAAAAJAAAEAEAAAA= - Game\Objects\Civilization\Trait.cs - - - - - - - AAAAAACACCAAgAAECAACABQCAAAAgQAAIAAAAAAEAAg= - Game\Objects\Civilization\Waypoint.cs - - - - - - - AAAAAQAAAAEgAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAA= - Game\Objects\Civilization\Diplomacy\AcceptProposalAction.cs - - - - - - AAAAAAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\Action.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQ= - Game\Objects\Civilization\Diplomacy\ActionMessage.cs - - - - - - AAAAAAAAAAAgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\BreakTreatyAction.cs - - - - - - AAAAAAAAAAAgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\DeclareWarAction.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA= - Game\Objects\Civilization\Diplomacy\GeneralMessage.cs - - - - - - AAAAAACAACAAgAAACIACABAAAAgAkAAAIAAAGAEEAAg= - Game\Objects\Civilization\Diplomacy\Message.cs - - - - - - - AQBAAACAIAAAgQAEAIgAAQAAABAAgAAAAAQAgAAEAAA= - Game\Objects\Civilization\Diplomacy\Package.cs - - - - - - - AAAAAACAACAggAQECIACAAAAAAABiAAAIAAAJEAEAAg= - Game\Objects\Civilization\Diplomacy\Proposal.cs - - - - - - - AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA= - Game\Objects\Civilization\Diplomacy\ProposalMessage.cs - - - - - - AAAAAQAAAAEgAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAA= - Game\Objects\Civilization\Diplomacy\RejectProposalAction.cs - - - - - - AAAAAABAAAIAAQAAAAAAAAAAABAAAAAAgAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\Clauses\AllianceClause.cs - - - - - - AAAAAACAACIEgAAECAACABAAABAEgAAgpAAAIAAEAAg= - Game\Objects\Civilization\Diplomacy\Clauses\Clause.cs - - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\Clauses\CooperativeResearchClause.cs - - - - - - AAAAAAAAIAIAAAAAAAAAgACAABAAAAAAgAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\Clauses\FreeTradeClause.cs - - - - - - AAAAAAAAAAIAAAAEAAAAAEAAABAAAAAAgAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\Clauses\ShareAbilityClause.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\Clauses\ShareCombatLogsClause.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\Clauses\ShareDesignsClause.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAA= - Game\Objects\Civilization\Diplomacy\Clauses\ShareVisionClause.cs - - - - - - AAAAAAAAIAIAAAAAAAAAAAAABBAAAAAAgAgAgAAAAAA= - Game\Objects\Civilization\Diplomacy\Clauses\TributeClause.cs - - - - - - AABAAAAAAAAAAAAAAIACAASAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat\BeamWeaponDisplayEffect.cs - - - - - - AAAAAAAAAAAAAAAAIAAAACAIAAAIAAAAAAQAAAAAAAA= - Game\Objects\Combat\Hit.cs - - - - - - - AABAAAAAAAAAAAAAAIACAASAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat\ProjectileWeaponDisplayEffect.cs - - - - - - AABAAAAAAAAAAAAAAIACAASAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat\SeekerWeaponDisplayEffect.cs - - - - - - AgABAAEAAAABCAAEIAAABAAgSAAAIAgAAAQAAAAAAAA= - Game\Objects\Combat\Shot.cs - - - - - - - ABBAEAAAAAAAAAAAAIACAASAAAAAAAAAAAAAEAEAAAA= - Game\Objects\Combat\WeaponDisplayEffect.cs - - - - - - - TAoJCAiUCDKAo0AJSgLC4DQMGCBDiQBgYIQQkIUQACo= - Game\Objects\Combat2\Battle_Space.cs - - - - - - - AABAAAAEQAAAAAAAIAAAAAAgIAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\combatObjects.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAACCAAA= - Game\Objects\Combat2\combatObjects.cs - - - - - - IAAAAAAAAAAIgAAAAAAAAAAgAAAAAACBAAAAAAAAAEA= - Game\Objects\Combat2\combatObjects.cs - - - - - - EggAAgASQIQBIAAAHAAyAAAAAAGEJAAAQgAAiEABKQA= - Game\Objects\Combat2\combatObjects.cs - - - - - - AAAAAACAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEA= - Game\Objects\Combat2\combatObjects.cs - - - - - - AAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAgAAAAEAAAgAA= - Game\Objects\Combat2\CombatPlanet.cs - - - - - - AAAAAAAAAgAQAAAAAAAAAAAAAgABAAAQAAAAAAAAAAA= - Game\Objects\Combat2\CombatReplayLog.cs - - - - - - AAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAQAA= - Game\Objects\Combat2\CombatReplayLog.cs - - - - - - AAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\CombatReplayLog.cs - - - - - - AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA= - Game\Objects\Combat2\CombatReplayLog.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAACAAAABAA= - Game\Objects\Combat2\CombatReplayLog.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\CombatReplayLog.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\CombatReplayLog.cs - - - - - - AAAAgECYQLQBAAMSCAAQQBAACCSAgAAAIgAAhEBRJAA= - Game\Objects\Combat2\CombatSeeker.cs - - - - - - - AABAAACAAAAACAAAIAAAACAACAAAAAgAAAQAAAAAAAA= - Game\Objects\Combat2\CombatShot.cs - - - - - - - gACAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA= - Game\Objects\Combat2\CombatVehicle.cs - - - - - - IAAAAAiIAEAAAAAABAAIAIAICAECAAAAAIAACAIAAAA= - Game\Objects\Combat2\CombatWeapon.cs - - - - - - QAAAAAAAAIABAAAAAAAAAAAAAAAEAAAAAAAQAAAAgBA= - Game\Objects\Combat2\ControlledCombatObject.cs - - - - - - AAIAAAAAECIQQIAAAEAAAAQCmEAkABAAgAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyBlocks.cs - - - - - - AAAAAgSEMCAAgAAACAICABQARAAAgAAAIAAAAAAEBAg= - Game\Objects\Combat2\StrategyObject.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Combat2\StrategyObject.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAgAAgAAAAAAAAAAAAAA= - Game\Objects\Combat2\Tactics\Tactic.cs - - - - - - BAACgACAACAAgQBACAAGQBQAEAAAgAAAIIAAAAAEAAg= - Game\Objects\Combat2\Tactics\TacticBlock.cs - - - - - - - AABkAACAICAAgQAACAACABAAAAAAgAAAIQAgAAAEAAg= - Game\Objects\Combat2\Tactics\TacticNode.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAgAAAAAAA= - Game\Objects\Combat2\Tactics\TacticNode.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAgAAAAAAA= - Game\Objects\Combat2\Tactics\TacticNode.cs - - - - - - AAAFAACAACAAgQAACAACABAAAAAAgAAAIQAgAAAEAAg= - Game\Objects\Combat2\Tactics\TacticNode.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAgAAAAAAA= - Game\Objects\Combat2\Tactics\TacticNode.cs - - - - - - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAQAAAAgAABAAAA= - Game\Objects\Combat2\Tactics\TacticNode.cs - - - - - - AAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAAAhAAAAAAA= - Game\Objects\Combat2\Tactics\TacticNode.cs - - - - - - AAEAAAAAAAAAAAQAAAAAAAAEAIAAAAAAAAAAAAAEAAA= - Game\Objects\Commands\AddOrderCommand.cs - - - - - - AAEAAAAAQAAAAAQAAAAEABAEAAAAAAAAAAAAAAAFAAA= - Game\Objects\Commands\Command.cs - - - - - - - AAAAAAAAAAAACIQAAAAAAAAEAAAAAAAAAAAAAAAAAAA= - Game\Objects\Commands\CreateDesignCommand.cs - - - - - - - AAAAAAAACAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAGAAA= - Game\Objects\Commands\CreateFleetCommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAgAEAAAAAAIAAAAAAAAAAAA= - Game\Objects\Commands\CreateWaypointCommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAIAAAACA= - Game\Objects\Commands\DeleteMessageCommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Commands\DeleteWaypointCommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Commands\DisbandFleetCommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAABAAAAA= - Game\Objects\Commands\EditStrategyCommand.cs - - - - - - IAAAAAAAAAAAAAQAAAAAAAAAAAAAAAIAAAAAAAAAAAA= - Game\Objects\Commands\HotkeyWaypointCommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAAAAAEAAAAAAAAIAAAAGAAA= - Game\Objects\Commands\JoinFleetCommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Commands\LeaveFleetCommand.cs - - - - - - AAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA= - Game\Objects\Commands\OrderCommand.cs - - - - - - - AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAI= - Game\Objects\Commands\RearrangeOrdersCommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Commands\RemoveOrderCommand.cs - - - - - - AAAAAAAAAAAAAEQQAABAEAACQAAAAAAQACAAAAAAAAI= - Game\Objects\Commands\ResearchCommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAIAAEAAA= - Game\Objects\Commands\SendMessageCommand.cs - - - - - - AAAAAgAAAAAACAQAAAgAAAAAAAAAAAAAAAAAAAAEAAA= - Game\Objects\Commands\SetObsoleteFlagCommand.cs - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\LogMessages\GenericLogMessage.cs - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAACAAAAAA= - Game\Objects\LogMessages\LogMessage.cs - - - - - - AAAAgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\LogMessages\PictorialLogMessage.cs - - - - - - - AQAAAACAEiAAggYBIAIAADAAAAAAAAAAAAAAgAAEAAA= - Game\Objects\Orders\ActivateAbilityOrder.cs - - - - - - - AQAAAACAECAAgAQFAAAAABAAAAAAggAAAAIAgAAEAAA= - Game\Objects\Orders\ColonizeOrder.cs - - - - - - - AQAAAACAEGAAiARBAAAAABAEAAEAgAAAAAAAgAEEAAA= - Game\Objects\Orders\ConstructionOrder.cs - - - - - - - AIAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Orders\EvadeOrder.cs - - - - - - AQAAAACAGCAIgAYFAAAAABAAABAAgAAEAAAAoAAEAAA= - Game\Objects\Orders\MoveOrder.cs - - - - - - - AYAAAACQGCAIgAYFIAQAADBAABAAgAAEAAAAoAAEAAA= - Game\Objects\Orders\PathfindingOrder.cs - - - - - - - AIAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Orders\PursueOrder.cs - - - - - - AQAAAACAECAAgAQFKAAAADAAAAAAAAAAAAAAgAAEAAA= - Game\Objects\Orders\RecycleFacilityOrCargoOrder.cs - - - - - - - AQAAAACAECAAgAQFCAAAABAAAAAAAAAAAAAAgAAEAAA= - Game\Objects\Orders\RecycleVehicleInSpaceOrder.cs - - - - - - - AQAAAACAECAAgAQFAAAAABAAAAAAgAAAAAAAgAAEAAA= - Game\Objects\Orders\SentryOrder.cs - - - - - - - AQAAAACAECAAgAQFIAAAEDABAAAAAAAAAAAAgAAEAAA= - Game\Objects\Orders\TransferCargoOrder.cs - - - - - - - AQAAAACAECAAmAQBAACAABAgAAEAoAAAAACAgAEEAAA= - Game\Objects\Orders\UpgradeFacilityOrder.cs - - - - - - - AQAAAACAGCAAgAYFAAAIABAACAAAgAAEAAAAoAAEAAA= - Game\Objects\Orders\WarpOrder.cs - - - - - - - AYAAAACAGCAIgAYFIAAAADAAABAAgAAEAAAAoAAEAAA= - Game\Objects\Orders\WaypointOrder.cs - - - - - - - AIAAAAAAAAAAAAQBAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Orders\RecycleBehaviors\ScrapBehavior.cs - - - - - - - AAAAAEAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAA= - Game\Objects\SimulatedObjectWrappers.cs - - - - - - - AAAAAEAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAA= - Game\Objects\SimulatedObjectWrappers.cs - - - - - - - AAAAAAAAACAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\SimulatedObjectWrappers.cs - - - - - - - AAAAAACEAAAAgACAAAQAAAAFAAAAACBAAAAAAAACQAA= - Game\Objects\Space\AsteroidField.cs - - - - - - - GCmAgkSgCDCCgAMcCABe4dSJGWQApSQBN4CRlCEUhBw= - Game\Objects\Space\Fleet.cs - - - - - - - 8AAQjJQxBRpxFaAtGDSOQGZZxQTQEAItBBAGDkEMjIg= - Game\Objects\Space\Galaxy.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAA= - Game\Objects\Space\Galaxy.cs - - - - - - AAAAAAAAAAAAAAAEgAIAAAAEAAAAAIAAAAAAAAAAAiA= - Game\Objects\Space\ObjectLocation.cs - - - - - - CAGEgkSsqDSAgSMQiAVc4YCNGWSBhCTBIwCRhaESxBw= - Game\Objects\Space\Planet.cs - - - - - - - AAgAAECAAAAAAAAEgABEZASBKQAAgYQBBEEAEAEkhiQ= - Game\Objects\Space\Sector.cs - - - - - - - AAAAAACAAAAAAAAQAEQAAAABAAAAAAAAAAAAgAAAAIA= - Game\Objects\Space\Star.cs - - - - - - - ABBIAUCABTAggABECAIGVDQDIAgAgAAAJEgBEAEwBAg= - Game\Objects\Space\StarSystem.cs - - - - - - - AAgAgAiACCAggIIUiAAGQJQBAACAhQAAJAGAEAEAAAw= - Game\Objects\Space\StellarObject.cs - - - - - - - AAAAAACAAAAAAACAAAQAAAABAAAAAAAAAAAAAAAAAAA= - Game\Objects\Space\Storm.cs - - - - - - - AAAAAACAAAAACAAAAAQAACABAAACAAAAAAAAAAAACAg= - Game\Objects\Space\WarpPoint.cs - - - - - - - BAAAA0SAAHAAgAMUCAAUQBQJCCQAgAUAJgQEkAEQBAA= - Game\Objects\Technology\Component.cs - - - - - - - AgAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= - Game\Objects\Technology\DirectFireWeaponInfo.cs - - - - - - AAAAA0SAAHABgAMUCQAUQBQBCCRAgAUAJkQEkAEQJAA= - Game\Objects\Technology\Facility.cs - - - - - - - AAAAAgAAAAAAACAAAAAAAAAAAAAAAAQAAAIEAAAAAAA= - Game\Objects\Technology\FacilityUpgrade.cs - - - - - - - ABAAAwiAACBggIAEiAgmQBQJEgAIgIQCpEAEEAGCAAg= - Game\Objects\Technology\Hull.cs - - - - - - - AAAAQgiAACBhqBAEyAAiBBREAABAgIQAIAQEEAECAgg= - Game\Objects\Technology\Mount.cs - - - - - - - BAAAAwQAAAAAgAAEwAQEVBQBAAAQEYUQVAQEEBEEAiA= - Game\Objects\Technology\MountedComponentTemplate.cs - - - - - - - AgAAAAAAAAAAEAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Technology\SeekingWeaponInfo.cs - - - - - - RAJQAECAADBhgQAUiAICABQAAABUgAAAIAAAEAGAAAg= - Game\Objects\Technology\Technology.cs - - - - - - - AAAAAAQAAAAAAAAAAAAAAEAAAAAAgAABAAgAAAAAAAA= - Game\Objects\Technology\TechnologyRequirement.cs - - - - - - - AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Objects\Technology\WarheadWeaponInfo.cs - - - - - - AgAAAACAAAgIAAAAAIAAAAAgAAAAAEAABgQAAGAAhAA= - Game\Objects\Technology\WeaponInfo.cs - - - - - - gAAAA0iAACAggAAEiAQGQhQBAAACgQQAJAAEkAEABAg= - Modding\Templates\FacilityTemplate.cs - - - - - - - AAgAAAAAAAABAAAAAAAAAAABAAAAAAAAAEAAhAAAAAw= - Game\Objects\Vehicles\Base.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA= - Game\Objects\Vehicles\Design.cs - - - - - - AIAQhwCAADAAgIcEGBQOahQBSAkAkQcApAANlRGGEAg= - Game\Objects\Vehicles\Design.cs - - - - - - - QAAAAAAAAAABAAAAAAAAAAABAAAAgAAAAEAAhAAAAAw= - Game\Objects\Vehicles\Drone.cs - - - - - - - QAAAAAAAAAABAAAAAAAAAAABAAAAgAAAAEAAhAAAAAw= - Game\Objects\Vehicles\Fighter.cs - - - - - - - QAAAAAAAAAABAAAAAAAAAAABAAAAgAAAAEAAhAAAAAw= - Game\Objects\Vehicles\Mine.cs - - - - - - - QAAAAAAAAAABAAAAAAAAAAABAAAAgAAAAEAAhAAAAAw= - Game\Objects\Vehicles\Satellite.cs - - - - - - - AAAAAAAAAAABAAAAAAAAAAABAAAAAAAAAEAAhAAAAAw= - Game\Objects\Vehicles\Ship.cs - - - - - - CAkAgAQgCCAAAgIACABF4YCBGQAAhQQBEQiRgCAAgAw= - Game\Objects\Vehicles\SpaceVehicle.cs - - - - - - - AAAAAAQACAABAAAACAAAAAABAAAAgQAAAEAAhAAAAAg= - Game\Objects\Vehicles\Troop.cs - - - - - - - FKCAgkCACnADiIMcCgAeQBQJCGRAgSQAJkAMlAEQJBg= - Game\Objects\Vehicles\Vehicle.cs - - - - - - - AAAAAAQACAABAAAACAAAAAABAAAAgQAAAEAAhAAAAAg= - Game\Objects\Vehicles\WeaponPlatform.cs - - - - - - - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAAAAACAAAAA= - Game\Objects\VictoryConditions\MajorEmpireEliminationVictoryCondition.cs - - - - - - - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAEAAACAAAAA= - Game\Objects\VictoryConditions\PeaceVictoryCondition.cs - - - - - - - AAAAAAAAAAAAAAAAAAEAAAAAAAgAAABAAAAAACAAAAA= - Game\Objects\VictoryConditions\ScorePercentageVictoryCondition.cs - - - - - - - AAAAAAAAAAAAAAgAAAEAAAAAAAAAAABAAAAAACAAAAA= - Game\Objects\VictoryConditions\ScoreVictoryCondition.cs - - - - - - - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAEAAACAAAAA= - Game\Objects\VictoryConditions\SurvivalVictoryCondition.cs - - - - - - - AAAAAAAAAAAAAAAAAAEAAAAAAAgAAABAAAAAACAAAAA= - Game\Objects\VictoryConditions\TechnologyVictoryCondition.cs - - - - - - - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAAAAACAAAAA= - Game\Objects\VictoryConditions\TotalEliminationVictoryCondition.cs - - - - - - - ACAAgIgAAAIAAAAAAARAAUQAQQAAAAAEASAAgAABAAU= - Game\Setup\EmpireTemplate.cs - - - - - - - QMAIkNSAYgAMkIEWGAQIAAgAQUHQEAYEgBAiGEEAiIQ= - Game\Setup\GameSetup.cs - - - - - - AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Setup\StarSystemPlacementStrategies\ClusteredStarSystemPlacementStrategy.cs - - - - - - - AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Setup\StarSystemPlacementStrategies\DiffuseStarSystemPlacementStrategy.cs - - - - - - - AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Setup\StarSystemPlacementStrategies\GridStarSystemPlacementStrategy.cs - - - - - - - AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Setup\StarSystemPlacementStrategies\RandomStarSystemPlacementStrategy.cs - - - - - - - AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Setup\StarSystemPlacementStrategies\SpiralStarSystemPlacementStrategy.cs - - - - - - - AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= - Game\Setup\WarpPointPlacementStrategies\CenterWarpPointPlacementStrategy.cs - - - - - - AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= - Game\Setup\WarpPointPlacementStrategies\EdgeAlignedWarpPointPlacementStrategy.cs - - - - - - AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= - Game\Setup\WarpPointPlacementStrategies\PlanetWarpPointPlacementStrategy.cs - - - - - - AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= - Game\Setup\WarpPointPlacementStrategies\RandomAlignedWarpPointPlacementStrategy.cs - - - - - - AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= - Game\Setup\WarpPointPlacementStrategies\RandomWarpPointPlacementStrategy.cs - - - - - - AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= - Game\Setup\WarpPointPlacementStrategies\StarWarpPointPlacementStrategy.cs - - - - - - AAAQAAAAAAAgAAAAAAAAAAQAAAAEAAAAAIAAAACAAAA= - Game\Setup\WarpPointPlacementStrategies\WarpPointPlacementStrategy.cs - - - - - - EAAAkIBAgABgAABEiAAAIAQIAACKAAAACAgAARBAABA= - Modding\DamageType.cs - - - - - - - IAAAgAAAAAAAAAAEAAAAAAAAEAAAAAAAAAAAAAAAAAA= - Modding\DataFile.cs - - - - - - AAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAhAA= - Modding\DataParsingException.cs - - - - - - AAAAAAAAAAAAAAAAgAAAAEAAAAAAQAAAAAgAAAAAAAA= - Modding\EmpireTraitRequirement.cs - - - - - - AAACAAIAAAABAAAEQAAAAAQEAAAAANAAAAAgFAAQAAA= - Modding\Field.cs - - - - - - AAAAAAAAAgQAAAQE4AUAAgAAAAAgAIAAAAEgOAIAQmA= - Modding\Formula.cs - - - - - - - AAAAAAAAAAAAAIAAAAAAQAAAAAAAAAgAAAQAAAAAAAA= - Modding\FormulaContext.cs - - - - - - AAAgAAAAAAAAQAAAAAQAgAAAAAAAAAAAAIAAAAAAAAA= - Modding\MetaRecord.cs - - - - - - - gAAAAACAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= - Modding\MetaRecordParameter.cs - - - - - - AIAAgQABESEAAQEExgCQAMgAAAAIQAEgsCAAAEoAAgI= - Modding\Mod.cs - - - - - - - IAAAAgAAACAggAAAgAAAAAQAAAAAAAAAAAAAAAAABAA= - Modding\ModInfo.cs - - - - - - - AAABAAAAAAAAgAAEgAAAAAAABAAAAIAAAAAgIAAAAiA= - Modding\ModReference.cs - - - - - - - QQEisCCgAIAQniiAvhCiMIoJWGIUgFQLCBqMCAGOkAE= - Modding\ModSettings.cs - - - - - - CAAAAQAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAA= - Modding\PopulationModifier.cs - - - - - - AAAAAAAAAAAgAABEAQAAACAAAAAAAAAAAAAAAAAAgAA= - Modding\Record.cs - - - - - - AAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAAAgAAAAAAAA= - Modding\Requirement.cs - - - - - - AAAQAAAAAgAAAAAAYAUAAgAAAAAAAAAAAAAgAAAAAAA= - Modding\ResourceFormula.cs - - - - - - AAgQgAAAACAAAAAGgAAAAAAAAAAAAIECAAAACAAAAiA= - Modding\Script.cs - - - - - - AAACCABAAAAAI4AAIQAgGAAIAAAAAQAAABAAAAQAAEA= - Modding\ScriptEngine.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACA= - Modding\ScriptEngine.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAEAAAAAABAAAAAgAAAAAAAA= - Modding\ScriptRequirement.cs - - - - - - CAAAAAAACCAAAIQEwAAAQBQAAAABAAAIAAQAAAAAAAA= - Modding\StellarObjectSize.cs - - - - - - - AAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\AbilityLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\AbilityRuleLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAIAAAAAAAAAAAAAABABAAAAA= - Modding\Loaders\ComponentLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\CultureLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\DamageTypeLoader.cs - - - - - - AAAAgAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABAAAI= - Modding\Loaders\DataFileLoader.cs - - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAI= - Modding\Loaders\EmpireAILoader.cs - - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\FacilityLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\GalaxyLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\HappinessModelLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\HullLoader.cs - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAI= - Modding\Loaders\ModInfoLoader.cs - - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\ModSettingsLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\MountLoader.cs - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\PopulationModifierLoader.cs - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\RequirementLoader.cs - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAI= - Modding\Loaders\ScriptLoader.cs - - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\StarSystemLoader.cs - - - - - - CAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\StellarAbilityLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\StellarObjectLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\StellarObjectSizeLoader.cs - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\TechnologyLoader.cs - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAABAAAI= - Modding\Loaders\TextLoader.cs - - - - - - - AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Loaders\TraitLoader.cs - - - - - - AAAIAAAAAACIAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= - Modding\StellarObjectLocations\CircleRadiusStellarObjectLocation.cs - - - - - - - AAAAAAAAAACIAAAAAAAAAAAAIAAAAgAIAAAAAAAAAAA= - Modding\StellarObjectLocations\CoordStellarObjectLocation.cs - - - - - - - AAAAAAAQAACIAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= - Modding\StellarObjectLocations\RingStellarObjectLocation.cs - - - - - - - AAAAAAAAAACIAAAAAAAAAAAAAAAAAgAAABAIAAAAAAA= - Modding\StellarObjectLocations\SameAsStellarObjectLocation.cs - - - - - - - AAAAAQAAACAAAIAAgAQAAAQEAAAAAAAAAAAAAAACAAA= - Modding\Templates\AsteroidFieldTemplate.cs - - - - - - - ggIAA0iAACAggAAEiAQHRBQBEAAAgAQIJAAEEBECBAg= - Modding\Templates\ComponentTemplate.cs - - - - - - - AAAAQAAKACAgAAAAiAwACAQIABAAAAAAAAAAEAgAAQA= - Modding\Templates\GalaxyTemplate.cs - - - - - - - AAAAAQAAACAAAIAAwAQAAAQEAAAAAAAAAAAAAAACAAA= - Modding\Templates\PlanetTemplate.cs - - - - - - - AAAAAAAAACAAAAAAgAQAAAQAAAAAAAAAAAAAACAAAAA= - Modding\Templates\RandomAbilityTemplate.cs - - - - - - - AAFIAQAAACAgAAAAgAQEQAQBAAgAAAAABAgAAAAgAAA= - Modding\Templates\StarSystemTemplate.cs - - - - - - - AAAAAQAAACAAAIAQgEQAAAQAAAAAAAAAAAAAgAAAAIA= - Modding\Templates\StarTemplate.cs - - - - - - - AAAAAQAAACAAgAAAgAQAAAQAAAAAAAAAAAAAAAAAAAA= - Modding\Templates\StormTemplate.cs - - - - - - - AAAAAAAAAAAAAAAAAAABEAAAAQAAAAAAAAAAAAAAAIA= - - - - - - AAAAAAAAAAAAAAAAAAAAIAAAAAABAAAAAAAAAAAAAAA= - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\ClientSafeAttribute.cs - - - - - - AD4AAFBAACBARBDQAGjABIQAIBAAACAAIwAIASBYKAA= - Utility\ConnectivityGraph.cs - - - - - - - AABCAAAAAAAAAAAABEAABIAACAAAACAAAAAAAAAAAAA= - Utility\DynamicDictionary.cs - - - - - - AAAAAAAAAAAAgAAEiAAAAAAABAAAAKAAAAAgIAAEAiA= - Utility\GalaxyReference.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAAAA= - Utility\HashCodeMasher.cs - - - - - - wCAAAAAAAAAAAAAQQAABAAAABAgAAAAAAIAAAAAEAAA= - Utility\MiningModel.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= - Utility\NameAttribute.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\NameAttribute.cs - - - - - - AAAgABAAAEAAEAAQAAAAAAAEEAAAABAAAgYAIQAAAAA= - Utility\ObjectGraphParser.cs - - - - - - gIIkQAAAAgAQAAABAQAAgEEgAAAAAAAAAgAAAEAAAAA= - Utility\ObjectGraphParser.cs - - - - - - AAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\ObjectGraphParser.cs - - - - - - AAAAAAAAAAAAAIKAAAAAAEAAAAAAAAAAAAAAIAAAAAA= - Utility\Pathfinder.cs - - - - - - AAAAAAAAAAAAAgAEAAIABBAAAAAAAAAAAAAAAAAAAAA= - Utility\Pathfinder.cs - - - - - - ABABgIAAAAgCAAARACAAIAAAAAAAAgAAAIEEEAgAAAE= - Utility\Pictures.cs - - - - - - AgAAAAAAAAAACAQEgEAAAAAAAAAAAIAAAAAAACAAAiA= - Utility\PRNG.cs - - - - - - gBAAAAAAAAAAAAAEAAAAAAQAAAAICAAAAAggAAAAAAA= - Utility\Progress.cs - - - - - - AAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAAAAAAAAAAAAA= - Utility\Progress.cs - - - - - - AgAAAAAAAAAACAAAAAAAAAAAAAAAAAAIAAAAAAAAAAA= - Utility\RandomHelper.cs - - - - - - CCICAAAAABAEABAQCAAABAQAAAAAAAAAAAAgAABUIAA= - Utility\ReferenceKeyedDictionary.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\ReferenceKeyedDictionary.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\ReferenceKeyedDictionary.cs - - - - - - AGIAAkAAABAAABAQCAAABAQAAAAAAAAACAAAAABUIAA= - Utility\ReferenceList.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\ReferenceList.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\ReferenceList.cs - - - - - - ACoAABBAADBARBBQAAQABAQAIAAAACAAAgAAAABUIAA= - Utility\ReferenceSet.cs - - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\ReferenceSet.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\ReferenceSet.cs - - - - - - AAAEAAggAAQAAQAEoAAAAAQEBCAIAIAABIAAkAWABiA= - Utility\Resource.cs - - - - - - - AAIgAAAAABAAAAQE8AWAAgAAAAAAAIAAAAAAAAAAByA= - Utility\ResourceQuantity.cs - - - - - - - CCICIAAAAAAEABAQCAAABAQAAAAAAAAAAAAgQABQIAA= - Utility\SafeDictionary.cs - - - - - - - AAAAAAAAAAAAAAAEAAAAAAQIAAEAAAAIBQAAAAAAIAA= - Utility\SafeType.cs - - - - - - AAAAAAAAAAAAAAAAgAAAAAAAAAAAAIAAAAAAAAAAAAA= - Utility\SequenceEqualityComparer.cs - - - - - - - AAQIAAAAAAAAAAAgAiAAoAACACBIAAIgAAAgAAACAAA= - Utility\Serializer.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\Serializer.cs - - - - - - AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Utility\Serializer.cs - - - - - - AAAAAAAAAAAAAAAABAAAAAAAAAAAAEAAAIBAIACAACA= - Utility\Status.cs - - - - - - i9OiRZ0iqHWSCpP+IezR8nFp0jpC03EIG1yzfTca+Yw= - Utility\Extensions\CommonExtensions.cs - - - - - - AABAAAAAAAAAEAAAAAAAAAgAAAAAAAABAAAAAAAAEAA= - Utility\Extensions\Parser.cs - - - - - - AAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAABAA= - Utility\Extensions\TaskFactoryExtensions.cs - - - - - - AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAQAAAAAAAAAAAA= - Modding\Templates\RandomAbilityTemplate.cs - - - - - - AAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA= - Modding\Interfaces\IModObject.cs - - - - - - AAAAAAAAAAAAAAAAAAAEQAABAAAAAAAABAAAAAAAAAA= - Game\Interfaces\IAbilityObject.cs - - - - - - AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IAbilityObject.cs - - - - - - AAAAAAAAAAAAAAAAAABAIACACQAAAAQBAAAAAAAAgAQ= - Game\Interfaces\ICargoContainer.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\ICargoTransferrer.cs - - - - - - AAAAAAAAAAAAAAAQAAAIAAAIAAAAAAAAAAAAAAAAABA= - Game\Interfaces\ICombatant.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\ICombatSpaceObject.cs - - - - - - AAEAAAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\ICommand.cs - - - - - - AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\ICommand.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA= - Game\Interfaces\ICommonAbilityObject.cs - - - - - - AAAAAACAAEAAAAAAAAAEABAAAAAAAAAAAEAAAAAAAAA= - Game\Interfaces\IConstructable.cs - - - - - - AAAAAAAAAEAAAAAAAAAAABAEAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IConstructionOrder.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAhAAAAAAAQAAAAAAgAAAAAA= - Game\Interfaces\IConstructionTemplate.cs - - - - - - AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IContainable.cs - - - - - - AAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\ICreateDesignCommand.cs - - - - - - AAAAAEAAABAAAAMQCAAQQAAACCQAgAAAIgAAgAAQBAA= - Game\Interfaces\IDamageable.cs - - - - - - AIAAhgCAABAAgIcAEBQIKAQBCAkAEAAAAAAJBBACEAA= - Game\Interfaces\IDesign.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IDesign.cs - - - - - - AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IErrorProne.cs - - - - - - AAAAAAAAAAAAAAAACAACAAAAAAAAgAAAIAAAAAAAAAg= - Game\Interfaces\IFoggable.cs - - - - - - ABAAAAgAAABggIAAAAggABQIEAAIAIACgEAAEACCAAA= - Game\Interfaces\IHull.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IHull.cs - - - - - - AACAAAAAAAAAAAAAAAAAAAAAAEAAACAAAAAAAAAAAAA= - Game\Interfaces\IIncomeProducer.cs - - - - - - AAAAAAAACAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAA= - Game\Interfaces\ILocated.cs - - - - - - AAAAAAAAAAAAgAAAAAAAAAAAAAgAEAAAAAAACAAAAAA= - Game\Interfaces\IMessage.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAA= - Game\Interfaces\IMineableSpaceObject.cs - - - - - - CAAAAgAACAAAgAAAAAAEgQABEAAAAAAAAAAQgAAAAAA= - Game\Interfaces\IMobileSpaceObject.cs - - - - - - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IMobileSpaceObject.cs - - - - - - AAAAAAAACAAAAAIAAAAAAAAAAAAAAAAEAAAAIAAAAAA= - Game\Interfaces\IMovementOrder.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IMovementOrder.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\INamed.cs - - - - - - AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAA= - Game\Interfaces\IOrder.cs - - - - - - AAAAAAAAEAAAAAQBAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IOrder.cs - - - - - - AAEAAAAgAAAAAAAAAAAAAAAAAAAABAAAAQAAACAAAAA= - Game\Interfaces\IOrderable.cs - - - - - - AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IOrderCommand.cs - - - - - - AAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IOwnable.cs - - - - - - AAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IOwnable.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IOwnableAbilityObject.cs - - - - - - AYAAAACQAAAIAAAAAAQAACBAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IPathfindingOrder.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAEAAAA= - Game\Interfaces\IPictorial.cs - - - - - - AAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IPictorialLogMessage.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IPlanetOrder.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA= - Game\Interfaces\IPromotable.cs - - - - - - AAAAAAAAAAABAAAAAAAAAAAAAABAAAAAAAAAAAAAIAA= - Game\Interfaces\IRecyclable.cs - - - - - - AIAAAAAAAAAAAAQBAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IRecycleBehavior.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAA= - Game\Interfaces\IReference.cs - - - - - - AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IReference.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IReferenceEnumerable.cs - - - - - - AAAAAAAAAAAAgAAAAAAAABAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IReferrable.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IResearchable.cs - - - - - - AAgAgAAAAAAAAAIAAAAAAIQAAAAABAAAAACAAAAAAAQ= - Game\Interfaces\ISpaceObject.cs - - - - - - AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IStarSystemPlacementStrategy.cs - - - - - - AAAAAAgAAAAgAIAAgAAAAAQAAAAAAAAAAAEAAAAAAAA= - Game\Interfaces\IStellarObject.cs - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA= - Game\Interfaces\ITargetable.cs - - - - - - AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\ITemplate.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IUnit.cs - - - - - - AAAAAACAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IUnlockable.cs - - - - - - AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAA= - Game\Interfaces\IUpgradeable.cs - - - - - - AAAAAgAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= - Game\Interfaces\IVehicle.cs - - - - - - AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAAAAACAAAAA= - Game\Interfaces\IVictoryCondition.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAgAAAAAAA= - Game\Objects\Combat2\Tactics\TacticNode.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAgAAAAAgAAAAAAAgCAAAAAA= - Modding\Interfaces\IFormula.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAgAAAAAAA= - Modding\Interfaces\IFormula.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAA= - Modding\Interfaces\IFormulaHost.cs - - - - - - AAAAAAAAAACIAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= - Modding\Interfaces\IStellarObjectLocation.cs - - - - - - AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAI= - Modding\Loaders\ILoader.cs - - - - - - QAIKAEAAGAAAAIABoAAIAAAABBDAAYEAgIJAAAGKQMA= - Game\Enumerations\AbilityTargets.cs - - - - - - AAIAAEAAAQAAAAAAAAAAAAAAAAEAAAEAAAAAAAEAAAA= - Game\Enumerations\AbilityValueRule.cs - - - - - - AAAAAAAEAAAAAAAABAQAAAAAAAAAAAAAAAAABAEAAAA= - Game\Enumerations\AllianceLevel.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAIAAAAEAAAA= - Game\Enumerations\AllowedTrades.cs - - - - - - AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAABAAEAA= - Game\Enumerations\EmpirePlacement.cs - - - - - - AAAAgAAAAIAAAAAAAAAAAAAAAQAAgAAAAAAAAAAABCg= - Game\Enumerations\Mood.cs - - - - - - AAAAAAAAAAAAAAAAAIAAAAABAAAAgAAAAIEAAAAAAAA= - Game\Enumerations\ScoreDisplay.cs - - - - - - AAAAAAAAAAAAAAAAAgAAAAAAAAgAAAAAAAAAAAEEAAA= - Game\Enumerations\SharingPriority.cs - - - - - - AAAAAAAAAAAAAAAAAgAAAAAAAAgAAAAAAAAAAAAEAAA= - Game\Enumerations\StartingTechnologyLevel.cs - - - - - - AAEAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAABAEAAA= - Game\Enumerations\StellarSize.cs - - - - - - AAAAAAAAAAAAAAAAAgAAAAAAAAgAAAAAAAAAAAAEAAA= - Game\Enumerations\TechnologyCost.cs - - - - - - AAICAAAAEAAAAAAAAAAAAAAAABDAAIAAAIAAAAEAQIA= - Game\Enumerations\VehicleTypes.cs - - - - - - AAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAIAAAAIACAABA= - Game\Enumerations\Visibility.cs - - - - - - AAACAAAAEAAAAAAAAAAAAAAAAADAAIAAAIIAAAEAQAA= - Game\Enumerations\WeaponTargets.cs - - - - - - AAAAAAACAAoAAAAAAAAABAACACAAAAAAAIAAAAEAICA= - Game\Enumerations\WeaponTypes.cs - - - - - - AQAAAAAAQAAAAAAAAAAAAAAAAAQAAAAAAAACAAAAAAA= - Game\Objects\Civilization\EmpireStatus.cs - - - - - - AAQAAAAAAAAAAAABAAAAAAAAAAAAAAAEAAAAAAAAAAA= - Modding\Enumerations\FormulaType.cs - - - - - - gAAAAAAAAAAAAAAAAAAAAAAEAAAAgAAAAAAAAAAAAAA= - Modding\Enumerations\RequirementType.cs - - - - - - AAAAAAAAAQAAAAAAAAAAAAAAAAAAACCAAAAAAAAAAAA= - Utility\Extensions\CommonExtensions.cs - - - - - - AAAAAAAAAAAACAAAAAAAAAAAAAgACAAAAAAAAAAAAAA= - Utility\ProgressDisplayMode.cs - - - + + + + + + AAAAAABAAAAAAAAAAAIAAAAAAAAAAAAgAAAAAAAAAAA= + FrEeeConstants.cs + + + + + + AAAAAAAAAAAAgAAAAAAAAAAAAACAAAAAAQAAAAAAAAA= + Game\Interfaces\IReference.cs + + + + + + + AAAAQESAAGAggAAEAAAAABAAAAAAAAAAAAAgAAAAAAA= + Game\Objects\Abilities\Ability.cs + + + + + + + ABCAQAAAACAiAAAEgAEAAAQIgAAAAEAAAAABAAAAAAE= + Game\Objects\Abilities\AbilityRule.cs + + + + + + + AAAAAAAAACAAAAAEgAQAAAQAAAAAAAAAAAAAAAAgAEA= + Game\Objects\AI\AI.cs + + + + + + + CQAEMAICBAAAAAAAAAAAIBQBACAAGEAAAIAiBAAIACA= + Game\Objects\Civilization\Aptitude.cs + + + + + + + AAAAAEAAIBAAgAMYSAAQQAQACCQAgAAAMgAAgAAUBAA= + Game\Objects\Civilization\Cargo.cs + + + + + + + ACAAAAAgAAAAAAAEAABAAgFAAgAAAAAAEAAAAAAEAAA= + Game\Objects\Civilization\CargoDelta.cs + + + + + + + AACAAASAACAAgAAICAAGQBABAEAAwCABJACAAAAAAAg= + Game\Objects\Civilization\Colony.cs + + + + + + + SAUAACSgAKgAgAAECAAGABQCMCIAjACAIQQBACGAAAw= + Game\Objects\Civilization\ConstructionQueue.cs + + + + + + + AAAEAAAAACggAABFgAAAAAQAACAAAJIAJAAAAAAAACA= + Game\Objects\Civilization\Culture.cs + + + + + + + SQBAogCBACIBxAw8CkDXatQjCYhAgFM+J6yDlGFEAYw= + Game\Objects\Civilization\Empire.cs + + + + + + + ACAAAAAAAAAgAAAAAABAAAQAAAAAAAAAAQAAAAAIAAA= + Game\Objects\Civilization\EmpireStatus.cs + + + + + + AKgMAgMgAiAoAIA0ogAAFMQKghQABABBCIAIEMIIAgQ= + Game\Objects\Civilization\HappinessModel.cs + + + + + + + AgABgYCAACgAgAEEgAAEQBQBACAAoAEABAAAEAMAAAA= + Game\Objects\Civilization\Race.cs + + + + + + + AAAAAAAACAAAAAAAAAAAAAQAAAAAAQAAAAAAAAAAAAA= + Game\Objects\Civilization\SectorWaypoint.cs + + + + + + QAAAAEAACAAAAAAAAAAAAAQAAAAAAQAAAAAAAAAAAAA= + Game\Objects\Civilization\SpaceObjectWaypoint.cs + + + + + + AAAAAQCAACAwAAAEgAAEQBQBAAAAAAAAJAAAEAEAAAA= + Game\Objects\Civilization\Trait.cs + + + + + + + AAAAAACACCAAgAAECAACABQCAAAAgQAAIAAAAAAEAAg= + Game\Objects\Civilization\Waypoint.cs + + + + + + + AAAAAQAAAAEgAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAA= + Game\Objects\Civilization\Diplomacy\AcceptProposalAction.cs + + + + + + AAAAAAAAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\Action.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQ= + Game\Objects\Civilization\Diplomacy\ActionMessage.cs + + + + + + AAAAAAAAAAAgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\BreakTreatyAction.cs + + + + + + AAAAAAAAAAAgAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\DeclareWarAction.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA= + Game\Objects\Civilization\Diplomacy\GeneralMessage.cs + + + + + + AAAAAACAACAAgAAACIACABAAAAgAkAAAIAAAGAEEAAg= + Game\Objects\Civilization\Diplomacy\Message.cs + + + + + + + AQBAAACAIAAAgQAEAIgAAQAAABAAgAAAAAQAgAAEAAA= + Game\Objects\Civilization\Diplomacy\Package.cs + + + + + + + AAAAAACAACAggAQECIACAAAAAAABiAAAIAAAJEAEAAg= + Game\Objects\Civilization\Diplomacy\Proposal.cs + + + + + + + AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA= + Game\Objects\Civilization\Diplomacy\ProposalMessage.cs + + + + + + AAAAAQAAAAEgAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAA= + Game\Objects\Civilization\Diplomacy\RejectProposalAction.cs + + + + + + AAAAAABAAAIAAQAAAAAAAAAAABAAAAAAgAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\Clauses\AllianceClause.cs + + + + + + AAAAAACAACIEgAAECAACABAAABAEgAAgpAAAIAAEAAg= + Game\Objects\Civilization\Diplomacy\Clauses\Clause.cs + + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\Clauses\CooperativeResearchClause.cs + + + + + + AAAAAAAAIAIAAAAAAAAAgACAABAAAAAAgAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\Clauses\FreeTradeClause.cs + + + + + + AAAAAAAAAAIAAAAEAAAAAEAAABAAAAAAgAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\Clauses\ShareAbilityClause.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\Clauses\ShareCombatLogsClause.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\Clauses\ShareDesignsClause.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAABAAAAAAgAAAAAAAAAA= + Game\Objects\Civilization\Diplomacy\Clauses\ShareVisionClause.cs + + + + + + AAAAAAAAIAIAAAAAAAAAAAAABBAAAAAAgAgAgAAAAAA= + Game\Objects\Civilization\Diplomacy\Clauses\TributeClause.cs + + + + + + AABAAAAAAAAAAAAAAIACAASAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat\BeamWeaponDisplayEffect.cs + + + + + + AAAAAAAAAAAAAAAAIAAAACAIAAAIAAAAAAQAAAAAAAA= + Game\Objects\Combat\Hit.cs + + + + + + + AABAAAAAAAAAAAAAAIACAASAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat\ProjectileWeaponDisplayEffect.cs + + + + + + AABAAAAAAAAAAAAAAIACAASAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat\SeekerWeaponDisplayEffect.cs + + + + + + AgABAAEAAAABCAAEIAAABAAgSAAAIAgAAAQAAAAAAAA= + Game\Objects\Combat\Shot.cs + + + + + + + ABBAEAAAAAAAAAAAAIACAASAAAAAAAAAAAAAEAEAAAA= + Game\Objects\Combat\WeaponDisplayEffect.cs + + + + + + + TAoJCAiUCDKAo0AJSgLC4DQMGCBDiQBgYIQQkIUQACo= + Game\Objects\Combat2\Battle_Space.cs + + + + + + + AABAAAAEQAAAAAAAIAAAAAAgIAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\combatObjects.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAACCAAA= + Game\Objects\Combat2\combatObjects.cs + + + + + + IAAAAAAAAAAIgAAAAAAAAAAgAAAAAACBAAAAAAAAAEA= + Game\Objects\Combat2\combatObjects.cs + + + + + + EggAAgASQIQBIAAAHAAyAAAAAAGEJAAAQgAAiEABKQA= + Game\Objects\Combat2\combatObjects.cs + + + + + + AAAAAACAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAEA= + Game\Objects\Combat2\combatObjects.cs + + + + + + AAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAgAAAAEAAAgAA= + Game\Objects\Combat2\CombatPlanet.cs + + + + + + AAAAAAAAAgAQAAAAAAAAAAAAAgABAAAQAAAAAAAAAAA= + Game\Objects\Combat2\CombatReplayLog.cs + + + + + + AAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAQAA= + Game\Objects\Combat2\CombatReplayLog.cs + + + + + + AAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\CombatReplayLog.cs + + + + + + AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAA= + Game\Objects\Combat2\CombatReplayLog.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAGAAAAAAAAACAAAABAA= + Game\Objects\Combat2\CombatReplayLog.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\CombatReplayLog.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\CombatReplayLog.cs + + + + + + AAAAgECYQLQBAAMSCAAQQBAACCSAgAAAIgAAhEBRJAA= + Game\Objects\Combat2\CombatSeeker.cs + + + + + + + AABAAACAAAAACAAAIAAAACAACAAAAAgAAAQAAAAAAAA= + Game\Objects\Combat2\CombatShot.cs + + + + + + + gACAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAA= + Game\Objects\Combat2\CombatVehicle.cs + + + + + + IAAAAAiIAEAAAAAABAAIAIAICAECAAAAAIAACAIAAAA= + Game\Objects\Combat2\CombatWeapon.cs + + + + + + QAAAAAAAAIABAAAAAAAAAAAAAAAEAAAAAAAQAAAAgBA= + Game\Objects\Combat2\ControlledCombatObject.cs + + + + + + AAIAAAAAECIQQIAAAEAAAAQCmEAkABAAgAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyBlocks.cs + + + + + + AAAAAgSEMCAAgAAACAICABQARAAAgAAAIAAAAAAEBAg= + Game\Objects\Combat2\StrategyObject.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Combat2\StrategyObject.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAgAAgAAAAAAAAAAAAAA= + Game\Objects\Combat2\Tactics\Tactic.cs + + + + + + BAACgACAACAAgQBACAAGQBQAEAAAgAAAIIAAAAAEAAg= + Game\Objects\Combat2\Tactics\TacticBlock.cs + + + + + + + AABkAACAICAAgQAACAACABAAAAAAgAAAIQAgAAAEAAg= + Game\Objects\Combat2\Tactics\TacticNode.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAgAAAAAAA= + Game\Objects\Combat2\Tactics\TacticNode.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAgAAAAAAA= + Game\Objects\Combat2\Tactics\TacticNode.cs + + + + + + AAAFAACAACAAgQAACAACABAAAAAAgAAAIQAgAAAEAAg= + Game\Objects\Combat2\Tactics\TacticNode.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAgAAAAAAA= + Game\Objects\Combat2\Tactics\TacticNode.cs + + + + + + AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAQAAAAgAABAAAA= + Game\Objects\Combat2\Tactics\TacticNode.cs + + + + + + AAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAAAhAAAAAAA= + Game\Objects\Combat2\Tactics\TacticNode.cs + + + + + + AAEAAAAAAAAAAAQAAAAAAAAEAIAAAAAAAAAAAAAEAAA= + Game\Objects\Commands\AddOrderCommand.cs + + + + + + AAEAAAAAQAAAAAQAAAAEABAEAAAAAAAAAAAAAAAFAAA= + Game\Objects\Commands\Command.cs + + + + + + + AAAAAAAAAAAACIQAAAAAAAAEAAAAAAAAAAAAAAAAAAA= + Game\Objects\Commands\CreateDesignCommand.cs + + + + + + + AAAAAAAACAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAGAAA= + Game\Objects\Commands\CreateFleetCommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAgAEAAAAAAIAAAAAAAAAAAA= + Game\Objects\Commands\CreateWaypointCommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAIAAAACA= + Game\Objects\Commands\DeleteMessageCommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Commands\DeleteWaypointCommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Commands\DisbandFleetCommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAABAAAAA= + Game\Objects\Commands\EditStrategyCommand.cs + + + + + + IAAAAAAAAAAAAAQAAAAAAAAAAAAAAAIAAAAAAAAAAAA= + Game\Objects\Commands\HotkeyWaypointCommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAAAAAEAAAAAAAAIAAAAGAAA= + Game\Objects\Commands\JoinFleetCommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Commands\LeaveFleetCommand.cs + + + + + + AAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA= + Game\Objects\Commands\OrderCommand.cs + + + + + + + AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAI= + Game\Objects\Commands\RearrangeOrdersCommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Commands\RemoveOrderCommand.cs + + + + + + AAAAAAAAAAAAAEQQAABAEAACQAAAAAAQACAAAAAAAAI= + Game\Objects\Commands\ResearchCommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAIAAEAAA= + Game\Objects\Commands\SendMessageCommand.cs + + + + + + AAAAAgAAAAAACAQAAAgAAAAAAAAAAAAAAAAAAAAEAAA= + Game\Objects\Commands\SetObsoleteFlagCommand.cs + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\LogMessages\GenericLogMessage.cs + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAACAAAAAA= + Game\Objects\LogMessages\LogMessage.cs + + + + + + AAAAgAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\LogMessages\PictorialLogMessage.cs + + + + + + + AQAAAACAEiAAggYBIAIAADAAAAAAAAAAAAAAgAAEAAA= + Game\Objects\Orders\ActivateAbilityOrder.cs + + + + + + + AQAAAACAECAAgAQFAAAAABAAAAAAggAAAAIAgAAEAAA= + Game\Objects\Orders\ColonizeOrder.cs + + + + + + + AQAAAACAEGAAiARBAAAAABAEAAEAgAAAAAAAgAEEAAA= + Game\Objects\Orders\ConstructionOrder.cs + + + + + + + AIAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Orders\EvadeOrder.cs + + + + + + AQAAAACAGCAIgAYFAAAAABAAABAAgAAEAAAAoAAEAAA= + Game\Objects\Orders\MoveOrder.cs + + + + + + + AYAAAACQGCAIgAYFIAQAADBAABAAgAAEAAAAoAAEAAA= + Game\Objects\Orders\PathfindingOrder.cs + + + + + + + AIAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Orders\PursueOrder.cs + + + + + + AQAAAACAECAAgAQFKAAAADAAAAAAAAAAAAAAgAAEAAA= + Game\Objects\Orders\RecycleFacilityOrCargoOrder.cs + + + + + + + AQAAAACAECAAgAQFCAAAABAAAAAAAAAAAAAAgAAEAAA= + Game\Objects\Orders\RecycleVehicleInSpaceOrder.cs + + + + + + + AQAAAACAECAAgAQFAAAAABAAAAAAgAAAAAAAgAAEAAA= + Game\Objects\Orders\SentryOrder.cs + + + + + + + AQAAAACAECAAgAQFIAAAEDABAAAAAAAAAAAAgAAEAAA= + Game\Objects\Orders\TransferCargoOrder.cs + + + + + + + AQAAAACAECAAmAQBAACAABAgAAEAoAAAAACAgAEEAAA= + Game\Objects\Orders\UpgradeFacilityOrder.cs + + + + + + + AQAAAACAGCAAgAYFAAAIABAACAAAgAAEAAAAoAAEAAA= + Game\Objects\Orders\WarpOrder.cs + + + + + + + AYAAAACAGCAIgAYFIAAAADAAABAAgAAEAAAAoAAEAAA= + Game\Objects\Orders\WaypointOrder.cs + + + + + + + AIAAAAAAAAAAAAQBAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Orders\RecycleBehaviors\ScrapBehavior.cs + + + + + + + AAAAAEAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAA= + Game\Objects\SimulatedObjectWrappers.cs + + + + + + + AAAAAEAAACAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAA= + Game\Objects\SimulatedObjectWrappers.cs + + + + + + + AAAAAAAAACAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\SimulatedObjectWrappers.cs + + + + + + + AAAAAACEAAAAgACAAAQAAAAFAAAAACBAAAAAAAACQAA= + Game\Objects\Space\AsteroidField.cs + + + + + + + GCmAgkSgCDCCgAMcCABe4dSJGWQApSQBN4CRlCEUhBw= + Game\Objects\Space\Fleet.cs + + + + + + + 8AAQjJQxBRpxFaAtGDSOQGZZxQTQEAItBBAGDkEMjIg= + Game\Objects\Space\Galaxy.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAA= + Game\Objects\Space\Galaxy.cs + + + + + + AAAAAAAAAAAAAAAEgAIAAAAEAAAAAIAAAAAAAAAAAiA= + Game\Objects\Space\ObjectLocation.cs + + + + + + CAGEgkSsqDSAgSMQiAVc4YCNGWSBhCTBIwCRhaESxBw= + Game\Objects\Space\Planet.cs + + + + + + + AAgAAECAAAAAAAAEgABEZASBKQAAgYQBBEEAEAEkhiQ= + Game\Objects\Space\Sector.cs + + + + + + + AAAAAACAAAAAAAAQAEQAAAABAAAAAAAAAAAAgAAAAIA= + Game\Objects\Space\Star.cs + + + + + + + ABBIAUCABTAggABECAIGVDQDIAgAgAAAJEgBEAEwBAg= + Game\Objects\Space\StarSystem.cs + + + + + + + AAgAgAiACCAggIIUiAAGQJQBAACAhQAAJAGAEAEAAAw= + Game\Objects\Space\StellarObject.cs + + + + + + + AAAAAACAAAAAAACAAAQAAAABAAAAAAAAAAAAAAAAAAA= + Game\Objects\Space\Storm.cs + + + + + + + AAAAAACAAAAACAAAAAQAACABAAACAAAAAAAAAAAACAg= + Game\Objects\Space\WarpPoint.cs + + + + + + + BAAAA0SAAHAAgAMUCAAUQBQJCCQAgAUAJgQEkAEQBAA= + Game\Objects\Technology\Component.cs + + + + + + + AgAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= + Game\Objects\Technology\DirectFireWeaponInfo.cs + + + + + + AAAAA0SAAHABgAMUCQAUQBQBCCRAgAUAJkQEkAEQJAA= + Game\Objects\Technology\Facility.cs + + + + + + + AAAAAgAAAAAAACAAAAAAAAAAAAAAAAQAAAIEAAAAAAA= + Game\Objects\Technology\FacilityUpgrade.cs + + + + + + + ABAAAwiAACBggIAEiAgmQBQJEgAIgIQCpEAEEAGCAAg= + Game\Objects\Technology\Hull.cs + + + + + + + AAAAQgiAACBhqBAEyAAiBBREAABAgIQAIAQEEAECAgg= + Game\Objects\Technology\Mount.cs + + + + + + + BAAAAwQAAAAAgAAEwAQEVBQBAAAQEYUQVAQEEBEEAiA= + Game\Objects\Technology\MountedComponentTemplate.cs + + + + + + + AgAAAAAAAAAAEAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Technology\SeekingWeaponInfo.cs + + + + + + RAJQAECAADBhgQAUiAICABQAAABUgAAAIAAAEAGAAAg= + Game\Objects\Technology\Technology.cs + + + + + + + AAAAAAQAAAAAAAAAAAAAAEAAAAAAgAABAAgAAAAAAAA= + Game\Objects\Technology\TechnologyRequirement.cs + + + + + + + AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Objects\Technology\WarheadWeaponInfo.cs + + + + + + AgAAAACAAAgIAAAAAIAAAAAgAAAAAEAABgQAAGAAhAA= + Game\Objects\Technology\WeaponInfo.cs + + + + + + gAAAA0iAACAggAAEiAQGQhQBAAACgQQAJAAEkAEABAg= + Modding\Templates\FacilityTemplate.cs + + + + + + + AAgAAAAAAAABAAAAAAAAAAABAAAAAAAAAEAAhAAAAAw= + Game\Objects\Vehicles\Base.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA= + Game\Objects\Vehicles\Design.cs + + + + + + AIAQhwCAADAAgIcEGBQOahQBSAkAkQcApAANlRGGEAg= + Game\Objects\Vehicles\Design.cs + + + + + + + QAAAAAAAAAABAAAAAAAAAAABAAAAgAAAAEAAhAAAAAw= + Game\Objects\Vehicles\Drone.cs + + + + + + + QAAAAAAAAAABAAAAAAAAAAABAAAAgAAAAEAAhAAAAAw= + Game\Objects\Vehicles\Fighter.cs + + + + + + + QAAAAAAAAAABAAAAAAAAAAABAAAAgAAAAEAAhAAAAAw= + Game\Objects\Vehicles\Mine.cs + + + + + + + QAAAAAAAAAABAAAAAAAAAAABAAAAgAAAAEAAhAAAAAw= + Game\Objects\Vehicles\Satellite.cs + + + + + + + AAAAAAAAAAABAAAAAAAAAAABAAAAAAAAAEAAhAAAAAw= + Game\Objects\Vehicles\Ship.cs + + + + + + CAkAgAQgCCAAAgIACABF4YCBGQAAhQQBEQiRgCAAgAw= + Game\Objects\Vehicles\SpaceVehicle.cs + + + + + + + AAAAAAQACAABAAAACAAAAAABAAAAgQAAAEAAhAAAAAg= + Game\Objects\Vehicles\Troop.cs + + + + + + + FKCAgkCACnADiIMcCgAeQBQJCGRAgSQAJkAMlAEQJBg= + Game\Objects\Vehicles\Vehicle.cs + + + + + + + AAAAAAQACAABAAAACAAAAAABAAAAgQAAAEAAhAAAAAg= + Game\Objects\Vehicles\WeaponPlatform.cs + + + + + + + AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAAAAACAAAAA= + Game\Objects\VictoryConditions\MajorEmpireEliminationVictoryCondition.cs + + + + + + + AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAEAAACAAAAA= + Game\Objects\VictoryConditions\PeaceVictoryCondition.cs + + + + + + + AAAAAAAAAAAAAAAAAAEAAAAAAAgAAABAAAAAACAAAAA= + Game\Objects\VictoryConditions\ScorePercentageVictoryCondition.cs + + + + + + + AAAAAAAAAAAAAAgAAAEAAAAAAAAAAABAAAAAACAAAAA= + Game\Objects\VictoryConditions\ScoreVictoryCondition.cs + + + + + + + AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAEAAACAAAAA= + Game\Objects\VictoryConditions\SurvivalVictoryCondition.cs + + + + + + + AAAAAAAAAAAAAAAAAAEAAAAAAAgAAABAAAAAACAAAAA= + Game\Objects\VictoryConditions\TechnologyVictoryCondition.cs + + + + + + + AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAAAAACAAAAA= + Game\Objects\VictoryConditions\TotalEliminationVictoryCondition.cs + + + + + + + ACAAgIgAAAIAAAAAAARAAUQAQQAAAAAEASAAgAABAAU= + Game\Setup\EmpireTemplate.cs + + + + + + + QMAIkNSAYgAMkIEWGAQIAAgAQUHQEAYEgBAiGEEAiIQ= + Game\Setup\GameSetup.cs + + + + + + AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Setup\StarSystemPlacementStrategies\ClusteredStarSystemPlacementStrategy.cs + + + + + + + AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Setup\StarSystemPlacementStrategies\DiffuseStarSystemPlacementStrategy.cs + + + + + + + AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Setup\StarSystemPlacementStrategies\GridStarSystemPlacementStrategy.cs + + + + + + + AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Setup\StarSystemPlacementStrategies\RandomStarSystemPlacementStrategy.cs + + + + + + + AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Setup\StarSystemPlacementStrategies\SpiralStarSystemPlacementStrategy.cs + + + + + + + AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= + Game\Setup\WarpPointPlacementStrategies\CenterWarpPointPlacementStrategy.cs + + + + + + AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= + Game\Setup\WarpPointPlacementStrategies\EdgeAlignedWarpPointPlacementStrategy.cs + + + + + + AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= + Game\Setup\WarpPointPlacementStrategies\PlanetWarpPointPlacementStrategy.cs + + + + + + AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= + Game\Setup\WarpPointPlacementStrategies\RandomAlignedWarpPointPlacementStrategy.cs + + + + + + AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= + Game\Setup\WarpPointPlacementStrategies\RandomWarpPointPlacementStrategy.cs + + + + + + AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAA= + Game\Setup\WarpPointPlacementStrategies\StarWarpPointPlacementStrategy.cs + + + + + + AAAQAAAAAAAgAAAAAAAAAAQAAAAEAAAAAIAAAACAAAA= + Game\Setup\WarpPointPlacementStrategies\WarpPointPlacementStrategy.cs + + + + + + EAAAkIBAgABgAABEiAAAIAQIAACKAAAACAgAARBAABA= + Modding\DamageType.cs + + + + + + + IAAAgAAAAAAAAAAEAAAAAAAAEAAAAAAAAAAAAAAAAAA= + Modding\DataFile.cs + + + + + + AAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAhAA= + Modding\DataParsingException.cs + + + + + + AAAAAAAAAAAAAAAAgAAAAEAAAAAAQAAAAAgAAAAAAAA= + Modding\EmpireTraitRequirement.cs + + + + + + AAACAAIAAAABAAAEQAAAAAQEAAAAANAAAAAgFAAQAAA= + Modding\Field.cs + + + + + + AAAAAAAAAgQAAAQE4AUAAgAAAAAgAIAAAAEgOAIAQmA= + Modding\Formula.cs + + + + + + + AAAAAAAAAAAAAIAAAAAAQAAAAAAAAAgAAAQAAAAAAAA= + Modding\FormulaContext.cs + + + + + + AAAgAAAAAAAAQAAAAAQAgAAAAAAAAAAAAIAAAAAAAAA= + Modding\MetaRecord.cs + + + + + + + gAAAAACAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= + Modding\MetaRecordParameter.cs + + + + + + AIAAgQABESEAAQEExgCQAMgAAAAIQAEgsCAAAEoAAgI= + Modding\Mod.cs + + + + + + + IAAAAgAAACAggAAAgAAAAAQAAAAAAAAAAAAAAAAABAA= + Modding\ModInfo.cs + + + + + + + AAABAAAAAAAAgAAEgAAAAAAABAAAAIAAAAAgIAAAAiA= + Modding\ModReference.cs + + + + + + + QQEisCCgAIAQniiAvhCiMIoJWGIUgFQLCBqMCAGOkAE= + Modding\ModSettings.cs + + + + + + CAAAAQAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAA= + Modding\PopulationModifier.cs + + + + + + AAAAAAAAAAAgAABEAQAAACAAAAAAAAAAAAAAAAAAgAA= + Modding\Record.cs + + + + + + AAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAAAgAAAAAAAA= + Modding\Requirement.cs + + + + + + AAAQAAAAAgAAAAAAYAUAAgAAAAAAAAAAAAAgAAAAAAA= + Modding\ResourceFormula.cs + + + + + + AAgQgAAAACAAAAAGgAAAAAAAAAAAAIECAAAACAAAAiA= + Modding\Script.cs + + + + + + AAACCABAAAAAI4AAIQAgGAAIAAAAAQAAABAAAAQAAEA= + Modding\ScriptEngine.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACA= + Modding\ScriptEngine.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAEAAAAAABAAAAAgAAAAAAAA= + Modding\ScriptRequirement.cs + + + + + + CAAAAAAACCAAAIQEwAAAQBQAAAABAAAIAAQAAAAAAAA= + Modding\StellarObjectSize.cs + + + + + + + AAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\AbilityLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\AbilityRuleLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAIAAAAAAAAAAAAAABABAAAAA= + Modding\Loaders\ComponentLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\CultureLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\DamageTypeLoader.cs + + + + + + AAAAgAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABAAAI= + Modding\Loaders\DataFileLoader.cs + + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAI= + Modding\Loaders\EmpireAILoader.cs + + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\FacilityLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\GalaxyLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\HappinessModelLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\HullLoader.cs + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAI= + Modding\Loaders\ModInfoLoader.cs + + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\ModSettingsLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\MountLoader.cs + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\PopulationModifierLoader.cs + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\RequirementLoader.cs + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAI= + Modding\Loaders\ScriptLoader.cs + + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\StarSystemLoader.cs + + + + + + CAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\StellarAbilityLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\StellarObjectLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\StellarObjectSizeLoader.cs + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\TechnologyLoader.cs + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAABAAAI= + Modding\Loaders\TextLoader.cs + + + + + + + AAAAgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Loaders\TraitLoader.cs + + + + + + AAAIAAAAAACIAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= + Modding\StellarObjectLocations\CircleRadiusStellarObjectLocation.cs + + + + + + + AAAAAAAAAACIAAAAAAAAAAAAIAAAAgAIAAAAAAAAAAA= + Modding\StellarObjectLocations\CoordStellarObjectLocation.cs + + + + + + + AAAAAAAQAACIAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= + Modding\StellarObjectLocations\RingStellarObjectLocation.cs + + + + + + + AAAAAAAAAACIAAAAAAAAAAAAAAAAAgAAABAIAAAAAAA= + Modding\StellarObjectLocations\SameAsStellarObjectLocation.cs + + + + + + + AAAAAQAAACAAAIAAgAQAAAQEAAAAAAAAAAAAAAACAAA= + Modding\Templates\AsteroidFieldTemplate.cs + + + + + + + ggIAA0iAACAggAAEiAQHRBQBEAAAgAQIJAAEEBECBAg= + Modding\Templates\ComponentTemplate.cs + + + + + + + AAAAQAAKACAgAAAAiAwACAQIABAAAAAAAAAAEAgAAQA= + Modding\Templates\GalaxyTemplate.cs + + + + + + + AAAAAQAAACAAAIAAwAQAAAQEAAAAAAAAAAAAAAACAAA= + Modding\Templates\PlanetTemplate.cs + + + + + + + AAAAAAAAACAAAAAAgAQAAAQAAAAAAAAAAAAAACAAAAA= + Modding\Templates\RandomAbilityTemplate.cs + + + + + + + AAFIAQAAACAgAAAAgAQEQAQBAAgAAAAABAgAAAAgAAA= + Modding\Templates\StarSystemTemplate.cs + + + + + + + AAAAAQAAACAAAIAQgEQAAAQAAAAAAAAAAAAAgAAAAIA= + Modding\Templates\StarTemplate.cs + + + + + + + AAAAAQAAACAAgAAAgAQAAAQAAAAAAAAAAAAAAAAAAAA= + Modding\Templates\StormTemplate.cs + + + + + + + AAAAAAAAAAAAAAAAAAABEAAAAQAAAAAAAAAAAAAAAIA= + + + + + + AAAAAAAAAAAAAAAAAAAAIAAAAAABAAAAAAAAAAAAAAA= + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\ClientSafeAttribute.cs + + + + + + AD4AAFBAACBARBDQAGjABIQAIBAAACAAIwAIASBYKAA= + Utility\ConnectivityGraph.cs + + + + + + + AABCAAAAAAAAAAAABEAABIAACAAAACAAAAAAAAAAAAA= + Utility\DynamicDictionary.cs + + + + + + AAAAAAAAAAAAgAAEiAAAAAAABAAAAKAAAAAgIAAEAiA= + Utility\GalaxyReference.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQgAAAAAA= + Utility\HashCodeMasher.cs + + + + + + wCAAAAAAAAAAAAAQQAABAAAABAgAAAAAAIAAAAAEAAA= + Utility\MiningModel.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= + Utility\NameAttribute.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\NameAttribute.cs + + + + + + AAAgABAAAEAAEAAQAAAAAAAEEAAAABAAAgYAIQAAAAA= + Utility\ObjectGraphParser.cs + + + + + + gIIkQAAAAgAQAAABAQAAgEEgAAAAAAAAAgAAAEAAAAA= + Utility\ObjectGraphParser.cs + + + + + + AAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\ObjectGraphParser.cs + + + + + + AAAAAAAAAAAAAIKAAAAAAEAAAAAAAAAAAAAAIAAAAAA= + Utility\Pathfinder.cs + + + + + + AAAAAAAAAAAAAgAEAAIABBAAAAAAAAAAAAAAAAAAAAA= + Utility\Pathfinder.cs + + + + + + ABABgIAAAAgCAAARACAAIAAAAAAAAgAAAIEEEAgAAAE= + Utility\Pictures.cs + + + + + + AgAAAAAAAAAACAQEgEAAAAAAAAAAAIAAAAAAACAAAiA= + Utility\PRNG.cs + + + + + + gBAAAAAAAAAAAAAEAAAAAAQAAAAICAAAAAggAAAAAAA= + Utility\Progress.cs + + + + + + AAAAAAAAAAAAAAAEAAAAAAAEAAAAAAAAAAAAAAAAAAA= + Utility\Progress.cs + + + + + + AgAAAAAAAAAACAAAAAAAAAAAAAAAAAAIAAAAAAAAAAA= + Utility\RandomHelper.cs + + + + + + CCICAAAAABAEABAQCAAABAQAAAAAAAAAAAAgAABUIAA= + Utility\ReferenceKeyedDictionary.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\ReferenceKeyedDictionary.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\ReferenceKeyedDictionary.cs + + + + + + AGIAAkAAABAAABAQCAAABAQAAAAAAAAACAAAAABUIAA= + Utility\ReferenceList.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\ReferenceList.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\ReferenceList.cs + + + + + + ACoAABBAADBARBBQAAQABAQAIAAAACAAAgAAAABUIAA= + Utility\ReferenceSet.cs + + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\ReferenceSet.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\ReferenceSet.cs + + + + + + AAAEAAggAAQAAQAEoAAAAAQEBCAIAIAABIAAkAWABiA= + Utility\Resource.cs + + + + + + + AAIgAAAAABAAAAQE8AWAAgAAAAAAAIAAAAAAAAAAByA= + Utility\ResourceQuantity.cs + + + + + + + CCICIAAAAAAEABAQCAAABAQAAAAAAAAAAAAgQABQIAA= + Utility\SafeDictionary.cs + + + + + + + AAAAAAAAAAAAAAAEAAAAAAQIAAEAAAAIBQAAAAAAIAA= + Utility\SafeType.cs + + + + + + AAAAAAAAAAAAAAAAgAAAAAAAAAAAAIAAAAAAAAAAAAA= + Utility\SequenceEqualityComparer.cs + + + + + + + AAQIAAAAAAAAAAAgAiAAoAACACBIAAIgAAAgAAACAAA= + Utility\Serializer.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\Serializer.cs + + + + + + AAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Utility\Serializer.cs + + + + + + AAAAAAAAAAAAAAAABAAAAAAAAAAAAEAAAIBAIACAACA= + Utility\Status.cs + + + + + + i9OiRZ0iqHWSCpP+IezR8nFp0jpC03EIG1yzfTca+Yw= + Utility\Extensions\CommonExtensions.cs + + + + + + AABAAAAAAAAAEAAAAAAAAAgAAAAAAAABAAAAAAAAEAA= + Utility\Extensions\Parser.cs + + + + + + AAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAABAA= + Utility\Extensions\TaskFactoryExtensions.cs + + + + + + AAAAAAAAAAAAAgAAAAAAAAAAAAAAAAQAAAAAAAAAAAA= + Modding\Templates\RandomAbilityTemplate.cs + + + + + + AAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAA= + Modding\Interfaces\IModObject.cs + + + + + + AAAAAAAAAAAAAAAAAAAEQAABAAAAAAAABAAAAAAAAAA= + Game\Interfaces\IAbilityObject.cs + + + + + + AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IAbilityObject.cs + + + + + + AAAAAAAAAAAAAAAAAABAIACACQAAAAQBAAAAAAAAgAQ= + Game\Interfaces\ICargoContainer.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\ICargoTransferrer.cs + + + + + + AAAAAAAAAAAAAAAQAAAIAAAIAAAAAAAAAAAAAAAAABA= + Game\Interfaces\ICombatant.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\ICombatSpaceObject.cs + + + + + + AAEAAAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\ICommand.cs + + + + + + AAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\ICommand.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA= + Game\Interfaces\ICommonAbilityObject.cs + + + + + + AAAAAACAAEAAAAAAAAAEABAAAAAAAAAAAEAAAAAAAAA= + Game\Interfaces\IConstructable.cs + + + + + + AAAAAAAAAEAAAAAAAAAAABAEAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IConstructionOrder.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAhAAAAAAAQAAAAAAgAAAAAA= + Game\Interfaces\IConstructionTemplate.cs + + + + + + AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IContainable.cs + + + + + + AAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\ICreateDesignCommand.cs + + + + + + AAAAAEAAABAAAAMQCAAQQAAACCQAgAAAIgAAgAAQBAA= + Game\Interfaces\IDamageable.cs + + + + + + AIAAhgCAABAAgIcAEBQIKAQBCAkAEAAAAAAJBBACEAA= + Game\Interfaces\IDesign.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IDesign.cs + + + + + + AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IErrorProne.cs + + + + + + AAAAAAAAAAAAAAAACAACAAAAAAAAgAAAIAAAAAAAAAg= + Game\Interfaces\IFoggable.cs + + + + + + ABAAAAgAAABggIAAAAggABQIEAAIAIACgEAAEACCAAA= + Game\Interfaces\IHull.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IHull.cs + + + + + + AACAAAAAAAAAAAAAAAAAAAAAAEAAACAAAAAAAAAAAAA= + Game\Interfaces\IIncomeProducer.cs + + + + + + AAAAAAAACAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAA= + Game\Interfaces\ILocated.cs + + + + + + AAAAAAAAAAAAgAAAAAAAAAAAAAgAEAAAAAAACAAAAAA= + Game\Interfaces\IMessage.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAA= + Game\Interfaces\IMineableSpaceObject.cs + + + + + + CAAAAgAACAAAgAAAAAAEgQABEAAAAAAAAAAQgAAAAAA= + Game\Interfaces\IMobileSpaceObject.cs + + + + + + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IMobileSpaceObject.cs + + + + + + AAAAAAAACAAAAAIAAAAAAAAAAAAAAAAEAAAAIAAAAAA= + Game\Interfaces\IMovementOrder.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IMovementOrder.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\INamed.cs + + + + + + AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAA= + Game\Interfaces\IOrder.cs + + + + + + AAAAAAAAEAAAAAQBAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IOrder.cs + + + + + + AAEAAAAgAAAAAAAAAAAAAAAAAAAABAAAAQAAACAAAAA= + Game\Interfaces\IOrderable.cs + + + + + + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IOrderCommand.cs + + + + + + AAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IOwnable.cs + + + + + + AAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IOwnable.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IOwnableAbilityObject.cs + + + + + + AYAAAACQAAAIAAAAAAQAACBAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IPathfindingOrder.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAEAAAA= + Game\Interfaces\IPictorial.cs + + + + + + AAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IPictorialLogMessage.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IPlanetOrder.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA= + Game\Interfaces\IPromotable.cs + + + + + + AAAAAAAAAAABAAAAAAAAAAAAAABAAAAAAAAAAAAAIAA= + Game\Interfaces\IRecyclable.cs + + + + + + AIAAAAAAAAAAAAQBAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IRecycleBehavior.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAAA= + Game\Interfaces\IReference.cs + + + + + + AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IReference.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IReferenceEnumerable.cs + + + + + + AAAAAAAAAAAAgAAAAAAAABAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IReferrable.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IResearchable.cs + + + + + + AAgAgAAAAAAAAAIAAAAAAIQAAAAABAAAAACAAAAAAAQ= + Game\Interfaces\ISpaceObject.cs + + + + + + AAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IStarSystemPlacementStrategy.cs + + + + + + AAAAAAgAAAAgAIAAgAAAAAQAAAAAAAAAAAEAAAAAAAA= + Game\Interfaces\IStellarObject.cs + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAA= + Game\Interfaces\ITargetable.cs + + + + + + AAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\ITemplate.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IUnit.cs + + + + + + AAAAAACAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IUnlockable.cs + + + + + + AAAAAgAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAAAAA= + Game\Interfaces\IUpgradeable.cs + + + + + + AAAAAgAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + Game\Interfaces\IVehicle.cs + + + + + + AAAAAAAAAAAAAAAAAAEAAAAAAAAAAABAAAAAACAAAAA= + Game\Interfaces\IVictoryCondition.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAgAAAAAAA= + Game\Objects\Combat2\Tactics\TacticNode.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAgAAAAAgAAAAAAAgCAAAAAA= + Modding\Interfaces\IFormula.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAgAAAAAAA= + Modding\Interfaces\IFormula.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAA= + Modding\Interfaces\IFormulaHost.cs + + + + + + AAAAAAAAAACIAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAA= + Modding\Interfaces\IStellarObjectLocation.cs + + + + + + AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAI= + Modding\Loaders\ILoader.cs + + + + + + QAIKAEAAGAAAAIABoAAIAAAABBDAAYEAgIJAAAGKQMA= + Game\Enumerations\AbilityTargets.cs + + + + + + AAIAAEAAAQAAAAAAAAAAAAAAAAEAAAEAAAAAAAEAAAA= + Game\Enumerations\AbilityValueRule.cs + + + + + + AAAAAAAEAAAAAAAABAQAAAAAAAAAAAAAAAAABAEAAAA= + Game\Enumerations\AllianceLevel.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAIAAAAEAAAA= + Game\Enumerations\AllowedTrades.cs + + + + + + AAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAABAAEAA= + Game\Enumerations\EmpirePlacement.cs + + + + + + AAAAgAAAAIAAAAAAAAAAAAAAAQAAgAAAAAAAAAAABCg= + Game\Enumerations\Mood.cs + + + + + + AAAAAAAAAAAAAAAAAIAAAAABAAAAgAAAAIEAAAAAAAA= + Game\Enumerations\ScoreDisplay.cs + + + + + + AAAAAAAAAAAAAAAAAgAAAAAAAAgAAAAAAAAAAAEEAAA= + Game\Enumerations\SharingPriority.cs + + + + + + AAAAAAAAAAAAAAAAAgAAAAAAAAgAAAAAAAAAAAAEAAA= + Game\Enumerations\StartingTechnologyLevel.cs + + + + + + AAEAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAABAEAAA= + Game\Enumerations\StellarSize.cs + + + + + + AAAAAAAAAAAAAAAAAgAAAAAAAAgAAAAAAAAAAAAEAAA= + Game\Enumerations\TechnologyCost.cs + + + + + + AAICAAAAEAAAAAAAAAAAAAAAABDAAIAAAIAAAAEAQIA= + Game\Enumerations\VehicleTypes.cs + + + + + + AAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAIAAAAIACAABA= + Game\Enumerations\Visibility.cs + + + + + + AAACAAAAEAAAAAAAAAAAAAAAAADAAIAAAIIAAAEAQAA= + Game\Enumerations\WeaponTargets.cs + + + + + + AAAAAAACAAoAAAAAAAAABAACACAAAAAAAIAAAAEAICA= + Game\Enumerations\WeaponTypes.cs + + + + + + AQAAAAAAQAAAAAAAAAAAAAAAAAQAAAAAAAACAAAAAAA= + Game\Objects\Civilization\EmpireStatus.cs + + + + + + AAQAAAAAAAAAAAABAAAAAAAAAAAAAAAEAAAAAAAAAAA= + Modding\Enumerations\FormulaType.cs + + + + + + gAAAAAAAAAAAAAAAAAAAAAAEAAAAgAAAAAAAAAAAAAA= + Modding\Enumerations\RequirementType.cs + + + + + + AAAAAAAAAQAAAAAAAAAAAAAAAAAAACCAAAAAAAAAAAA= + Utility\Extensions\CommonExtensions.cs + + + + + + AAAAAAAAAAAACAAAAAAAAAAAAAgACAAAAAAAAAAAAAA= + Utility\ProgressDisplayMode.cs + + + \ No newline at end of file diff --git a/FrEee/Extensions/ChecksExtensions.cs b/FrEee.Core/Extensions/ChecksExtensions.cs similarity index 82% rename from FrEee/Extensions/ChecksExtensions.cs rename to FrEee.Core/Extensions/ChecksExtensions.cs index edb3d157e..44030b5e0 100644 --- a/FrEee/Extensions/ChecksExtensions.cs +++ b/FrEee.Core/Extensions/ChecksExtensions.cs @@ -1,4 +1,3 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Objects.Commands; using FrEee.Objects.Space; @@ -14,46 +13,14 @@ using FrEee.Serialization; using FrEee.Objects.Technology; using FrEee.Objects.GameState; -using FrEee.Objects.Combat; using FrEee.Modding; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Extensions; public static class ChecksExtensions { - private static SafeDictionary> attributeCache = new SafeDictionary>(); - - private static SafeDictionary> interfaceCache = new SafeDictionary>(); - - private static SafeDictionary> memberCache = new SafeDictionary>(); - - /// - /// Checks for attributes in a class or its interfaces. - /// - /// - /// - /// - public static IEnumerable GetAttributes(this MemberInfo mi) where T : Attribute - { - if (attributeCache[mi] == null) - attributeCache[mi] = Attribute.GetCustomAttributes(mi).ToArray(); - var atts = attributeCache[mi].OfType(); - foreach (var att in atts) - yield return att; - if (interfaceCache[mi.DeclaringType] == null) - interfaceCache[mi.DeclaringType] = mi.DeclaringType.GetInterfaces(); - foreach (var i in interfaceCache[mi.DeclaringType]) - { - if (memberCache[i] == null) - memberCache[i] = i.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).ToArray(); // TODO - refactor into method - var mi2 = memberCache[i].SingleOrDefault(x => x.MemberType == mi.MemberType && x.Name == mi.Name); - if (mi2 != null) - { - foreach (var att2 in mi2.GetAttributes()) - yield return att2; - } - } - } - /// /// Determines if an object has a specified ability. /// @@ -86,50 +53,6 @@ public static bool HasAbility(this ICommonAbilityObject obj, string abilityName, return abils.Any(abil => abil.Rule != null && abil.Rule.Matches(abilityName)); } - /// - /// Checks for attributes in a class or its interfaces. - /// - /// - /// - /// - public static bool HasAttribute(this MemberInfo mi) - { - return mi.HasAttribute(typeof(T)); - } - - /// - /// Checks for attributes in a class or its interfaces. - /// - /// - /// - /// - public static bool HasAttribute(this MemberInfo mi, Type attributeType, bool checkInterfaces = true) - { - if (attributeCache[mi] == null) - attributeCache[mi] = Attribute.GetCustomAttributes(mi).ToArray(); - if (attributeCache[mi].Where(a => attributeType.IsAssignableFrom(a.GetType())).Any()) - return true; - var dt = mi is Type ? mi as Type : mi.DeclaringType; - if (checkInterfaces) - { - if (interfaceCache[dt] == null) - interfaceCache[dt] = dt.GetInterfaces(); - foreach (var i in interfaceCache[dt]) - { - if (memberCache[i] == null) - memberCache[i] = i.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).ToArray(); // TODO - refactor into method - if (memberCache[i].Any(m => m.Name == mi.Name && m.MemberType == mi.MemberType && m.HasAttribute(attributeType, false))) // no need to check interfaces of interfaces, they're already listed by GetInterfaces - return true; - } - } - return false; - } - - public static bool HasProperty(this ExpandoObject obj, string propertyName) - { - return obj.GetType().GetProperty(propertyName) != null; - } - /// /// Does this object's ID match what the galaxy says it is? /// diff --git a/FrEee/Extensions/CommonExtensions.cs b/FrEee.Core/Extensions/CommonExtensions.cs similarity index 83% rename from FrEee/Extensions/CommonExtensions.cs rename to FrEee.Core/Extensions/CommonExtensions.cs index bf05623d4..1161f79d1 100644 --- a/FrEee/Extensions/CommonExtensions.cs +++ b/FrEee.Core/Extensions/CommonExtensions.cs @@ -10,8 +10,8 @@ using System.Text; using System.Threading.Tasks; using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; -using FrEee.Objects.Combat.Grid; +using FrEee.Processes.Combat; +using FrEee.Processes.Combat.Grid; using FrEee.Objects.Commands; using FrEee.Objects.LogMessages; using FrEee.Objects.Space; @@ -23,6 +23,10 @@ using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; +using System.Numerics; namespace FrEee.Extensions; @@ -30,24 +34,11 @@ public static class CommonExtensions { private static SafeDictionary defaultValueCache = new SafeDictionary(); - private static List mappedTypes = new List(); - - /// - /// Casts an object to a type. Returns null if the type is wrong. - /// - /// - /// - /// - public static T As(this object o, bool throwExceptionIfWrongType = false) - where T : class - { - return o as T; - } - /// /// Builds a delegate to wrap a MethodInfo. /// http://stackoverflow.com/questions/13041674/create-func-or-action-for-any-method-using-reflection-in-c /// + /// Don't delete this method even though it's unused; it's called by reflection. /// /// /// @@ -94,6 +85,7 @@ public static T BuildDelegate(this MethodInfo method, params object[] missing } } + /// Don't delete this method even though it's unused; it's called by reflection. public static Delegate BuildDelegate(this MethodInfo method, params object[] missingParamValues) { var parms = method.GetParameters(); @@ -526,46 +518,6 @@ public static IEnumerable GetAllPoints(this Rectangle r) } } - /// - /// Gets the points on the border of a rectangle. - /// - /// - /// - public static IEnumerable GetBorderPoints(this Rectangle r) - { - for (var x = r.Left; x <= r.Right; x++) - { - if (x == r.Left || x == r.Right) - { - // get left and right sides - for (var y = r.Top; y <= r.Bottom; y++) - yield return new Point(x, y); - } - else - { - // just get top and bottom - yield return new Point(x, r.Top); - if (r.Top != r.Bottom) - yield return new Point(x, r.Bottom); - } - } - } - - /// - /// Gets the canonical name for a property, class, etc. - /// This is taken from the [CanonicalName] attribute if present, otherwise the name of the item itself. - /// - /// - /// - public static string GetCanonicalName(this MemberInfo m) - { - // TODO - use most derived class's attribute? - var name = m.GetAttributes().Select(a => a.Name).SingleOrDefault(); - if (name == null) - return m.Name; - return name; - } - /// /// Gets a property value from an object using reflection. /// If the property does not exist or the property value is not IComparable, returns an empty string. @@ -575,7 +527,7 @@ public static string GetCanonicalName(this MemberInfo m) /// public static IComparable GetComparablePropertyValue(this object o, string propertyName) { - var pval = GetPropertyValue(o, propertyName); + var pval = o.GetPropertyValue(propertyName); if (pval == null || !(pval is IComparable)) return ""; return (IComparable)pval; @@ -603,89 +555,6 @@ public static IComparable GetComparablePropertyValue(this object o, string prope return new SafeDictionary(); } - /// - /// Gets points in the interior of a rectangle. - /// - /// - /// - public static IEnumerable GetInteriorPoints(this Rectangle r) - { - for (var x = r.Left + 1; x < r.Right; x++) - { - for (var y = r.Top + 1; y < r.Bottom; y++) - yield return new Point(x, y); - } - } - - /// - /// Gets all names for a property, class, etc. including custom names and the actual item name. - /// - /// - /// - public static IEnumerable GetNames(this MemberInfo m) - { - return m.GetAttributes().Select(a => a.Name).UnionSingle(m.Name); - } - - /// - /// Gets a property value from an object using reflection. - /// If the property does not exist, returns null. - /// - /// - /// - /// - public static object GetPropertyValue(this object o, string propertyName) - { - if (o == null) - return null; - var prop = o.GetType().GetProperty(propertyName); - if (prop == null) - return null; - return prop.GetValue(o, new object[0]); - } - - /// - /// Returns an object's hash code, or 0 for null. - /// - /// - public static int GetSafeHashCode(this object o) - { - return o == null ? 0 : o.GetHashCode(); - } - - public static Type GetVehicleType(this VehicleTypes vt) - { - switch (vt) - { - case VehicleTypes.Ship: - return typeof(Ship); - - case VehicleTypes.Base: - return typeof(Base); - - case VehicleTypes.Fighter: - return typeof(Fighter); - - case VehicleTypes.Troop: - return typeof(Troop); - - case VehicleTypes.Mine: - return typeof(Mine); - - case VehicleTypes.Satellite: - return typeof(Satellite); - - case VehicleTypes.Drone: - return typeof(Drone); - - case VehicleTypes.WeaponPlatform: - return typeof(WeaponPlatform); - - default: - throw new Exception("No type is available for vehicle type " + vt); - } - } - /// /// All income provided by an object. /// @@ -696,21 +565,6 @@ public static ResourceQuantity GrossIncome(this IIncomeProducer o) return o.StandardIncome() + o.RemoteMiningIncome() + o.RawResourceIncome(); } - public static object Instantiate(this Type type, params object[] args) - { - if (type.Name == "Battle") - return typeof(SpaceBattle).Instantiate(); // HACK - old savegame compatibility - if (type.GetConstructors().Where(c => c.GetParameters().Length == (args == null ? 0 : args.Length)).Any()) - return Activator.CreateInstance(type, args) ?? throw new NullReferenceException($"Couldn't create instance of type {type}."); - else - return FormatterServices.GetSafeUninitializedObject(type); - } - - public static T Instantiate(params object[] args) - { - return (T)typeof(T).Instantiate(args); - } - public static bool IsUnlocked(this IUnlockable u) { return u.UnlockRequirements.All(r => r.IsMetBy(Empire.Current)); @@ -724,26 +578,8 @@ public static bool IsUnlocked(this IUnlockable u) /// /// /// - public static int LimitToRange(this int value, int min, int max) - { - if (min > max) - throw new ArgumentOutOfRangeException("Min is {0} and can't be larger than max which is {1}!".F(min, max)); - if (value > max) - value = max; - if (value < min) - value = min; - return value; - } - - /// - /// Limits a value to a range. - /// Throws an exception if min is bigger than max. - /// - /// - /// - /// - /// - public static double LimitToRange(this double value, double min, double max) + public static T LimitToRange(this T value, T min, T max) + where T : INumber { if (min > max) throw new ArgumentOutOfRangeException("Min is {0} and can't be larger than max which is {1}!".F(min, max)); @@ -782,6 +618,7 @@ public static void Log(this Exception ex) /// /// Logs an error in the AI of the given empire to disk. /// + /// Don't delete this method even though it's unused; it's called by AI scripts. /// /// public static void LogAIMessage(this Empire empire, string message) @@ -856,18 +693,6 @@ public static Empire MemoryOwner(this IFoggable f) return Galaxy.Current.Empires.ExceptSingle(null).SingleOrDefault(x => x.Memory.Values.Contains(f)); } - public static ILookup MyLookup(this IEnumerable> dict) - where TEnumerable : IEnumerable - { - var list = new List>(); - foreach (var kvp in dict) - { - foreach (var item in kvp.Value) - list.Add(new KeyValuePair(kvp.Key, item)); - } - return list.ToLookup(kvp => kvp.Key, kvp => kvp.Value); - } - /// /// Battles are named after any stellar objects in their sector; failing that, they are named after the star system and sector coordinates. /// @@ -897,18 +722,6 @@ public static int NormalizeSupplies(this IMobileSpaceObject sobj) return 0; } - /// - /// Parses a string using the type's static Parse method. - /// - /// - /// - /// - public static T Parse(this string s, IFormatProvider provider = null) - where T : IParsable - { - return T.Parse(s, provider); - } - /// /// Computes the path that this space object is ordered to follow. /// @@ -955,18 +768,6 @@ public static void Place(this IUnit unit, ISpaceObject target) unit.Owner.Log.Add(unit.CreateLogMessage(unit + " was lost due to insufficient cargo space at " + target + ".", LogMessageType.Warning)); } - /// - /// Raises an event, but doesn't do anything if the event handler is null. - /// - /// - /// - /// - public static void Raise(this EventHandler evt, object sender, TArgs e) where TArgs : EventArgs - { - if (evt != null) - evt(sender, e); - } - /// /// Raw resource income which is not affected by any modifiers. /// @@ -1069,53 +870,6 @@ public static string ReadToEndOfLine(this TextReader r, char c, StringBuilder lo return sb.ToString().Substring(0, Math.Max(0, sb.Length - 1)); // trim off the semicolon } - /// - /// Generates new IDs for this object (unless skipRoot is true) and all subordinate objects. - /// TODO - take into account DoNotAssignIDAttribute - /// - /// - public static void ReassignAllIDs(this IReferrable obj, bool skipRoot = false) - { - var parser = new ObjectGraphParser(); - var canCopy = new System.Collections.Generic.Stack(); // stack of bools indicating which objects in the current hierarchy path we can copy - canCopy.Push(true); - parser.Property += (pname, o, val) => - { - var prop = o.GetType().FindProperty(pname); - var shouldRecurse = !prop.CanCopyFully(); - if (shouldRecurse) - canCopy.Push(shouldRecurse); - return shouldRecurse; - }; - parser.Item += (o) => - { - // can always serialize collection items - canCopy.Push(true); - }; - parser.StartObject += (o) => - { - var doit = canCopy.All(b => b) && (!skipRoot || o != obj); - if (doit && o is IReferrable) - { - var r = (IReferrable)o; - r.ReassignID(); - } - }; - parser.EndObject += (o) => - { - canCopy.Pop(); - }; - parser.Null += (o) => - { - canCopy.Pop(); - }; - parser.KnownObject += (o) => - { - canCopy.Pop(); - }; - parser.Parse(obj); - } - /// /// Reassigns the ID of an object, overwriting any existing ID. /// @@ -1303,31 +1057,6 @@ public static void SafeDispose(this IDisposable d) d.Dispose(); } - /// - /// Equals method that doesn't throw an exception when objects are null. - /// Null is not equal to anything else, except other nulls. - /// - /// - /// - /// - public static bool SafeEquals(this object o1, object o2) - { - if (o1 == null && o2 == null) - return true; - if (o1 == null || o2 == null) - return false; - return o1.Equals(o2); - } - - public static bool SafeSequenceEqual(this IEnumerable e1, IEnumerable e2) - { - if (e1.SafeEquals(null) && e2.SafeEquals(null)) - return true; - if (e1.SafeEquals(null) || e2.SafeEquals(null)) - return false; - return e1.SequenceEqual(e2); - } - public static void SetData(this object o, SafeDictionary dict, ObjectGraphContext context) { if (context == null) @@ -1560,17 +1289,6 @@ public static int TakeShieldDamage(this IDamageable d, Hit hit, int damage, PRNG return damage; } - /// - /// Multiplies an integer by a scale factor and rounds it. - /// - /// - /// - /// - public static int TimesAndRound(this int i, double d) - { - return (int)Math.Round(i * d); - } - /// /// Transfers items from this cargo container to another cargo container. /// @@ -1886,64 +1604,6 @@ private static void TryTransferUnit(IUnit unit, ICargoContainer src, ICargoConta LogUnitTransferFailedNoStorage(unit, src, dest, emp); } - /*// based on http://cangencer.wordpress.com/2011/06/08/auto-ignore-non-existing-properties-with-automapper/ - private static IMappingExpression IgnoreReadOnlyAndNonSerializableProperties(this IMappingExpression expression) - { - var type = typeof(T); - var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.IsAssignableFrom(type) - && x.DestinationType.IsAssignableFrom(type)); - foreach (var property in existingMaps.GetPropertyMaps().Where(pm => - { - var prop = (PropertyInfo)pm.DestinationProperty.MemberInfo; - var realprop = prop.DeclaringType.GetProperty(prop.Name); - return realprop.GetSetMethod(true) == null || realprop.GetCustomAttributes(true).OfType().Any(); - })) - expression.ForMember(property.DestinationProperty.Name, opt => opt.Ignore()); - return expression; - } - - private static IMappingExpression IgnoreIDProperty(this IMappingExpression expression) - where T : IReferrable - { - var type = typeof(T); - var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(type) - && x.DestinationType.Equals(type)); - foreach (var property in existingMaps.GetPropertyMaps().Where(pm => ((PropertyInfo)pm.DestinationProperty.MemberInfo).Name == "ID")) - expression.ForMember(property.DestinationProperty.Name, opt => opt.Ignore()); - return expression; - }*/ - /*/// - /// XXX don't use this function, it seems to skip some of the tasks - /// - /// The ops. - public static void RunTasks(this IEnumerable ops) - { - // http://stackoverflow.com/a/19193473/1159763 - // for some reason we can't just say ops.SpawnTasksAsync().Wait() as this causes a hang - var runSync = Task.Factory.StartNew(new Func(async () => - { - await ops.SpawnTasksAsync(); - })).Unwrap(); - runSync.Wait(); - } - - /// - /// XXX don't use this function, it seems to skip some of the tasks - /// - /// The type of the in. - /// The objs. - /// The op. - public static void RunTasks(this IEnumerable objs, Action op) - { - // http://stackoverflow.com/a/19193473/1159763 - // for some reason we can't just say objs.SpawnTasksAsync(op).Wait() as this causes a hang - var runSync = Task.Factory.StartNew(new Func(async () => - { - await objs.SpawnTasksAsync(op); - })).Unwrap(); - runSync.Wait(); - }*/ - public static void RecordLog(this T t, string text, LogMessageType logMessageType) where T : IOwnable { t.Owner.RecordLog(t, text, logMessageType); diff --git a/FrEee/Extensions/ComparisonExtensions.cs b/FrEee.Core/Extensions/ComparisonExtensions.cs similarity index 100% rename from FrEee/Extensions/ComparisonExtensions.cs rename to FrEee.Core/Extensions/ComparisonExtensions.cs diff --git a/FrEee/Extensions/ConversionExtensions.cs b/FrEee.Core/Extensions/ConversionExtensions.cs similarity index 99% rename from FrEee/Extensions/ConversionExtensions.cs rename to FrEee.Core/Extensions/ConversionExtensions.cs index dc3fd5368..9838b2177 100644 --- a/FrEee/Extensions/ConversionExtensions.cs +++ b/FrEee.Core/Extensions/ConversionExtensions.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Globalization; using System.Text; +using FrEee.Utility; namespace FrEee.Extensions; diff --git a/FrEee/Extensions/CopyingExtensions.cs b/FrEee.Core/Extensions/CopyingExtensions.cs similarity index 99% rename from FrEee/Extensions/CopyingExtensions.cs rename to FrEee.Core/Extensions/CopyingExtensions.cs index d7939fc39..e80aa5f9f 100644 --- a/FrEee/Extensions/CopyingExtensions.cs +++ b/FrEee.Core/Extensions/CopyingExtensions.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +using FrEee.Utility; +using FrEee.Extensions; namespace FrEee.Extensions; diff --git a/FrEee/Extensions/GameEnumerableExtensions.cs b/FrEee.Core/Extensions/GameEnumerableExtensions.cs similarity index 99% rename from FrEee/Extensions/GameEnumerableExtensions.cs rename to FrEee.Core/Extensions/GameEnumerableExtensions.cs index 9b924d8d9..71f37fb6d 100644 --- a/FrEee/Extensions/GameEnumerableExtensions.cs +++ b/FrEee.Core/Extensions/GameEnumerableExtensions.cs @@ -2,13 +2,14 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Objects.Space; using FrEee.Utility; using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.GameState; using FrEee.Modding; +using FrEee.Extensions; +using FrEee.Modding.Abilities; namespace FrEee.Extensions; /// diff --git a/FrEee/FrEee.csproj b/FrEee.Core/FrEee.Core.csproj similarity index 82% rename from FrEee/FrEee.csproj rename to FrEee.Core/FrEee.Core.csproj index 2bd73a89f..40afdb520 100644 --- a/FrEee/FrEee.csproj +++ b/FrEee.Core/FrEee.Core.csproj @@ -1,48 +1,52 @@ - - - net8.0 - Library - FrEee.Core - eca7a08b-992a-43ec-8d98-2ae887897343 - Open source Space Empires IV clone - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - Settings.settings - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - - false - + + + net8.0 + Library + FrEee.Core + eca7a08b-992a-43ec-8d98-2ae887897343 + Open source Space Empires IV clone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Settings.settings + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + false + FrEee + \ No newline at end of file diff --git a/FrEee/FrEee.csproj.old b/FrEee.Core/FrEee.csproj.old similarity index 100% rename from FrEee/FrEee.csproj.old rename to FrEee.Core/FrEee.csproj.old diff --git a/FrEee/FrEee.ico b/FrEee.Core/FrEee.ico similarity index 100% rename from FrEee/FrEee.ico rename to FrEee.Core/FrEee.ico diff --git a/FrEee/FrEeeConstants.cs b/FrEee.Core/FrEeeConstants.cs similarity index 96% rename from FrEee/FrEeeConstants.cs rename to FrEee.Core/FrEeeConstants.cs index 1a8ca2e71..3acfc3e28 100644 --- a/FrEee/FrEeeConstants.cs +++ b/FrEee.Core/FrEeeConstants.cs @@ -1,8 +1,8 @@ -namespace FrEee; - -public static class FrEeeConstants -{ - public static readonly string PlayerCommandsSaveGameExtension = ".plr"; - public static readonly string SaveGameDirectory = "Savegame"; - public static readonly string SaveGameExtension = ".gam"; -} +namespace FrEee; + +public static class FrEeeConstants +{ + public static readonly string PlayerCommandsSaveGameExtension = ".plr"; + public static readonly string SaveGameDirectory = "Savegame"; + public static readonly string SaveGameExtension = ".gam"; +} diff --git a/FrEee/FrEeeStrongName.snk b/FrEee.Core/FrEeeStrongName.snk similarity index 100% rename from FrEee/FrEeeStrongName.snk rename to FrEee.Core/FrEeeStrongName.snk diff --git a/FrEee.Core/Modding/Abilities/Ability.cs b/FrEee.Core/Modding/Abilities/Ability.cs new file mode 100644 index 000000000..d586d2e07 --- /dev/null +++ b/FrEee.Core/Modding/Abilities/Ability.cs @@ -0,0 +1,214 @@ +using FrEee.Objects.Civilization; +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Serialization; +using FrEee.Utility; + +namespace FrEee.Modding.Abilities; + +/// +/// A special ability of some game object, or just a tag used by the AI or by modders. +/// +[Serializable] +public class Ability : IContainable, IReferrable, IModObject, IDataObject, IFormulaHost +{ + public Ability(IAbilityObject container) + { + Container = container; + Values = new List>(); + } + + public Ability(IAbilityObject container, AbilityRule rule, Formula? description = null, params object[] values) + { + Container = container; + Rule = rule; + Description = description; + Values = new List>(); + foreach (var val in values) + { + if (val is IFormula f) + { + Values.Add(f.ToStringFormula()); + } + else if (val is IEnumerable fs) + { + foreach (var ff in fs) + { + Values.Add(ff.ToStringFormula()); + } + } + else + { + Values.Add(new LiteralFormula(val.ToString())); + } + } + } + + [DoNotCopy] + public IAbilityObject Container { get; private set; } + + public virtual SafeDictionary Data + { + get + { + var dict = new SafeDictionary(); + dict[nameof(rule)] = rule; + dict[nameof(Description)] = Description; + dict[nameof(Values)] = Values; + dict[nameof(Container)] = Container; + dict[nameof(ID)] = ID; + dict[nameof(IsDisposed)] = IsDisposed; + dict[nameof(ModID)] = ModID; + return dict; + } + + set + { + rule = value[nameof(rule)].Default>(); + Description = value[nameof(Description)].Default>(); + Values = value[nameof(Values)].Default>>(); + Container = value[nameof(Container)].Default(); + ID = value[nameof(ID)].Default(); + IsDisposed = value[nameof(IsDisposed)].Default(); + ModID = value[nameof(ModID)].Default(); + } + } + + /// + /// A description of the ability's effects. + /// Can use, e.g. [%Amount1%] to specify the amount in the Value 1 field. + /// + public Formula? Description { get; set; } + + /// + /// Key for ability groups. + /// + public IEnumerable Group + { + get + { + var list = new List(); + for (int i = 0; i < Rule.ValueRules.Count; i++) + { + if (Rule.ValueRules.Count > i && Rule.ValueRules[i] == AbilityValueRule.Group) + yield return Values[i]; + yield return ""; + } + } + } + + public long ID + { + get; + set; + } + + public bool IsDisposed + { + get; + set; + } + + public string ModID + { + get; + set; + } + + public string Name + { + get { return null; } // TODO - should abilities even have names? + } + + public Empire Owner + { + get + { + if (Container is IOwnable) + return (Container as IOwnable).Owner; + return null; + } + } + + /// + /// The ability rule which defines what ability this is. + /// + [DoNotCopy] + public AbilityRule Rule { get { return rule; } set { rule = value; } } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + /// + /// The first value of the ability. Not all abilities have values, so this might be null! + /// + public Formula Value1 + { + get + { + return Values.ElementAtOrDefault(0); + } + } + + /// + /// The second value of the ability. Not all abilities have two values, so this might be null! + /// + public Formula Value2 + { + get + { + return Values.ElementAtOrDefault(1); + } + } + + /// + /// Extra data for the ability. + /// + public IList> Values { get; set; } + + public IDictionary Variables + { + get + { + var dict = new Dictionary(); + for (var i = 0; i < Values.Count; i++) + dict.Add("Amount" + (i + 1), Values[i]); + if (Rule.Matches("Shield Generation") || Rule.Matches("Phased Shield Generation") || Rule.Matches("Planet - Shield Generation")) + dict.Add("ShieldPointsGenerated", Value1.ToInt()); // TODO - take into account mounts that affect shields + return dict; + } + } + + private ModReference rule { get; set; } + + public void Dispose() + { + if (IsDisposed) + return; + if (Container is IAbilityContainer) + (Container as IAbilityContainer).Abilities.Remove(this); + Galaxy.Current.UnassignID(this); + } + + public override string ToString() + { + // get basic description + string result; + if (Description != null) + result = Description.Evaluate(this, TemplateParameters); + else if (Rule.Description != null) + result = Rule.Description.Evaluate(this, TemplateParameters); + else + result = Rule.Name + ": " + string.Join(", ", Values.Select(v => v.Value)); + + return result; + } +} diff --git a/FrEee.Core/Modding/Abilities/AbilityRule.cs b/FrEee.Core/Modding/Abilities/AbilityRule.cs new file mode 100644 index 000000000..092b2c2a0 --- /dev/null +++ b/FrEee.Core/Modding/Abilities/AbilityRule.cs @@ -0,0 +1,291 @@ +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using FrEee.Utility; + +namespace FrEee.Modding.Abilities; + +/// +/// A rule for grouping and stacking abilities. +/// +[Serializable] +public class AbilityRule : IModObject +{ + public AbilityRule() + { + ValueRules = new List(); + GroupRules = new List(); + Aliases = new HashSet(); + } + + /// + /// Aliases for this ability's name. + /// These must not be aliases or names of other abilities. + /// + public ICollection Aliases { get; set; } + + /// + /// A default description for abilities which do not provide their own description. + /// Can use, e.g. [%Amount1%] to specify the amount in the Value 1 field. + /// + public Formula Description { get; set; } + + /// + /// The rules for stacking abilities after grouping. + /// + public IList GroupRules { get; set; } + + public bool IsActivatable + { + get + { + // TODO - scriptable ability rules + return Matches("Emergency Resupply") || + Matches("Emergency Energy") || + Matches("Self-Destruct") || + Matches("Open Warp Point") || + Matches("Close Warp Point") || + Matches("Create Planet Size") || + Matches("Destroy Planet Size") || + Matches("Create Star") || + Matches("Destroy Star") || + Matches("Create Storm") || + Matches("Destroy Storm") || + Matches("Create Nebulae") || + Matches("Destroy Nebulae") || + Matches("Create Black Hole") || + Matches("Destroy Black Hole") || + Matches("Create Constructed Planet - Star") || + Matches("Create Constructed Planet - Planet") || + Matches("Create Constructed Planet - Storm") || + Matches("Create Constructed Planet - Warp Point") || + Matches("Create Constructed Planet - Asteroids") || + Matches("Create Constructed Planet - Space"); + } + } + + public bool IsDisposed + { + get + { + // can't be disposed of + return false; + } + } + + public string ModID + { + get; + set; + } + + /// + /// The name of the ability to which this rule applies. + /// + public string Name { get; set; } + + /// + /// Valid targets for this ability. + /// + public AbilityTargets Targets { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + /// + /// The rules for grouping and stacking abilities. + /// + public IList ValueRules { get; set; } + + /// + /// Finds an ability rule in the current mod. + /// + /// The name or alias. + /// The ability rule, or null if none matches. + public static AbilityRule Find(string nameOrAlias) + { + return Mod.Current.AbilityRules.Where(r => r.Matches(nameOrAlias)).SingleOrDefault(); + } + + /// + /// Can this ability target something? + /// + /// + /// + public bool CanTarget(AbilityTargets target) + { + return Targets.HasFlag(target); + } + + public void Dispose() + { + // nothing to do + } + + /// + /// Groups and stacks abilities. + /// + /// + /// + public ILookup GroupAndStack(IEnumerable abilities, IAbilityObject stackingTo) + { + var ours = abilities.Where(a => a.Rule == this).ToArray(); + + // group abilities + var dict = new SafeDictionary, ICollection>(); + var groupIndices = new List(); + for (int i = 0; i < ValueRules.Count; i++) + { + if (ValueRules[i] == AbilityValueRule.Group) + groupIndices.Add(i); + } + foreach (var a in ours) + { + // treat non-group indices as "equal" for grouping purposes + var key = a.Values.Select((v, i) => groupIndices.Contains(i) ? v.Value : "").ToList(); + var existingKey = dict.Keys.SingleOrDefault(k => k.SequenceEqual(key)); + if (existingKey == null) + { + dict[key] = new List(); + dict[key].Add(a); + } + else + dict[existingKey].Add(a); + } + + // stack abilities + var stackedInGroups = new SafeDictionary>(); + foreach (var group in dict.Values) + { + var stacked = Stack(group, stackingTo, false); + foreach (var stack in stacked) + stackedInGroups.Add(stack.Key, stack); + } + + var final = new List>(); + + // stack grouped abilities if needed + if (ValueRules.Any(r => r == AbilityValueRule.Group)) + { + var groupLeaders = stackedInGroups.Select(g => g.Key); + var stacked = Stack(groupLeaders, stackingTo, true); + foreach (var stack in stacked) + { + foreach (var a in stack) + final.Add(Tuple.Create(stack.Key, a)); + } + } + else + { + foreach (var group in stackedInGroups) + final.Add(Tuple.Create(group.Key, group.Key)); + } + + return final.ToLookup(t => t.Item1, t => t.Item2); + } + + /// + /// Does the specified name match this ability's name or aliases? + /// + /// + /// + public bool Matches(string name) + { + return name == Name || Aliases.Contains(name); + } + + /// + /// Does this rule's name or any of its aliases start with the specified prefix? + /// + /// + /// + public bool StartsWith(string prefix) + { + return Name.StartsWith(prefix) || Aliases.Any(a => a.StartsWith(prefix)); + } + + public override string ToString() + { + return Name; + } + + private ILookup Stack(IEnumerable abilities, IAbilityObject stackingTo, bool groupStacking) + { + if (abilities.Count() <= 1) + return abilities.ToLookup(a => a, a => a); + + var results = new SafeDictionary(); // keys = original abilities, values = stacked abilities + foreach (var abil in abilities) + { + for (int i = 0; i < abil.Values.Count; i++) + { + AbilityValueRule rule; + if (groupStacking) + rule = GroupRules.ElementAtOrDefault(i); + else + rule = ValueRules.ElementAtOrDefault(i); + // TODO - don't repeatedly convert to/from strings, just do it once outside the loop + double? oldval = null; + if (results[abil] != null) + oldval = results[abil].Values.Count > i ? results[abil].Values[i].Value.ToDouble() : null; + else + { + var match = results.Values.Distinct().Where(a => a != null).SingleOrDefault(a => a.Rule == abil.Rule && a.Values.Select((val, idx) => rule != AbilityValueRule.Group && rule != AbilityValueRule.None || a.Values.Count >= abil.Values.Count && a.Values[idx] == abil.Values[idx]).All(b => b)); + + if (match != null) + { + results[abil] = match; + oldval = results[abil].Values.Count > i ? results[abil].Values[i].Value.ToDouble() : null; + } + else + results[abil] = new Ability(stackingTo, abil.Rule); + } + double incoming = abil.Values.Count > i ? abil.Values[i].Value.ToDouble() : 0; + double newval = oldval ?? 0; + if (rule == AbilityValueRule.Add) + newval = (oldval ?? 0) + incoming; + else if (rule == AbilityValueRule.TakeAverage) + newval = (oldval ?? 0) + incoming / abilities.Count(); + else if (rule == AbilityValueRule.TakeHighest) + { + if (oldval == null) + newval = incoming; + else + newval = Math.Max(oldval.Value, incoming); + } + else if (rule == AbilityValueRule.TakeLowest) + { + if (oldval == null) + newval = incoming; + else + newval = Math.Min(oldval.Value, incoming); + } + else // group or none + newval = incoming; + if (results[abil].Values.Count > i) + results[abil].Values[i] = newval.ToString(CultureInfo.InvariantCulture); + else + { + while (results[abil].Values.Count < i) + results[abil].Values.Add(null); + results[abil].Values.Add(newval.ToString(CultureInfo.InvariantCulture)); + } + } + } + foreach (var kvp in results) + { + if (results.Values.Where(a => a == kvp.Value).Count() == 1) + { + // ability is "stacked" alone, just use the original ability description + results[kvp.Key].Description = kvp.Key.Description; + } + } + return results.ToLookup(kvp => kvp.Value, kvp => kvp.Key); + } +} \ No newline at end of file diff --git a/FrEee/Objects/Abilities/AbilityTargets.cs b/FrEee.Core/Modding/Abilities/AbilityTargets.cs similarity index 96% rename from FrEee/Objects/Abilities/AbilityTargets.cs rename to FrEee.Core/Modding/Abilities/AbilityTargets.cs index 651ca74e2..3df08a528 100644 --- a/FrEee/Objects/Abilities/AbilityTargets.cs +++ b/FrEee.Core/Modding/Abilities/AbilityTargets.cs @@ -1,7 +1,8 @@ using FrEee.Utility; using System; +using FrEee.Utility; -namespace FrEee.Objects.Abilities; +namespace FrEee.Modding.Abilities; /// /// Specifies what object types abilities can stack to. diff --git a/FrEee/Objects/Abilities/AbilityValueRule.cs b/FrEee.Core/Modding/Abilities/AbilityValueRule.cs similarity index 95% rename from FrEee/Objects/Abilities/AbilityValueRule.cs rename to FrEee.Core/Modding/Abilities/AbilityValueRule.cs index 40bc8f32a..93c6cae19 100644 --- a/FrEee/Objects/Abilities/AbilityValueRule.cs +++ b/FrEee.Core/Modding/Abilities/AbilityValueRule.cs @@ -1,5 +1,6 @@ using FrEee.Utility; -namespace FrEee.Objects.Abilities; +using FrEee.Utility; +namespace FrEee.Modding.Abilities; /// /// Rules for grouping and stacking ability values within a group of similar abilities. diff --git a/FrEee/Extensions/AbilityExtensions.cs b/FrEee.Core/Modding/Abilities/Extensions.cs similarity index 99% rename from FrEee/Extensions/AbilityExtensions.cs rename to FrEee.Core/Modding/Abilities/Extensions.cs index b130e4116..f44ba2221 100644 --- a/FrEee/Extensions/AbilityExtensions.cs +++ b/FrEee.Core/Modding/Abilities/Extensions.cs @@ -1,4 +1,3 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Objects.Civilization.Diplomacy.Clauses; using FrEee.Objects.Space; @@ -9,13 +8,15 @@ using System.Collections.Generic; using System.Linq; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Modding.Abilities; namespace FrEee.Extensions; /// /// Extensions relating to abilities. /// -public static class AbilityExtensions +public static class Extensions { /// /// All abilities belonging to an object. diff --git a/FrEee/Objects/Abilities/IAbilityObject.cs b/FrEee.Core/Modding/Abilities/IAbilityObject.cs similarity index 97% rename from FrEee/Objects/Abilities/IAbilityObject.cs rename to FrEee.Core/Modding/Abilities/IAbilityObject.cs index 31ac68a06..bb29e0a18 100644 --- a/FrEee/Objects/Abilities/IAbilityObject.cs +++ b/FrEee.Core/Modding/Abilities/IAbilityObject.cs @@ -1,7 +1,7 @@ using FrEee.Serialization; using System.Collections.Generic; -namespace FrEee.Objects.Abilities; +namespace FrEee.Modding.Abilities; /// /// Something which can have intrinsic abilities of its own that can be added and removed. diff --git a/FrEee/Objects/Abilities/ICommonAbilityObject.cs b/FrEee.Core/Modding/Abilities/ICommonAbilityObject.cs similarity index 92% rename from FrEee/Objects/Abilities/ICommonAbilityObject.cs rename to FrEee.Core/Modding/Abilities/ICommonAbilityObject.cs index a6057a6c3..acfc269b6 100644 --- a/FrEee/Objects/Abilities/ICommonAbilityObject.cs +++ b/FrEee.Core/Modding/Abilities/ICommonAbilityObject.cs @@ -1,7 +1,7 @@ using FrEee.Objects.Civilization; using System.Collections.Generic; -namespace FrEee.Objects.Abilities; +namespace FrEee.Modding.Abilities; /// /// An object that can contain different abilities for different empires. diff --git a/FrEee/Objects/Abilities/IOwnableAbilityObject.cs b/FrEee.Core/Modding/Abilities/IOwnableAbilityObject.cs similarity index 84% rename from FrEee/Objects/Abilities/IOwnableAbilityObject.cs rename to FrEee.Core/Modding/Abilities/IOwnableAbilityObject.cs index 45198033e..955e2015e 100644 --- a/FrEee/Objects/Abilities/IOwnableAbilityObject.cs +++ b/FrEee.Core/Modding/Abilities/IOwnableAbilityObject.cs @@ -1,6 +1,6 @@ using FrEee.Objects.Civilization; -namespace FrEee.Objects.Abilities; +namespace FrEee.Modding.Abilities; /// /// Something which can have abilities and be owned. diff --git a/FrEee/Modding/ComputedFormula.cs b/FrEee.Core/Modding/ComputedFormula.cs similarity index 95% rename from FrEee/Modding/ComputedFormula.cs rename to FrEee.Core/Modding/ComputedFormula.cs index f7bd6d46a..b0d1d1098 100644 --- a/FrEee/Modding/ComputedFormula.cs +++ b/FrEee.Core/Modding/ComputedFormula.cs @@ -1,167 +1,170 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; - -namespace FrEee.Modding; - -/// -/// A formula which is computed via a script. -/// -/// -public class ComputedFormula : Formula, IEquatable> - where T : IConvertible, IComparable -{ - public ComputedFormula(string text, object context, bool isDynamic) - : base(text) - { - this.context = context; - this.isDynamic = isDynamic; - } - - /// - /// For serialization. - /// - protected ComputedFormula() - : base() - { - } - - [DoNotSerialize(false)] - public override object Context { get { return context; } set { context = value; } } - - /// - /// Is this a dynamic formula? Dynamic formulas cannot be cached. - /// - public override bool IsDynamic - { - get - { - return isDynamic; - } - } - - public override bool IsLiteral - { - get - { - return false; - } - } - - public override T Value - { - get - { - if (IsDynamic) - return Evaluate(Context, null); - else - { - if (value == null) - value = new Lazy(ComputeValue); // HACK - why is it not being set when we load? - return value.Value; - } - } - } - - [DoNotCopy] - private object context { get; set; } - - private bool isDynamic; - - public static implicit operator T(ComputedFormula f) - { - return f.Value; - } - - public static bool operator !=(ComputedFormula f1, ComputedFormula f2) - { - return !(f1 == f2); - } - - public static bool operator ==(ComputedFormula f1, ComputedFormula f2) - { - if (f1 is null && f2 is null) - return true; - if (f1 is null || f2 is null) - return false; - return f1.Value.SafeEquals(f2.Value); - } - - /// - /// Compiles the formula into a literal formula. - /// - /// - public Formula Compile() - { - return new LiteralFormula(Value.ToStringInvariant()); - } - - public override bool Equals(object? obj) - { - var x = obj as ComputedFormula; - if (x is null) - return false; - return Equals(x); - } - - public bool Equals(ComputedFormula? other) - { - return other is not null && IsDynamic == other.IsDynamic && Text == other.Text && Context == other.Context; - } - - public override T Evaluate(object host, IDictionary variables = null) - { - var parms = new Dictionary(variables ?? new Dictionary()); - parms.Add("self", Context); - parms.Add("host", host); - if (host is IFormulaHost fh) - { - foreach (var kvp in fh.Variables) - parms.Add(kvp.Key, kvp.Value); - } - if (host is IModObject mo) - { - if (mo.TemplateParameters != null) - { - foreach (var kvp in mo.TemplateParameters) - parms.Add(kvp.Key, kvp.Value); - } - } - if (host is IDictionary d) - { - foreach (var kvp in d) - parms[kvp.Key] = kvp.Value; - } - if (variables != null) - { - foreach (var kvp in variables) - parms[kvp.Key] = kvp.Value; - } - string fulltext; - if (ExternalScripts == null) - fulltext = Text; - else - fulltext = string.Join("\n", ExternalScripts.Select(q => q.Text)) + "\n" + Text; - return PythonScriptEngine.EvaluateExpression(fulltext, parms); - } - - public override int GetHashCode() - { - return HashCodeMasher.Mash(IsDynamic, Text, Context); - } - - public override Formula ToStringFormula(CultureInfo c = null) - { - // HACK - could lead to desyncs for static formulas with their stringified counterparts if the values change - return new ComputedFormula("str(" + Text + ")", Context, IsDynamic); - } - - protected override T ComputeValue() - { - return Evaluate(Context, null); - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Extensions; +using FrEee.Serialization; + +namespace FrEee.Modding; + +/// +/// A formula which is computed via a script. +/// +/// +public class ComputedFormula : Formula, IEquatable> + where T : IConvertible, IComparable +{ + public ComputedFormula(string text, object context, bool isDynamic) + : base(text) + { + this.context = context; + this.isDynamic = isDynamic; + } + + /// + /// For serialization. + /// + protected ComputedFormula() + : base() + { + } + + [DoNotSerialize(false)] + public override object Context { get { return context; } set { context = value; } } + + /// + /// Is this a dynamic formula? Dynamic formulas cannot be cached. + /// + public override bool IsDynamic + { + get + { + return isDynamic; + } + } + + public override bool IsLiteral + { + get + { + return false; + } + } + + public override T Value + { + get + { + if (IsDynamic) + return Evaluate(Context, null); + else + { + if (value == null) + value = new Lazy(ComputeValue); // HACK - why is it not being set when we load? + return value.Value; + } + } + } + + [DoNotCopy] + private object context { get; set; } + + private bool isDynamic; + + public static implicit operator T(ComputedFormula f) + { + return f.Value; + } + + public static bool operator !=(ComputedFormula f1, ComputedFormula f2) + { + return !(f1 == f2); + } + + public static bool operator ==(ComputedFormula f1, ComputedFormula f2) + { + if (f1 is null && f2 is null) + return true; + if (f1 is null || f2 is null) + return false; + return f1.Value.SafeEquals(f2.Value); + } + + /// + /// Compiles the formula into a literal formula. + /// + /// + public Formula Compile() + { + return new LiteralFormula(Value.ToStringInvariant()); + } + + public override bool Equals(object? obj) + { + var x = obj as ComputedFormula; + if (x is null) + return false; + return Equals(x); + } + + public bool Equals(ComputedFormula? other) + { + return other is not null && IsDynamic == other.IsDynamic && Text == other.Text && Context == other.Context; + } + + public override T Evaluate(object host, IDictionary variables = null) + { + var parms = new Dictionary(variables ?? new Dictionary()); + parms.Add("self", Context); + parms.Add("host", host); + if (host is IFormulaHost fh) + { + foreach (var kvp in fh.Variables) + parms.Add(kvp.Key, kvp.Value); + } + if (host is IModObject mo) + { + if (mo.TemplateParameters != null) + { + foreach (var kvp in mo.TemplateParameters) + parms.Add(kvp.Key, kvp.Value); + } + } + if (host is IDictionary d) + { + foreach (var kvp in d) + parms[kvp.Key] = kvp.Value; + } + if (variables != null) + { + foreach (var kvp in variables) + parms[kvp.Key] = kvp.Value; + } + string fulltext; + if (ExternalScripts == null) + fulltext = Text; + else + fulltext = string.Join("\n", ExternalScripts.Select(q => q.Text)) + "\n" + Text; + return PythonScriptEngine.EvaluateExpression(fulltext, parms); + } + + public override int GetHashCode() + { + return HashCodeMasher.Mash(IsDynamic, Text, Context); + } + + public override Formula ToStringFormula(CultureInfo c = null) + { + // HACK - could lead to desyncs for static formulas with their stringified counterparts if the values change + return new ComputedFormula("str(" + Text + ")", Context, IsDynamic); + } + + protected override T ComputeValue() + { + return Evaluate(Context, null); + } +} diff --git a/FrEee/Modding/DamageType.cs b/FrEee.Core/Modding/DamageType.cs similarity index 96% rename from FrEee/Modding/DamageType.cs rename to FrEee.Core/Modding/DamageType.cs index 11b0d9f2b..31ed638e2 100644 --- a/FrEee/Modding/DamageType.cs +++ b/FrEee.Core/Modding/DamageType.cs @@ -1,199 +1,199 @@ -using FrEee.Extensions; -using System.Collections.Generic; - -namespace FrEee.Modding; - -/// -/// A type of damage that can be inflicted on a component, seeker, population, etc. -/// Most of these formulas, in addition to their stated parameters, can also take -/// "attacker", "defender", and "weapon" parameters, which should be fairly self explanatory. -/// -public class DamageType : IModObject -{ - public DamageType() - { - Name = "Normal"; - Description = "Default damage type."; - NormalShieldDamage = 100; - NormalShieldPiercing = 0; - PhasedShieldDamage = 100; - PhasedShieldPiercing = 0; - ComponentDamage = 100; - ComponentPiercing = 0; - SeekerDamage = ComponentDamage; - PopulationDamage = 100; - ConditionsDamage = 0; - FacilityDamage = 100; - FacilityPiercing = 0; - PlagueLevel = 0; - TargetPush = 0; - TargetTeleport = 0; - IncreaseReload = 0; - DisruptReload = 0; - ShipCapture = 0; - EmissiveArmor = 100; - ShieldGenerationFromDamage = 100; - } - - /// - /// The default "Normal" damage type. - /// - public static DamageType Normal - { - get - { - return Mod.Current.DamageTypes.FindByName("Normal") ?? new DamageType(); - } - } - - /// - /// Percentage of nominal damage inflicted to components. - /// This formula can take a "target" parameter which is the component being damaged. - /// - public Formula ComponentDamage { get; set; } - - /// - /// Percentage of damage that pierces a component, instead of being inflicted to the component. - /// This formula can take a "target" parameter which is the component being damaged. - /// - public Formula ComponentPiercing { get; set; } - - /// - /// Percentage of nominal damage inflicted to planetary conditions. - /// - public Formula ConditionsDamage { get; set; } - - /// - /// A description of the effects of this damage type. - /// - public Formula Description - { - get; - set; - } - - /// - /// Percentage of nominal damage applied as "disrupt reload" effect. - /// This disrupts the reload time of a ship's weapons up to their maximum reload time, and is effective even against ships with master computers. - /// - public Formula DisruptReload { get; set; } - - /// - /// Percentage effectiveness of the target's emissive armor against this damage type. - /// - public Formula EmissiveArmor { get; set; } - - /// - /// Percentage of nominal damage inflicted to facilities. - /// This formula can take a "target" parameter which is the facility being damaged. - /// - public Formula FacilityDamage { get; set; } - - /// - /// Percentage of damage that pierces a facility, instead of being inflicted to the facility. - /// This formula can take a "target" parameter which is the facility being damaged. - /// - public Formula FacilityPiercing { get; set; } - - /// - /// Percentage of nominal damage applied as "increase reload" effect. - /// This increases the reload time of a ship's weapons with no limit. Ineffective against ships with master computers. - /// - public Formula IncreaseReload { get; set; } - - public bool IsDisposed - { - // TODO - make it disposable? - get { return false; } - } - - /// - /// A unique ID to reference this damage type in a mod. - /// - public string ModID - { - get; - set; - } - - /// - /// The name of this damage type. - /// - public string Name - { - get; - set; - } - - /// - /// Percentage of nominal damage inflicted to normal shields. - /// - public Formula NormalShieldDamage { get; set; } - - /// - /// Percentage of damage that pierces normal shields, instead of being inflicted to the shields. - /// Actual shield piercing is the weighted average of this and the phased shield piercing, if the vehicle has both types of shields. - /// - public Formula NormalShieldPiercing { get; set; } - - /// - /// Percentage of nominal damage inflicted to phased shields. - /// - public Formula PhasedShieldDamage { get; set; } - - /// - /// Percentage of damage that pierces phased shields, instead of being inflicted to the shields. - /// Actual shield piercing is the weighted average of this and the normal shield piercing, if the vehicle has both types of shields. - /// - public Formula PhasedShieldPiercing { get; set; } - - /// - /// Level of plague inflicted on a colony. - /// This formula is NOT a percentage! It's a raw plague level number. - /// This formula can take a "target" parameter which is the colony being plagued. - /// - public Formula PlagueLevel { get; set; } - - /// - /// Percentage of nominal damage inflicted to population. - /// This formula can take a "target" parameter which is the race of the population being damaged. - /// - public Formula PopulationDamage { get; set; } - - /// - /// Percentage of nominal damage inflicted to seekers. - /// Defaults to the component damage value. - /// - public Formula SeekerDamage { get; set; } - - /// - /// Percentage effectiveness of the target's "shield generation from damage" ability against this damage type. - /// - public Formula ShieldGenerationFromDamage { get; set; } - - /// - /// Percentage of nominal damage applied as a boarding attempt. - /// If successful, the ship's security stations will be destroyed, but otherwise no damage is inflicted. - /// - public Formula ShipCapture { get; set; } - - /// - /// Percentage of nominal damage applied as acceleration away from the attacker, or toward him if the value is negative. - /// - public Formula TargetPush { get; set; } - - /// - /// Percentage of nominal damage applied as random teleportation within a specified radius. Does not affect velocity. - /// - public Formula TargetTeleport { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public override string ToString() - { - return Name; - } +using FrEee.Extensions; +using System.Collections.Generic; + +namespace FrEee.Modding; + +/// +/// A type of damage that can be inflicted on a component, seeker, population, etc. +/// Most of these formulas, in addition to their stated parameters, can also take +/// "attacker", "defender", and "weapon" parameters, which should be fairly self explanatory. +/// +public class DamageType : IModObject +{ + public DamageType() + { + Name = "Normal"; + Description = "Default damage type."; + NormalShieldDamage = 100; + NormalShieldPiercing = 0; + PhasedShieldDamage = 100; + PhasedShieldPiercing = 0; + ComponentDamage = 100; + ComponentPiercing = 0; + SeekerDamage = ComponentDamage; + PopulationDamage = 100; + ConditionsDamage = 0; + FacilityDamage = 100; + FacilityPiercing = 0; + PlagueLevel = 0; + TargetPush = 0; + TargetTeleport = 0; + IncreaseReload = 0; + DisruptReload = 0; + ShipCapture = 0; + EmissiveArmor = 100; + ShieldGenerationFromDamage = 100; + } + + /// + /// The default "Normal" damage type. + /// + public static DamageType Normal + { + get + { + return Mod.Current.DamageTypes.FindByName("Normal") ?? new DamageType(); + } + } + + /// + /// Percentage of nominal damage inflicted to components. + /// This formula can take a "target" parameter which is the component being damaged. + /// + public Formula ComponentDamage { get; set; } + + /// + /// Percentage of damage that pierces a component, instead of being inflicted to the component. + /// This formula can take a "target" parameter which is the component being damaged. + /// + public Formula ComponentPiercing { get; set; } + + /// + /// Percentage of nominal damage inflicted to planetary conditions. + /// + public Formula ConditionsDamage { get; set; } + + /// + /// A description of the effects of this damage type. + /// + public Formula Description + { + get; + set; + } + + /// + /// Percentage of nominal damage applied as "disrupt reload" effect. + /// This disrupts the reload time of a ship's weapons up to their maximum reload time, and is effective even against ships with master computers. + /// + public Formula DisruptReload { get; set; } + + /// + /// Percentage effectiveness of the target's emissive armor against this damage type. + /// + public Formula EmissiveArmor { get; set; } + + /// + /// Percentage of nominal damage inflicted to facilities. + /// This formula can take a "target" parameter which is the facility being damaged. + /// + public Formula FacilityDamage { get; set; } + + /// + /// Percentage of damage that pierces a facility, instead of being inflicted to the facility. + /// This formula can take a "target" parameter which is the facility being damaged. + /// + public Formula FacilityPiercing { get; set; } + + /// + /// Percentage of nominal damage applied as "increase reload" effect. + /// This increases the reload time of a ship's weapons with no limit. Ineffective against ships with master computers. + /// + public Formula IncreaseReload { get; set; } + + public bool IsDisposed + { + // TODO - make it disposable? + get { return false; } + } + + /// + /// A unique ID to reference this damage type in a mod. + /// + public string ModID + { + get; + set; + } + + /// + /// The name of this damage type. + /// + public string Name + { + get; + set; + } + + /// + /// Percentage of nominal damage inflicted to normal shields. + /// + public Formula NormalShieldDamage { get; set; } + + /// + /// Percentage of damage that pierces normal shields, instead of being inflicted to the shields. + /// Actual shield piercing is the weighted average of this and the phased shield piercing, if the vehicle has both types of shields. + /// + public Formula NormalShieldPiercing { get; set; } + + /// + /// Percentage of nominal damage inflicted to phased shields. + /// + public Formula PhasedShieldDamage { get; set; } + + /// + /// Percentage of damage that pierces phased shields, instead of being inflicted to the shields. + /// Actual shield piercing is the weighted average of this and the normal shield piercing, if the vehicle has both types of shields. + /// + public Formula PhasedShieldPiercing { get; set; } + + /// + /// Level of plague inflicted on a colony. + /// This formula is NOT a percentage! It's a raw plague level number. + /// This formula can take a "target" parameter which is the colony being plagued. + /// + public Formula PlagueLevel { get; set; } + + /// + /// Percentage of nominal damage inflicted to population. + /// This formula can take a "target" parameter which is the race of the population being damaged. + /// + public Formula PopulationDamage { get; set; } + + /// + /// Percentage of nominal damage inflicted to seekers. + /// Defaults to the component damage value. + /// + public Formula SeekerDamage { get; set; } + + /// + /// Percentage effectiveness of the target's "shield generation from damage" ability against this damage type. + /// + public Formula ShieldGenerationFromDamage { get; set; } + + /// + /// Percentage of nominal damage applied as a boarding attempt. + /// If successful, the ship's security stations will be destroyed, but otherwise no damage is inflicted. + /// + public Formula ShipCapture { get; set; } + + /// + /// Percentage of nominal damage applied as acceleration away from the attacker, or toward him if the value is negative. + /// + public Formula TargetPush { get; set; } + + /// + /// Percentage of nominal damage applied as random teleportation within a specified radius. Does not affect velocity. + /// + public Formula TargetTeleport { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public override string ToString() + { + return Name; + } } \ No newline at end of file diff --git a/FrEee/Modding/DataFile.cs b/FrEee.Core/Modding/DataFile.cs similarity index 96% rename from FrEee/Modding/DataFile.cs rename to FrEee.Core/Modding/DataFile.cs index afb00bd47..23f728f11 100644 --- a/FrEee/Modding/DataFile.cs +++ b/FrEee.Core/Modding/DataFile.cs @@ -1,176 +1,176 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.RegularExpressions; - -namespace FrEee.Modding; - -/// -/// A data file which is part of a mod. -/// -[Serializable] -public class DataFile -{ - /// - /// Creates a data file with no records - /// - public DataFile() - { - MetaRecords = new List(); - } - - /// - /// Creates a data file by parsing some string data. - /// - /// - public DataFile(string data) - : this() - { - // split data into lines - var lines = data.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries).Select(l => l.Trim()).ToArray(); - - int curLine; - - // find *BEGIN* tag - // TODO - if no *BEGIN* tag present, don't require it - for (curLine = 0; curLine < lines.Length; curLine++) - { - if (lines[curLine] == "*BEGIN*") - break; - } - - // skip 2 lines - curLine += 2; - - List includeDataFiles = new List(); - while (curLine < lines.Length && (lines[curLine].StartsWith("#include") || - string.IsNullOrEmpty(lines[curLine]))) - { - string line = lines[curLine]; - if (string.IsNullOrEmpty(line)) - { - ++curLine; - continue; - } - - if (line.StartsWith("#include-from")) - { - var regex = new Regex("#include-from \"(.*)\" \"(.*)\""); - var match = regex.Match(line); - var modName = match.Groups[1].Captures[0].Value; - var fileName = match.Groups[2].Captures[0].Value; - if (string.IsNullOrEmpty(modName)) - throw new FileNotFoundException($"#include-from at line {curLine} does not contain mod name."); - if (string.IsNullOrEmpty(fileName)) - throw new FileNotFoundException($"#include-from at line {curLine} does not contain file name."); - includeDataFiles.Add(Load(modName, fileName)); - } - else - { - int firstPQ = line.IndexOf('"') + 1; - int lastPQ = line.LastIndexOf('"') - 1; - string includePath = line.Substring(firstPQ, (lastPQ - firstPQ) + 1); - string filename = Path.GetFileName(includePath); - if (string.IsNullOrEmpty(filename)) - throw new FileNotFoundException($"#include path \"{includePath}\" at line {curLine} does not contain filename."); - string subpath = Path.GetDirectoryName(includePath); - includeDataFiles.Add(Load(DataPath, filename, subpath)); - } - - ++curLine; - } - - // start reading records - var recLines = new List(); - for (; curLine < lines.Length; curLine++) - { - if (string.IsNullOrWhiteSpace(lines[curLine])) - { - // done with a record - if (recLines.Count > 0) - { - MetaRecords.Add(new MetaRecord(recLines)); - recLines.Clear(); - } - } - else - { - // add line to current record - recLines.Add(lines[curLine]); - } - } - - // deal with the last record - if (recLines.Count > 0) - MetaRecords.Add(new MetaRecord(recLines)); - - // deal with degenerate records - MetaRecords = MetaRecords.Where(rec => rec.Fields.Count > 0).ToList(); - - List compiledRecords = new List(); - foreach (var includeDataFile in includeDataFiles) - { - foreach (var record in includeDataFile.MetaRecords) - { - compiledRecords.Add(record); - } - } - - compiledRecords.AddRange(MetaRecords); - - MetaRecords = compiledRecords; - } - - public static string DataPath { get; private set; } - - /// - /// The meta records in this data file. - /// Meta records are records that can contain parameters and static formulas. - /// - public IList MetaRecords { get; private set; } - - /// - /// The individual records generated from the meta records. - /// - public IEnumerable Records - { - get - { - return MetaRecords.SelectMany(mr => mr.Instantiate()); - } - } - - /// - /// Loads a data file from disk. - /// - /// The mod path, relative to the FrEee/Mods folder, or null to use the stock mod. - /// The file name relative to the mod's Data folder. - /// - public static DataFile Load(string modpath, string filename, string subpath = "") - { - // TODO - fall back on stock data when mod data not found - var datapath = modpath == null ? "Data" : Path.Combine("Mods", modpath, "Data", subpath); - - DataPath = modpath; - - var filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), datapath, filename); - if (File.Exists(filepath)) - return new DataFile(File.ReadAllText(filepath)); - // got here? then try the stock data file instead if we were loading a mod - if (modpath != null) - { - filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Data", filename); - if (File.Exists(filepath)) - return new DataFile(File.ReadAllText(filepath)); - } - // got here? then data file was not found even in stock - throw new FileNotFoundException($"Could not find data file: {filename} at {filepath}.", filename); - } - - public override string ToString() - { - return "(" + MetaRecords.Count + " meta records)"; - } +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text.RegularExpressions; + +namespace FrEee.Modding; + +/// +/// A data file which is part of a mod. +/// +[Serializable] +public class DataFile +{ + /// + /// Creates a data file with no records + /// + public DataFile() + { + MetaRecords = new List(); + } + + /// + /// Creates a data file by parsing some string data. + /// + /// + public DataFile(string data) + : this() + { + // split data into lines + var lines = data.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries).Select(l => l.Trim()).ToArray(); + + int curLine; + + // find *BEGIN* tag + // TODO - if no *BEGIN* tag present, don't require it + for (curLine = 0; curLine < lines.Length; curLine++) + { + if (lines[curLine] == "*BEGIN*") + break; + } + + // skip 2 lines + curLine += 2; + + List includeDataFiles = new List(); + while (curLine < lines.Length && (lines[curLine].StartsWith("#include") || + string.IsNullOrEmpty(lines[curLine]))) + { + string line = lines[curLine]; + if (string.IsNullOrEmpty(line)) + { + ++curLine; + continue; + } + + if (line.StartsWith("#include-from")) + { + var regex = new Regex("#include-from \"(.*)\" \"(.*)\""); + var match = regex.Match(line); + var modName = match.Groups[1].Captures[0].Value; + var fileName = match.Groups[2].Captures[0].Value; + if (string.IsNullOrEmpty(modName)) + throw new FileNotFoundException($"#include-from at line {curLine} does not contain mod name."); + if (string.IsNullOrEmpty(fileName)) + throw new FileNotFoundException($"#include-from at line {curLine} does not contain file name."); + includeDataFiles.Add(Load(modName, fileName)); + } + else + { + int firstPQ = line.IndexOf('"') + 1; + int lastPQ = line.LastIndexOf('"') - 1; + string includePath = line.Substring(firstPQ, (lastPQ - firstPQ) + 1); + string filename = Path.GetFileName(includePath); + if (string.IsNullOrEmpty(filename)) + throw new FileNotFoundException($"#include path \"{includePath}\" at line {curLine} does not contain filename."); + string subpath = Path.GetDirectoryName(includePath); + includeDataFiles.Add(Load(DataPath, filename, subpath)); + } + + ++curLine; + } + + // start reading records + var recLines = new List(); + for (; curLine < lines.Length; curLine++) + { + if (string.IsNullOrWhiteSpace(lines[curLine])) + { + // done with a record + if (recLines.Count > 0) + { + MetaRecords.Add(new MetaRecord(recLines)); + recLines.Clear(); + } + } + else + { + // add line to current record + recLines.Add(lines[curLine]); + } + } + + // deal with the last record + if (recLines.Count > 0) + MetaRecords.Add(new MetaRecord(recLines)); + + // deal with degenerate records + MetaRecords = MetaRecords.Where(rec => rec.Fields.Count > 0).ToList(); + + List compiledRecords = new List(); + foreach (var includeDataFile in includeDataFiles) + { + foreach (var record in includeDataFile.MetaRecords) + { + compiledRecords.Add(record); + } + } + + compiledRecords.AddRange(MetaRecords); + + MetaRecords = compiledRecords; + } + + public static string DataPath { get; private set; } + + /// + /// The meta records in this data file. + /// Meta records are records that can contain parameters and static formulas. + /// + public IList MetaRecords { get; private set; } + + /// + /// The individual records generated from the meta records. + /// + public IEnumerable Records + { + get + { + return MetaRecords.SelectMany(mr => mr.Instantiate()); + } + } + + /// + /// Loads a data file from disk. + /// + /// The mod path, relative to the FrEee/Mods folder, or null to use the stock mod. + /// The file name relative to the mod's Data folder. + /// + public static DataFile Load(string modpath, string filename, string subpath = "") + { + // TODO - fall back on stock data when mod data not found + var datapath = modpath == null ? "Data" : Path.Combine("Mods", modpath, "Data", subpath); + + DataPath = modpath; + + var filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), datapath, filename); + if (File.Exists(filepath)) + return new DataFile(File.ReadAllText(filepath)); + // got here? then try the stock data file instead if we were loading a mod + if (modpath != null) + { + filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Data", filename); + if (File.Exists(filepath)) + return new DataFile(File.ReadAllText(filepath)); + } + // got here? then data file was not found even in stock + throw new FileNotFoundException($"Could not find data file: {filename} at {filepath}.", filename); + } + + public override string ToString() + { + return "(" + MetaRecords.Count + " meta records)"; + } } \ No newline at end of file diff --git a/FrEee/Modding/DataParsingException.cs b/FrEee.Core/Modding/DataParsingException.cs similarity index 95% rename from FrEee/Modding/DataParsingException.cs rename to FrEee.Core/Modding/DataParsingException.cs index 91c69bee7..73f739a97 100644 --- a/FrEee/Modding/DataParsingException.cs +++ b/FrEee.Core/Modding/DataParsingException.cs @@ -1,30 +1,30 @@ -using System; - -namespace FrEee.Modding; - -/// -/// Exceptiion thrown when parsing mod data. -/// -[Serializable] -public class DataParsingException : Exception -{ - public DataParsingException(string message, string filename, Record record = null, Field field = null) - : base(message) - { - Filename = filename; - Record = record; - Field = field; - } - - public DataParsingException(string message, Exception inner, string filename, Record record = null, Field field = null) - : base(message, inner) - { - Filename = filename; - Record = record; - Field = field; - } - - public Field Field { get; private set; } - public string Filename { get; private set; } - public Record Record { get; private set; } +using System; + +namespace FrEee.Modding; + +/// +/// Exceptiion thrown when parsing mod data. +/// +[Serializable] +public class DataParsingException : Exception +{ + public DataParsingException(string message, string filename, Record record = null, Field field = null) + : base(message) + { + Filename = filename; + Record = record; + Field = field; + } + + public DataParsingException(string message, Exception inner, string filename, Record record = null, Field field = null) + : base(message, inner) + { + Filename = filename; + Record = record; + Field = field; + } + + public Field Field { get; private set; } + public string Filename { get; private set; } + public Record Record { get; private set; } } \ No newline at end of file diff --git a/FrEee/Modding/EmpireTraitRequirement.cs b/FrEee.Core/Modding/EmpireTraitRequirement.cs similarity index 96% rename from FrEee/Modding/EmpireTraitRequirement.cs rename to FrEee.Core/Modding/EmpireTraitRequirement.cs index 63e850aa4..dd88ad2c0 100644 --- a/FrEee/Modding/EmpireTraitRequirement.cs +++ b/FrEee.Core/Modding/EmpireTraitRequirement.cs @@ -1,37 +1,37 @@ -using FrEee.Objects.Civilization; -using System.Linq; - -namespace FrEee.Modding; - -/// -/// Requirement that an empire's primary race have or not have some trait. -/// -public class EmpireTraitRequirement : Requirement -{ - public EmpireTraitRequirement(Trait trait, bool requiredOrForbidden) - : base(requiredOrForbidden ? ("Requires " + trait + ".") : ("Empire cannot have " + trait + ".")) - { - Trait = trait; - RequiredOrForbidden = requiredOrForbidden; - } - - public override bool IsStrict - { - get { return RequiredOrForbidden; } - } - - /// - /// Is this a required trait (true) or a forbidden one (false)? - /// - public bool RequiredOrForbidden { get; set; } - - /// - /// The trait in question - /// - public Trait Trait { get; set; } - - public override bool IsMetBy(Empire obj) - { - return obj.PrimaryRace.Traits.Contains(Trait) == RequiredOrForbidden; - } +using FrEee.Objects.Civilization; +using System.Linq; + +namespace FrEee.Modding; + +/// +/// Requirement that an empire's primary race have or not have some trait. +/// +public class EmpireTraitRequirement : Requirement +{ + public EmpireTraitRequirement(Trait trait, bool requiredOrForbidden) + : base(requiredOrForbidden ? ("Requires " + trait + ".") : ("Empire cannot have " + trait + ".")) + { + Trait = trait; + RequiredOrForbidden = requiredOrForbidden; + } + + public override bool IsStrict + { + get { return RequiredOrForbidden; } + } + + /// + /// Is this a required trait (true) or a forbidden one (false)? + /// + public bool RequiredOrForbidden { get; set; } + + /// + /// The trait in question + /// + public Trait Trait { get; set; } + + public override bool IsMetBy(Empire obj) + { + return obj.PrimaryRace.Traits.Contains(Trait) == RequiredOrForbidden; + } } \ No newline at end of file diff --git a/FrEee/Modding/EventMessageTarget.cs b/FrEee.Core/Modding/EventMessageTarget.cs similarity index 100% rename from FrEee/Modding/EventMessageTarget.cs rename to FrEee.Core/Modding/EventMessageTarget.cs diff --git a/FrEee/Modding/EventSeverity.cs b/FrEee.Core/Modding/EventSeverity.cs similarity index 100% rename from FrEee/Modding/EventSeverity.cs rename to FrEee.Core/Modding/EventSeverity.cs diff --git a/FrEee/Modding/EventTemplate.cs b/FrEee.Core/Modding/EventTemplate.cs similarity index 95% rename from FrEee/Modding/EventTemplate.cs rename to FrEee.Core/Modding/EventTemplate.cs index 25d51d396..099a1e7be 100644 --- a/FrEee/Modding/EventTemplate.cs +++ b/FrEee.Core/Modding/EventTemplate.cs @@ -1,93 +1,93 @@ -using FrEee.Objects.Events; -using System.Collections.Generic; -using FrEee.Objects.GameState; - -namespace FrEee.Modding; - -/// -/// A template for random events. -/// -public class EventTemplate : IModObject, ITemplate -{ - public EventTemplate() - { - } - - /// - /// The amount of effect that this event will have. - /// What this means depends on the event type. - /// - public Formula EffectAmount { get; set; } - - /// - /// Is this EventTemplate disposed? - /// - public bool IsDisposed { get; set; } - - /// - /// Who will receive a message when this event occurs? - /// - public EventMessageTarget MessageTarget { get; set; } - - /// - /// An ID used to represent this mod object. - /// - public string ModID { get; set; } - - /// - /// Not used. - /// - public string Name { get; set; } - - /// - /// The message to send to affected players when the event occurs. - /// - public ICollection OccurrenceMessages { get; set; } - - /// - /// The name of the picture to display when this event occurs. - /// Relative to the Pictures/Events folder. - /// - public Formula Picture { get; set; } - - /// - /// The severity of the event. - /// - public EventSeverity Severity { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - /// - /// How long after being triggered until this event actually occurs? - /// - public Formula TimeTillCompletion { get; set; } - - /// - /// The type of event. - /// - public EventType Type { get; set; } - - /// - /// The message to send to affected players when the event is triggered. - /// - public ICollection WarningMessages { get; set; } - - /// - /// Instantiates an event. - /// - /// - /// The new event. - /// - public Event Instantiate() - { - return new Event(this); - } - - public override string ToString() - { - return Type.Name; - } +using FrEee.Objects.Events; +using System.Collections.Generic; +using FrEee.Objects.GameState; + +namespace FrEee.Modding; + +/// +/// A template for random events. +/// +public class EventTemplate : IModObject, ITemplate +{ + public EventTemplate() + { + } + + /// + /// The amount of effect that this event will have. + /// What this means depends on the event type. + /// + public Formula EffectAmount { get; set; } + + /// + /// Is this EventTemplate disposed? + /// + public bool IsDisposed { get; set; } + + /// + /// Who will receive a message when this event occurs? + /// + public EventMessageTarget MessageTarget { get; set; } + + /// + /// An ID used to represent this mod object. + /// + public string ModID { get; set; } + + /// + /// Not used. + /// + public string Name { get; set; } + + /// + /// The message to send to affected players when the event occurs. + /// + public ICollection OccurrenceMessages { get; set; } + + /// + /// The name of the picture to display when this event occurs. + /// Relative to the Pictures/Events folder. + /// + public Formula Picture { get; set; } + + /// + /// The severity of the event. + /// + public EventSeverity Severity { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + /// + /// How long after being triggered until this event actually occurs? + /// + public Formula TimeTillCompletion { get; set; } + + /// + /// The type of event. + /// + public EventType Type { get; set; } + + /// + /// The message to send to affected players when the event is triggered. + /// + public ICollection WarningMessages { get; set; } + + /// + /// Instantiates an event. + /// + /// + /// The new event. + /// + public Event Instantiate() + { + return new Event(this); + } + + public override string ToString() + { + return Type.Name; + } } \ No newline at end of file diff --git a/FrEee/Modding/EventType.cs b/FrEee.Core/Modding/EventType.cs similarity index 95% rename from FrEee/Modding/EventType.cs rename to FrEee.Core/Modding/EventType.cs index 4f318f6fd..90de912e4 100644 --- a/FrEee/Modding/EventType.cs +++ b/FrEee.Core/Modding/EventType.cs @@ -1,61 +1,61 @@ -using FrEee.Objects.GameState; -using FrEee.Serialization; -using System.Collections.Generic; - -namespace FrEee.Modding; - -/// -/// A type of random event or intelligence project. -/// -public class EventType : IModObject -{ - public EventType() - { - } - - /// - /// Action to execute when the event occurs., - /// - public PythonScript Action { get; set; } - - /// - /// The import statements required to run the target selector and action scripts. - /// - public PythonScript Imports { get; set; } - - public bool IsDisposed { get; set; } - - /// - /// When is this a negative event? - /// - public Formula IsNegativeWhen { get; set; } - - public string ModID { get; set; } - - /// - /// The name of this event type. - /// - public Formula Name { get; set; } - - string INamed.Name => Name; - - /// - /// Scripts to set parameters for the event type. - /// - public PythonScript Parameters { get; set; } - - /// - /// Script to select a target for the event. - /// - public ObjectFormula> TargetSelector { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public override string ToString() - { - return Name; - } +using FrEee.Objects.GameState; +using FrEee.Serialization; +using System.Collections.Generic; + +namespace FrEee.Modding; + +/// +/// A type of random event or intelligence project. +/// +public class EventType : IModObject +{ + public EventType() + { + } + + /// + /// Action to execute when the event occurs., + /// + public PythonScript Action { get; set; } + + /// + /// The import statements required to run the target selector and action scripts. + /// + public PythonScript Imports { get; set; } + + public bool IsDisposed { get; set; } + + /// + /// When is this a negative event? + /// + public Formula IsNegativeWhen { get; set; } + + public string ModID { get; set; } + + /// + /// The name of this event type. + /// + public Formula Name { get; set; } + + string INamed.Name => Name; + + /// + /// Scripts to set parameters for the event type. + /// + public PythonScript Parameters { get; set; } + + /// + /// Script to select a target for the event. + /// + public ObjectFormula> TargetSelector { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public override string ToString() + { + return Name; + } } \ No newline at end of file diff --git a/FrEee/Modding/Field.cs b/FrEee.Core/Modding/Field.cs similarity index 96% rename from FrEee/Modding/Field.cs rename to FrEee.Core/Modding/Field.cs index 9f7f9f62d..23bd962b3 100644 --- a/FrEee/Modding/Field.cs +++ b/FrEee.Core/Modding/Field.cs @@ -1,262 +1,263 @@ -using FrEee.Serialization; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; - -namespace FrEee.Modding; - -/// -/// A field in a data file. -/// -[Serializable] -public class Field -{ - /// - /// Creates a field with no name or value. - /// - public Field() - { - } - - /// - /// Creates a field by parsing some string data. - /// - /// - public Field(string data, Record parent = null) - { - var pos = data.IndexOf(Separator); - Name = data.Substring(0, pos).Trim(); - Value = data.Substring(pos + Separator.Length).Trim(); - } - - /// - /// The name of the field. - /// - public string Name { get; set; } - - /// - /// The text value of the field. - /// - public string Value { get; set; } - - public const string Separator = ":="; - - /// - /// Parses a field as a boolean and logs any error in the mod loading error log. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public bool BoolValue(Record rec) - { - bool b; - if (!bool.TryParse(Value, out b)) - Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as a boolean.", Mod.CurrentFileName, rec, this)); - return b; - } - - public Formula CreateFormula(object context) - where T : IConvertible, IComparable - { - var txt = Value; - - // deal with replacement strings - txt = Regex.Replace(txt, @"\[\%(.*?)\%?\]", @"{{$1}}"); - - if (txt.StartsWith("==")) - return new ComputedFormula(txt.TrimStart('='), context, true); // dynamic - else if (txt.StartsWith("=")) - return new ComputedFormula(txt.TrimStart('='), context, false); // static - // TODO - take into account quotes when seeing if we have string interpolation? - else if (txt.Contains("{") && txt.Substring(txt.IndexOf("{")).Contains("}")) - { - // string interpolation formula - var isDynamic = txt.Contains("{{") && txt.Substring(txt.IndexOf("{{")).Contains("}}"); - var replacedText = txt; - replacedText = "'" + replacedText + "'"; // make it a string - replacedText = replacedText.Replace("{{", "' + str("); - replacedText = replacedText.Replace("}}", ").strip('\"') + '"); // strip to trim start/end quotes that get added by str - replacedText = replacedText.Replace("{", "' + str("); - replacedText = replacedText.Replace("}", ").strip('\"') + '"); - return new ComputedFormula(replacedText, context, isDynamic); - } - return new LiteralFormula(txt); - } - - public ObjectFormula CreateObjectFormula(object context) - { - return new ObjectFormula(Value.TrimStart('='), context, true); - } - - public ObjectFormula CreateReferenceEnumerableFormula(object context) - where T : IReferenceEnumerable - { - var typename = typeof(T).Name; - if (typename.Contains("`")) - typename = typename.Substring(0, typename.IndexOf('`')); - var f = new ObjectFormula($"{typename}[{string.Join(", ", typeof(T).GetGenericArguments().Select(x => x.Name).ToArray())}]({Value.TrimStart('=')})", context, true); - var import = $"from {typeof(T).Namespace} import {typename};"; - var imports = new List(); - imports.Add(import); - foreach (var genparm in typeof(T).GetGenericArguments()) - { - var typename2 = genparm.Name; - if (typename2.Contains("`")) - typename2 = typename.Substring(0, typename2.IndexOf('`')); - imports.Add($"from {genparm.Namespace} import {typename2};"); - } - var script = new PythonScript("Import", string.Join("\n", imports)); - if (f.ExternalScripts == null) - f.ExternalScripts = new PythonScript[] { script }; - else - f.ExternalScripts = f.ExternalScripts.Append(script).ToArray(); - return f; - } - - public PythonScript CreateScript(object context) - { - return new PythonScript("DynamicScript", Value.TrimStart('=')); - } - - /// - /// Parses a field as a double and logs any error in the mod loading error log. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public double DoubleValue(Record rec) - { - double d; - if (!double.TryParse(Value, out d)) - Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as a double.", Mod.CurrentFileName, rec, this)); - return d; - } - - /// - /// Parses a field as an enum and logs any error in the mod loading error log. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public T EnumValue(Record rec) where T : struct - { - T t; - if (!Enum.TryParse(Value, out t)) - Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as an enumerated value of type " + typeof(T).Name + ".", Mod.CurrentFileName, rec, this)); - return t; - } - - /// - /// Parses a field as an integer and logs any error in the mod loading error log. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public int IntValue(Record rec) - { - int i; - if (!int.TryParse(Value, out i)) - Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as an integer.", Mod.CurrentFileName, rec, this)); - return i; - } - - /// - /// Parses a field as a long and logs any error in the mod loading error log. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public long LongValue(Record rec) - { - long l; - if (!long.TryParse(Value, out l)) - Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as a long.", Mod.CurrentFileName, rec, this)); - return l; - } - - /// - /// Parses a field as a nullable boolean. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public bool? NullBoolValue() - { - bool b; - if (!bool.TryParse(Value, out b)) - return null; - return b; - } - - /// - /// Parses a field as a nullable double. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public double? NullDoubleValue() - { - double d; - if (!double.TryParse(Value, out d)) - return null; - return d; - } - - /// - /// Parses a field as a nullable enum. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public T? NullEnumValue() where T : struct - { - T t; - if (!Enum.TryParse(Value, out t)) - return null; - return t; - } - - /// - /// Parses a field as a nullable integer. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public int? NullIntValue() - { - int i; - if (!int.TryParse(Value, out i)) - return null; - return i; - } - - /// - /// Parses a field as a nullable long. - /// - /// - /// - /// - [Obsolete("Use CreateFormula instead.")] - public long? NullLongValue() - { - long l; - if (!long.TryParse(Value, out l)) - return null; - return l; - } - - public override string ToString() - { - return Name + " := " + Value; - } -} +using FrEee.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using FrEee.Serialization; + +namespace FrEee.Modding; + +/// +/// A field in a data file. +/// +[Serializable] +public class Field +{ + /// + /// Creates a field with no name or value. + /// + public Field() + { + } + + /// + /// Creates a field by parsing some string data. + /// + /// + public Field(string data, Record parent = null) + { + var pos = data.IndexOf(Separator); + Name = data.Substring(0, pos).Trim(); + Value = data.Substring(pos + Separator.Length).Trim(); + } + + /// + /// The name of the field. + /// + public string Name { get; set; } + + /// + /// The text value of the field. + /// + public string Value { get; set; } + + public const string Separator = ":="; + + /// + /// Parses a field as a boolean and logs any error in the mod loading error log. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public bool BoolValue(Record rec) + { + bool b; + if (!bool.TryParse(Value, out b)) + Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as a boolean.", Mod.CurrentFileName, rec, this)); + return b; + } + + public Formula CreateFormula(object context) + where T : IConvertible, IComparable + { + var txt = Value; + + // deal with replacement strings + txt = Regex.Replace(txt, @"\[\%(.*?)\%?\]", @"{{$1}}"); + + if (txt.StartsWith("==")) + return new ComputedFormula(txt.TrimStart('='), context, true); // dynamic + else if (txt.StartsWith("=")) + return new ComputedFormula(txt.TrimStart('='), context, false); // static + // TODO - take into account quotes when seeing if we have string interpolation? + else if (txt.Contains("{") && txt.Substring(txt.IndexOf("{")).Contains("}")) + { + // string interpolation formula + var isDynamic = txt.Contains("{{") && txt.Substring(txt.IndexOf("{{")).Contains("}}"); + var replacedText = txt; + replacedText = "'" + replacedText + "'"; // make it a string + replacedText = replacedText.Replace("{{", "' + str("); + replacedText = replacedText.Replace("}}", ").strip('\"') + '"); // strip to trim start/end quotes that get added by str + replacedText = replacedText.Replace("{", "' + str("); + replacedText = replacedText.Replace("}", ").strip('\"') + '"); + return new ComputedFormula(replacedText, context, isDynamic); + } + return new LiteralFormula(txt); + } + + public ObjectFormula CreateObjectFormula(object context) + { + return new ObjectFormula(Value.TrimStart('='), context, true); + } + + public ObjectFormula CreateReferenceEnumerableFormula(object context) + where T : IReferenceEnumerable + { + var typename = typeof(T).Name; + if (typename.Contains("`")) + typename = typename.Substring(0, typename.IndexOf('`')); + var f = new ObjectFormula($"{typename}[{string.Join(", ", typeof(T).GetGenericArguments().Select(x => x.Name).ToArray())}]({Value.TrimStart('=')})", context, true); + var import = $"from {typeof(T).Namespace} import {typename};"; + var imports = new List(); + imports.Add(import); + foreach (var genparm in typeof(T).GetGenericArguments()) + { + var typename2 = genparm.Name; + if (typename2.Contains("`")) + typename2 = typename.Substring(0, typename2.IndexOf('`')); + imports.Add($"from {genparm.Namespace} import {typename2};"); + } + var script = new PythonScript("Import", string.Join("\n", imports)); + if (f.ExternalScripts == null) + f.ExternalScripts = new PythonScript[] { script }; + else + f.ExternalScripts = f.ExternalScripts.Append(script).ToArray(); + return f; + } + + public PythonScript CreateScript(object context) + { + return new PythonScript("DynamicScript", Value.TrimStart('=')); + } + + /// + /// Parses a field as a double and logs any error in the mod loading error log. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public double DoubleValue(Record rec) + { + double d; + if (!double.TryParse(Value, out d)) + Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as a double.", Mod.CurrentFileName, rec, this)); + return d; + } + + /// + /// Parses a field as an enum and logs any error in the mod loading error log. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public T EnumValue(Record rec) where T : struct + { + T t; + if (!Enum.TryParse(Value, out t)) + Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as an enumerated value of type " + typeof(T).Name + ".", Mod.CurrentFileName, rec, this)); + return t; + } + + /// + /// Parses a field as an integer and logs any error in the mod loading error log. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public int IntValue(Record rec) + { + int i; + if (!int.TryParse(Value, out i)) + Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as an integer.", Mod.CurrentFileName, rec, this)); + return i; + } + + /// + /// Parses a field as a long and logs any error in the mod loading error log. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public long LongValue(Record rec) + { + long l; + if (!long.TryParse(Value, out l)) + Mod.Errors.Add(new DataParsingException("Cannot parse \"" + Value + "\" as a long.", Mod.CurrentFileName, rec, this)); + return l; + } + + /// + /// Parses a field as a nullable boolean. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public bool? NullBoolValue() + { + bool b; + if (!bool.TryParse(Value, out b)) + return null; + return b; + } + + /// + /// Parses a field as a nullable double. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public double? NullDoubleValue() + { + double d; + if (!double.TryParse(Value, out d)) + return null; + return d; + } + + /// + /// Parses a field as a nullable enum. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public T? NullEnumValue() where T : struct + { + T t; + if (!Enum.TryParse(Value, out t)) + return null; + return t; + } + + /// + /// Parses a field as a nullable integer. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public int? NullIntValue() + { + int i; + if (!int.TryParse(Value, out i)) + return null; + return i; + } + + /// + /// Parses a field as a nullable long. + /// + /// + /// + /// + [Obsolete("Use CreateFormula instead.")] + public long? NullLongValue() + { + long l; + if (!long.TryParse(Value, out l)) + return null; + return l; + } + + public override string ToString() + { + return Name + " := " + Value; + } +} diff --git a/FrEee/Modding/Formula.cs b/FrEee.Core/Modding/Formula.cs similarity index 96% rename from FrEee/Modding/Formula.cs rename to FrEee.Core/Modding/Formula.cs index 2829347c8..14120209c 100644 --- a/FrEee/Modding/Formula.cs +++ b/FrEee.Core/Modding/Formula.cs @@ -1,217 +1,217 @@ -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Globalization; - -namespace FrEee.Modding; - -/// -/// A formula used in the game's data files. -/// -/// Return type of the formula. -[Serializable] -public abstract class Formula : IFormula, IComparable, IComparable> - where T : IComparable, IConvertible -{ - public Formula(string text) - : this() - { - Text = text; - } - - /// - /// For serialization. - /// - protected Formula() - { - value = new Lazy(ComputeValue); - } - - public abstract object Context { get; set; } - - /// - /// The external scripts required to execute this formula. - /// - public PythonScript[] ExternalScripts { get; set; } - - public abstract bool IsDynamic { get; } - public abstract bool IsLiteral { get; } - - /// - /// The formula text. - /// - public string Text { get; set; } - - public abstract T Value { get; } - object IFormula.Value { get { return Value; } } - protected Lazy value; - - public static implicit operator Formula(T t) - { - return new LiteralFormula(t.ToStringInvariant()); - } - - public static implicit operator T(Formula f) - { - if (f == null) - return default(T); - return f.Value; - } - - public static Formula operator -(Formula f1, Formula f2) - { - var text = $"({f1.Text}) - ({f2.Text})"; - if (f1.IsLiteral && f2.IsLiteral) - return new ComputedFormula(text, null, false); - else - return new ComputedFormula(text, f1.Context ?? f2.Context, f1.IsDynamic || f2.IsDynamic); - } - - public static Formula operator -(Formula f) - { - var text = $"-({f.Text})"; - if (f.IsLiteral) - return new ComputedFormula(text, null, false); - else - return new ComputedFormula(text, f.Context, f.IsDynamic); - } - - public static Formula operator -(Formula f, double scalar) - { - var text = $"{f.Value} - {scalar}"; - return new ComputedFormula(text, f.Context, f.IsDynamic); - } - - public static Formula operator *(Formula f1, Formula f2) - { - var text = $"({f1.Text}) * ({f2.Text})"; - if (f1.IsLiteral && f2.IsLiteral) - return new ComputedFormula(text, null, false); - else - return new ComputedFormula(text, f1.Context ?? f2.Context, f1.IsDynamic || f2.IsDynamic); - } - - public static Formula operator *(Formula f, double scalar) - { - var text = $"{f.Value} * {scalar}"; - return new ComputedFormula(text, f.Context, f.IsDynamic); - } - - public static Formula operator /(Formula f1, Formula f2) - { - var text = $"({f1.Text}) / ({f2.Text})"; - if (f1.IsLiteral && f2.IsLiteral) - return new ComputedFormula(text, null, false); - else - return new ComputedFormula(text, f1.Context ?? f2.Context, f1.IsDynamic || f2.IsDynamic); - } - - public static Formula operator /(Formula f, double scalar) - { - var text = $"{f.Value} / {scalar}"; - return new ComputedFormula(text, f.Context, f.IsDynamic); - } - - public static Formula operator +(Formula f1, Formula f2) - { - string combined = "({0}) + ({1})"; - if (typeof(T) == typeof(string)) - { - if (f1.IsLiteral) - combined = combined.Replace("({0})", "\"{0}\""); - if (f2.IsLiteral) - combined = combined.Replace("({1})", "\"{1}\""); - } - if (f1.IsLiteral && f2.IsLiteral) - return new ComputedFormula(string.Format(combined, f1.Text, f2.Text), null, false); - else - return new ComputedFormula(string.Format(combined, f1.Text, f2.Text), f1.Context ?? f2.Context, f1.IsDynamic || f2.IsDynamic); - } - - public static Formula operator +(Formula f, double scalar) - { - if (typeof(T) == typeof(string)) - { - var text = (string)(object)f.Value + scalar.ToStringInvariant(); - if (f.IsLiteral) - return new LiteralFormula(text); - else - return new ComputedFormula(text, f.Context, f.IsDynamic); - } - else - { - var text = $"{f.Value} + {scalar}"; - return new ComputedFormula(text, f.Context, f.IsDynamic); - } - } - - public static Formula operator +(Formula f1, Formula f2) - { - if (f1 == null && f2 == null) - return null; - if (f1 == null) - { - if (f2.IsLiteral) - return new LiteralFormula(f2.Text); - else - return new ComputedFormula(string.Format("str({0})", f2.Text), f2.Context, f2.IsDynamic); - } - if (f2 == null) - return f1.Copy(); // don't leak a reference to the original formula! - if (f1.IsLiteral && f2.IsLiteral) - return f1.Value + f2.Value; - if (f1.IsDynamic || f2.IsDynamic) - { - if (f1.IsLiteral) - return new ComputedFormula(string.Format("(\"{0}\") + str({1})", f1.Value, f2.Text), f1.Context, true); - else - return new ComputedFormula(string.Format("({0}) + str({1})", f1.Text, f2.Text), f1.Context, true); - } - if (f1.IsLiteral) - return new ComputedFormula(string.Format("(\"{0}\") + str({1})", f1.Value, f2.Text), f1.Context, false); - else - return new ComputedFormula(string.Format("({0}) + str({1})", f1.Text, f2.Text), f1.Context, false); - } - - public int CompareTo(object? obj) - { - if (obj is IFormula) - return Value.CompareTo(((IFormula)obj).Value); - return Value.CompareTo(obj); - } - - public int CompareTo(T? other) - { - return Value.CompareTo(other); - } - - public int CompareTo(Formula? other) - { - return Value.CompareTo(other.Value); - } - - object IFormula.Evaluate(object host, IDictionary variables) - { - return Evaluate(host, variables); - } - - public abstract T Evaluate(object host, IDictionary variables = null); - - public override string ToString() - { - try - { - if (Value is string) - return '"' + Value.ToString() + '"'; - return Value.ToString(); - } - catch (Exception ex) - { - return ex.Message; - } - } - - public abstract Formula ToStringFormula(CultureInfo c = null); - - protected abstract T ComputeValue(); -} +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace FrEee.Modding; + +/// +/// A formula used in the game's data files. +/// +/// Return type of the formula. +[Serializable] +public abstract class Formula : IFormula, IComparable, IComparable> + where T : IComparable, IConvertible +{ + public Formula(string text) + : this() + { + Text = text; + } + + /// + /// For serialization. + /// + protected Formula() + { + value = new Lazy(ComputeValue); + } + + public abstract object Context { get; set; } + + /// + /// The external scripts required to execute this formula. + /// + public PythonScript[] ExternalScripts { get; set; } + + public abstract bool IsDynamic { get; } + public abstract bool IsLiteral { get; } + + /// + /// The formula text. + /// + public string Text { get; set; } + + public abstract T Value { get; } + object IFormula.Value { get { return Value; } } + protected Lazy value; + + public static implicit operator Formula(T t) + { + return new LiteralFormula(t.ToStringInvariant()); + } + + public static implicit operator T(Formula f) + { + if (f == null) + return default(T); + return f.Value; + } + + public static Formula operator -(Formula f1, Formula f2) + { + var text = $"({f1.Text}) - ({f2.Text})"; + if (f1.IsLiteral && f2.IsLiteral) + return new ComputedFormula(text, null, false); + else + return new ComputedFormula(text, f1.Context ?? f2.Context, f1.IsDynamic || f2.IsDynamic); + } + + public static Formula operator -(Formula f) + { + var text = $"-({f.Text})"; + if (f.IsLiteral) + return new ComputedFormula(text, null, false); + else + return new ComputedFormula(text, f.Context, f.IsDynamic); + } + + public static Formula operator -(Formula f, double scalar) + { + var text = $"{f.Value} - {scalar}"; + return new ComputedFormula(text, f.Context, f.IsDynamic); + } + + public static Formula operator *(Formula f1, Formula f2) + { + var text = $"({f1.Text}) * ({f2.Text})"; + if (f1.IsLiteral && f2.IsLiteral) + return new ComputedFormula(text, null, false); + else + return new ComputedFormula(text, f1.Context ?? f2.Context, f1.IsDynamic || f2.IsDynamic); + } + + public static Formula operator *(Formula f, double scalar) + { + var text = $"{f.Value} * {scalar}"; + return new ComputedFormula(text, f.Context, f.IsDynamic); + } + + public static Formula operator /(Formula f1, Formula f2) + { + var text = $"({f1.Text}) / ({f2.Text})"; + if (f1.IsLiteral && f2.IsLiteral) + return new ComputedFormula(text, null, false); + else + return new ComputedFormula(text, f1.Context ?? f2.Context, f1.IsDynamic || f2.IsDynamic); + } + + public static Formula operator /(Formula f, double scalar) + { + var text = $"{f.Value} / {scalar}"; + return new ComputedFormula(text, f.Context, f.IsDynamic); + } + + public static Formula operator +(Formula f1, Formula f2) + { + string combined = "({0}) + ({1})"; + if (typeof(T) == typeof(string)) + { + if (f1.IsLiteral) + combined = combined.Replace("({0})", "\"{0}\""); + if (f2.IsLiteral) + combined = combined.Replace("({1})", "\"{1}\""); + } + if (f1.IsLiteral && f2.IsLiteral) + return new ComputedFormula(string.Format(combined, f1.Text, f2.Text), null, false); + else + return new ComputedFormula(string.Format(combined, f1.Text, f2.Text), f1.Context ?? f2.Context, f1.IsDynamic || f2.IsDynamic); + } + + public static Formula operator +(Formula f, double scalar) + { + if (typeof(T) == typeof(string)) + { + var text = (string)(object)f.Value + scalar.ToStringInvariant(); + if (f.IsLiteral) + return new LiteralFormula(text); + else + return new ComputedFormula(text, f.Context, f.IsDynamic); + } + else + { + var text = $"{f.Value} + {scalar}"; + return new ComputedFormula(text, f.Context, f.IsDynamic); + } + } + + public static Formula operator +(Formula f1, Formula f2) + { + if (f1 == null && f2 == null) + return null; + if (f1 == null) + { + if (f2.IsLiteral) + return new LiteralFormula(f2.Text); + else + return new ComputedFormula(string.Format("str({0})", f2.Text), f2.Context, f2.IsDynamic); + } + if (f2 == null) + return f1.Copy(); // don't leak a reference to the original formula! + if (f1.IsLiteral && f2.IsLiteral) + return f1.Value + f2.Value; + if (f1.IsDynamic || f2.IsDynamic) + { + if (f1.IsLiteral) + return new ComputedFormula(string.Format("(\"{0}\") + str({1})", f1.Value, f2.Text), f1.Context, true); + else + return new ComputedFormula(string.Format("({0}) + str({1})", f1.Text, f2.Text), f1.Context, true); + } + if (f1.IsLiteral) + return new ComputedFormula(string.Format("(\"{0}\") + str({1})", f1.Value, f2.Text), f1.Context, false); + else + return new ComputedFormula(string.Format("({0}) + str({1})", f1.Text, f2.Text), f1.Context, false); + } + + public int CompareTo(object? obj) + { + if (obj is IFormula) + return Value.CompareTo(((IFormula)obj).Value); + return Value.CompareTo(obj); + } + + public int CompareTo(T? other) + { + return Value.CompareTo(other); + } + + public int CompareTo(Formula? other) + { + return Value.CompareTo(other.Value); + } + + object IFormula.Evaluate(object host, IDictionary variables) + { + return Evaluate(host, variables); + } + + public abstract T Evaluate(object host, IDictionary variables = null); + + public override string ToString() + { + try + { + if (Value is string) + return '"' + Value.ToString() + '"'; + return Value.ToString(); + } + catch (Exception ex) + { + return ex.Message; + } + } + + public abstract Formula ToStringFormula(CultureInfo c = null); + + protected abstract T ComputeValue(); +} diff --git a/FrEee/Modding/FormulaContext.cs b/FrEee.Core/Modding/FormulaContext.cs similarity index 95% rename from FrEee/Modding/FormulaContext.cs rename to FrEee.Core/Modding/FormulaContext.cs index 9c58c312f..10a92b80b 100644 --- a/FrEee/Modding/FormulaContext.cs +++ b/FrEee.Core/Modding/FormulaContext.cs @@ -1,51 +1,51 @@ -using System.Collections.Generic; - -namespace FrEee.Modding; - -/// -/// Contextual variables for a formula. -/// -public class FormulaContext -{ - public FormulaContext(FormulaContext parent = null) - { - Parent = parent; - } - - /// - /// Ancestors from oldest to newest, and then this context. - /// - public IEnumerable AllContexts - { - get - { - var list = new List(); - var cur = this; - while (cur != null) - list.Add(cur); - list.Reverse(); - return list; - } - } - - /// - /// Variables in this context, including un-overridden variables in ancestor contexts. - /// - public IDictionary AllVariables - { - get - { - // overwrite older variables with newer ones - var variables = new Dictionary(); - foreach (var ctx in AllContexts) - { - foreach (var kvp in ctx.AllVariables) - ctx.AllVariables.Add(kvp.Key, kvp.Value); - } - return variables; - } - } - - public FormulaContext Parent { get; set; } - public IDictionary Variables = new Dictionary(); +using System.Collections.Generic; + +namespace FrEee.Modding; + +/// +/// Contextual variables for a formula. +/// +public class FormulaContext +{ + public FormulaContext(FormulaContext parent = null) + { + Parent = parent; + } + + /// + /// Ancestors from oldest to newest, and then this context. + /// + public IEnumerable AllContexts + { + get + { + var list = new List(); + var cur = this; + while (cur != null) + list.Add(cur); + list.Reverse(); + return list; + } + } + + /// + /// Variables in this context, including un-overridden variables in ancestor contexts. + /// + public IDictionary AllVariables + { + get + { + // overwrite older variables with newer ones + var variables = new Dictionary(); + foreach (var ctx in AllContexts) + { + foreach (var kvp in ctx.AllVariables) + ctx.AllVariables.Add(kvp.Key, kvp.Value); + } + return variables; + } + } + + public FormulaContext Parent { get; set; } + public IDictionary Variables = new Dictionary(); } \ No newline at end of file diff --git a/FrEee/Modding/FormulaType.cs b/FrEee.Core/Modding/FormulaType.cs similarity index 100% rename from FrEee/Modding/FormulaType.cs rename to FrEee.Core/Modding/FormulaType.cs diff --git a/FrEee/Modding/IFormula.cs b/FrEee.Core/Modding/IFormula.cs similarity index 96% rename from FrEee/Modding/IFormula.cs rename to FrEee.Core/Modding/IFormula.cs index 8e91cf7a1..1d8fa54fd 100644 --- a/FrEee/Modding/IFormula.cs +++ b/FrEee.Core/Modding/IFormula.cs @@ -1,4 +1,5 @@ using FrEee.Serialization; +using FrEee.Utility; using System; using System.Collections.Generic; using System.Globalization; diff --git a/FrEee/Modding/IFormulaHost.cs b/FrEee.Core/Modding/IFormulaHost.cs similarity index 100% rename from FrEee/Modding/IFormulaHost.cs rename to FrEee.Core/Modding/IFormulaHost.cs diff --git a/FrEee/Modding/IModObject.cs b/FrEee.Core/Modding/IModObject.cs similarity index 100% rename from FrEee/Modding/IModObject.cs rename to FrEee.Core/Modding/IModObject.cs diff --git a/FrEee/Modding/LiteralFormula.cs b/FrEee.Core/Modding/LiteralFormula.cs similarity index 94% rename from FrEee/Modding/LiteralFormula.cs rename to FrEee.Core/Modding/LiteralFormula.cs index e3546fb8d..0a9a2c25c 100644 --- a/FrEee/Modding/LiteralFormula.cs +++ b/FrEee.Core/Modding/LiteralFormula.cs @@ -1,130 +1,133 @@ -using FrEee.Utility; using FrEee.Serialization; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Globalization; - -namespace FrEee.Modding; - -/// -/// A simple formula which is just a literal value. Does not require a script. -/// -/// -public class LiteralFormula : Formula, IEquatable> - where T : IConvertible, IComparable -{ - public LiteralFormula(string text) - : base(text) - { - } - - /// - /// For serialization. - /// - private LiteralFormula() - : base() - { - } - - [DoNotSerialize(false)] - public override object Context - { - get - { - return null; - } - set - { - // do nothing - } - } - - public override bool IsDynamic - { - get - { - return false; - } - } - - public override bool IsLiteral - { - get - { - return true; - } - } - - public override T Value - { - get - { - if (value == null) - value = new Lazy(ComputeValue); // HACK - why is it not being set when we load? - return value.Value; - } - } - - public static implicit operator LiteralFormula(T obj) - { - return new LiteralFormula(obj.ToString(CultureInfo.InvariantCulture)); - } - - public static implicit operator T(LiteralFormula f) - { - return f.Value; - } - - public static bool operator !=(LiteralFormula f1, Formula f2) - { - return !(f1 == f2); - } - - public static bool operator ==(LiteralFormula f1, Formula f2) - { - if (f1 is null && f2 is null) - return true; - if (f1 is null || f2 is null) - return false; - return f1.Value.SafeEquals(f2.Value); - } - - public override bool Equals(object? obj) - { - var x = obj as LiteralFormula; - if (ReferenceEquals(x, null)) - return false; - return Equals(x); - } - - public bool Equals(LiteralFormula? other) - { - return Text == other.Text; - } - - public override T Evaluate(object host, IDictionary variables = null) - { - // no need to call a script - return Value; - } - - public override int GetHashCode() - { - return HashCodeMasher.Mash(Text); - } - - public override Formula ToStringFormula(CultureInfo c = null) - { - return new LiteralFormula(Value.ToString(c ?? CultureInfo.InvariantCulture)); - } - - protected override T ComputeValue() - { - if (typeof(T) == typeof(string)) - return (T)(object)Text; - else if (typeof(T).IsEnum) - return Text.ParseEnum(); - else - return (T)Convert.ChangeType(Text, typeof(T), CultureInfo.InvariantCulture); - } +using FrEee.Utility; using FrEee.Serialization; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Globalization; +using FrEee.Utility; +using FrEee.Extensions; +using FrEee.Serialization; + +namespace FrEee.Modding; + +/// +/// A simple formula which is just a literal value. Does not require a script. +/// +/// +public class LiteralFormula : Formula, IEquatable> + where T : IConvertible, IComparable +{ + public LiteralFormula(string text) + : base(text) + { + } + + /// + /// For serialization. + /// + private LiteralFormula() + : base() + { + } + + [DoNotSerialize(false)] + public override object Context + { + get + { + return null; + } + set + { + // do nothing + } + } + + public override bool IsDynamic + { + get + { + return false; + } + } + + public override bool IsLiteral + { + get + { + return true; + } + } + + public override T Value + { + get + { + if (value == null) + value = new Lazy(ComputeValue); // HACK - why is it not being set when we load? + return value.Value; + } + } + + public static implicit operator LiteralFormula(T obj) + { + return new LiteralFormula(obj.ToString(CultureInfo.InvariantCulture)); + } + + public static implicit operator T(LiteralFormula f) + { + return f.Value; + } + + public static bool operator !=(LiteralFormula f1, Formula f2) + { + return !(f1 == f2); + } + + public static bool operator ==(LiteralFormula f1, Formula f2) + { + if (f1 is null && f2 is null) + return true; + if (f1 is null || f2 is null) + return false; + return f1.Value.SafeEquals(f2.Value); + } + + public override bool Equals(object? obj) + { + var x = obj as LiteralFormula; + if (ReferenceEquals(x, null)) + return false; + return Equals(x); + } + + public bool Equals(LiteralFormula? other) + { + return Text == other.Text; + } + + public override T Evaluate(object host, IDictionary variables = null) + { + // no need to call a script + return Value; + } + + public override int GetHashCode() + { + return HashCodeMasher.Mash(Text); + } + + public override Formula ToStringFormula(CultureInfo c = null) + { + return new LiteralFormula(Value.ToString(c ?? CultureInfo.InvariantCulture)); + } + + protected override T ComputeValue() + { + if (typeof(T) == typeof(string)) + return (T)(object)Text; + else if (typeof(T).IsEnum) + return Text.ParseEnum(); + else + return (T)Convert.ChangeType(Text, typeof(T), CultureInfo.InvariantCulture); + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/AbilityLoader.cs b/FrEee.Core/Modding/Loaders/AbilityLoader.cs similarity index 95% rename from FrEee/Modding/Loaders/AbilityLoader.cs rename to FrEee.Core/Modding/Loaders/AbilityLoader.cs index 8196f2bcf..8edffa9e7 100644 --- a/FrEee/Modding/Loaders/AbilityLoader.cs +++ b/FrEee.Core/Modding/Loaders/AbilityLoader.cs @@ -1,121 +1,121 @@ -using FrEee.Objects.Abilities; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -public static class AbilityLoader -{ - /// - /// Loads abilities from a record. - /// - /// - public static IEnumerable Load(string filename, Record rec, IAbilityContainer obj) - { - int count = 0; - int index = -1; - while (true) - { - count++; - - var abil = new Ability(obj); - - var nfield = rec.FindField(new string[] - { - "Ability " + count + " Type", - "Ability Type" - }, ref index, false, index + 1); - if (nfield == null) - break; // no more abilities - var abilname = nfield.CreateFormula(abil).Value; - - lock (Mod.Current.AbilityRules) - { - var rules = Mod.Current.AbilityRules.Where(r => r.Matches(abilname)).ToArray(); - if (rules.Count() > 1) - { - Mod.Errors.Add(new DataParsingException("Ambiguous ability name match for " + abilname + " alias between the following abilities: " + string.Join(", ", rules.Select(r => r.Name).ToArray()) + ".", filename, rec)); - continue; - } - else if (rules.Count() == 0) - { - // create an ad hoc ability rule - abil.Rule = new AbilityRule { Name = abilname }; - Mod.Current.AbilityRules.Add(abil.Rule); - } - else - abil.Rule = rules.Single(); - - abil.Description = rec.Get(new string[] { "Ability " + count + " Descr", "Ability Descr" }, obj); - - int valnum = 0; - int idx = -1; - while (true) - { - valnum++; - - var vfield = rec.FindField(new string[] - { - "Ability " + count + " Val " + valnum, - "Ability " + count + " Val", - "Ability Val " + valnum, - "Ability Val" - }, ref idx, false, idx + 1); - if (vfield == null) - break; - var val = vfield.CreateFormula(abil); - abil.Values.Add(val); - } - } - - yield return abil; - } - } - - /// - /// Loads ability percentages or modifiers. - /// - /// - /// - /// Formula context. - /// - public static IDictionary>> LoadPercentagesOrModifiers(Record rec, string what, object obj) - { - var dict = new Dictionary>>(); - int count = 0; - int start = -1; - while (true) - { - count++; - AbilityRule abilRule; - var vals = new Dictionary>(); - - var nameField = rec.FindField(new string[] { "Ability " + count + " " + what + " Type", "Ability " + what + " Type" }, ref start, false, start + 1, true); - if (nameField == null) - break; // no more abilities - - abilRule = Mod.Current.FindAbilityRule(nameField.Value); - - int vcount = 0; - while (true) - { - vcount++; - var valField = rec.FindField(new string[] - { - "Ability " + count + " " + what + " " + vcount, - "Ability " + count + " " + what, - "Ability " + what + " " + vcount, - "Ability " + what - }, ref start, false, start + 1); - - if (valField == null) - break; // no more values - - vals.Add(vcount, valField.CreateFormula(obj)); - } - - dict.Add(abilRule, vals); - } - return dict; - } +using FrEee.Modding.Abilities; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +public static class AbilityLoader +{ + /// + /// Loads abilities from a record. + /// + /// + public static IEnumerable Load(string filename, Record rec, IAbilityContainer obj) + { + int count = 0; + int index = -1; + while (true) + { + count++; + + var abil = new Ability(obj); + + var nfield = rec.FindField(new string[] + { + "Ability " + count + " Type", + "Ability Type" + }, ref index, false, index + 1); + if (nfield == null) + break; // no more abilities + var abilname = nfield.CreateFormula(abil).Value; + + lock (Mod.Current.AbilityRules) + { + var rules = Mod.Current.AbilityRules.Where(r => r.Matches(abilname)).ToArray(); + if (rules.Count() > 1) + { + Mod.Errors.Add(new DataParsingException("Ambiguous ability name match for " + abilname + " alias between the following abilities: " + string.Join(", ", rules.Select(r => r.Name).ToArray()) + ".", filename, rec)); + continue; + } + else if (rules.Count() == 0) + { + // create an ad hoc ability rule + abil.Rule = new AbilityRule { Name = abilname }; + Mod.Current.AbilityRules.Add(abil.Rule); + } + else + abil.Rule = rules.Single(); + + abil.Description = rec.Get(new string[] { "Ability " + count + " Descr", "Ability Descr" }, obj); + + int valnum = 0; + int idx = -1; + while (true) + { + valnum++; + + var vfield = rec.FindField(new string[] + { + "Ability " + count + " Val " + valnum, + "Ability " + count + " Val", + "Ability Val " + valnum, + "Ability Val" + }, ref idx, false, idx + 1); + if (vfield == null) + break; + var val = vfield.CreateFormula(abil); + abil.Values.Add(val); + } + } + + yield return abil; + } + } + + /// + /// Loads ability percentages or modifiers. + /// + /// + /// + /// Formula context. + /// + public static IDictionary>> LoadPercentagesOrModifiers(Record rec, string what, object obj) + { + var dict = new Dictionary>>(); + int count = 0; + int start = -1; + while (true) + { + count++; + AbilityRule abilRule; + var vals = new Dictionary>(); + + var nameField = rec.FindField(new string[] { "Ability " + count + " " + what + " Type", "Ability " + what + " Type" }, ref start, false, start + 1, true); + if (nameField == null) + break; // no more abilities + + abilRule = Mod.Current.FindAbilityRule(nameField.Value); + + int vcount = 0; + while (true) + { + vcount++; + var valField = rec.FindField(new string[] + { + "Ability " + count + " " + what + " " + vcount, + "Ability " + count + " " + what, + "Ability " + what + " " + vcount, + "Ability " + what + }, ref start, false, start + 1); + + if (valField == null) + break; // no more values + + vals.Add(vcount, valField.CreateFormula(obj)); + } + + dict.Add(abilRule, vals); + } + return dict; + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/AbilityRuleLoader.cs b/FrEee.Core/Modding/Loaders/AbilityRuleLoader.cs similarity index 94% rename from FrEee/Modding/Loaders/AbilityRuleLoader.cs rename to FrEee.Core/Modding/Loaders/AbilityRuleLoader.cs index e7917c501..5ba638239 100644 --- a/FrEee/Modding/Loaders/AbilityRuleLoader.cs +++ b/FrEee.Core/Modding/Loaders/AbilityRuleLoader.cs @@ -1,67 +1,67 @@ -using FrEee.Objects.Abilities; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads ability rules from AbilityRules.txt. -/// -[Serializable] -public class AbilityRuleLoader : DataFileLoader -{ - public AbilityRuleLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "AbilityRules.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var r = new AbilityRule(); - r.TemplateParameters = rec.Parameters; - mod.AbilityRules.Add(r); - - int index = -1; - - r.ModID = rec.Get("ID", r); - r.Name = rec.Get("Name", r, false); - r.Aliases = rec.GetMany("Alias", r).Select(f => f.Value).ToList(); - r.Targets = rec.Get("Targets", r) ?? AbilityTargets.All; - r.Description = rec.Get("Description", r); - for (int i = 1; i <= 2; i++) - { - var f = rec.FindField("Value " + i + " Rule", ref index, false, 0, true); - if (f == null) - r.ValueRules.Add(AbilityValueRule.None); - else - r.ValueRules.Add(f.CreateFormula(r)); - f = rec.FindField("Value " + i + " Group Rule", ref index, false, 0, true); - if (f == null) - r.GroupRules.Add(AbilityValueRule.None); - else - r.GroupRules.Add(f.CreateFormula(r)); - } - int j = 3; - while (true) - { - var f = rec.FindField("Value " + j + " Rule", ref index, false, 0, true); - if (f == null) - break; - else - r.ValueRules.Add(f.CreateFormula(r)); - f = rec.FindField("Value " + j + " Group Rule", ref index, false, 0, true); - if (f == null) - r.GroupRules.Add(AbilityValueRule.None); - else - r.GroupRules.Add(f.CreateFormula(r)); - } - - yield return r; - } - } +using FrEee.Modding.Abilities; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads ability rules from AbilityRules.txt. +/// +[Serializable] +public class AbilityRuleLoader : DataFileLoader +{ + public AbilityRuleLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "AbilityRules.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var r = new AbilityRule(); + r.TemplateParameters = rec.Parameters; + mod.AbilityRules.Add(r); + + int index = -1; + + r.ModID = rec.Get("ID", r); + r.Name = rec.Get("Name", r, false); + r.Aliases = rec.GetMany("Alias", r).Select(f => f.Value).ToList(); + r.Targets = rec.Get("Targets", r) ?? AbilityTargets.All; + r.Description = rec.Get("Description", r); + for (int i = 1; i <= 2; i++) + { + var f = rec.FindField("Value " + i + " Rule", ref index, false, 0, true); + if (f == null) + r.ValueRules.Add(AbilityValueRule.None); + else + r.ValueRules.Add(f.CreateFormula(r)); + f = rec.FindField("Value " + i + " Group Rule", ref index, false, 0, true); + if (f == null) + r.GroupRules.Add(AbilityValueRule.None); + else + r.GroupRules.Add(f.CreateFormula(r)); + } + int j = 3; + while (true) + { + var f = rec.FindField("Value " + j + " Rule", ref index, false, 0, true); + if (f == null) + break; + else + r.ValueRules.Add(f.CreateFormula(r)); + f = rec.FindField("Value " + j + " Group Rule", ref index, false, 0, true); + if (f == null) + r.GroupRules.Add(AbilityValueRule.None); + else + r.GroupRules.Add(f.CreateFormula(r)); + } + + yield return r; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/ComponentLoader.cs b/FrEee.Core/Modding/Loaders/ComponentLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/ComponentLoader.cs rename to FrEee.Core/Modding/Loaders/ComponentLoader.cs index fb8279fd0..ffdf2a4ee 100644 --- a/FrEee/Modding/Loaders/ComponentLoader.cs +++ b/FrEee.Core/Modding/Loaders/ComponentLoader.cs @@ -1,214 +1,215 @@ -using FrEee.Objects.Combat; -using FrEee.Objects.Technology; -using FrEee.Modding.Templates; -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.Vehicles; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads components from Components.txt. -/// -public class ComponentLoader : DataFileLoader -{ - public ComponentLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "Components.txt"; - - private static List numbers = new List() - { - "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten" - }; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var c = new ComponentTemplate(); - c.TemplateParameters = rec.Parameters; - mod.ComponentTemplates.Add(c); - - int index = -1; - - c.ModID = rec.Get("ID", c); - c.Name = rec.Get("Name", c); - c.Description = rec.Get("Description", c); - - var picfield = rec.FindField("Pic", ref index, false, 0, true); - if (picfield != null) - c.PictureName = picfield.CreateFormula(c); - else - c.PictureName = "Comp_" + rec.Get("Pic Num", c).Value.ToString("000"); // for compatibility with SE4 - - c.Size = rec.Get("Tonnage Space Taken", c); - c.Durability = rec.Get("Tonnage Structure", c); - - foreach (var costfield in rec.Fields.Where(cf => cf.Name.StartsWith("Cost "))) - c.Cost[Resource.Find(costfield.Name.Substring("Cost ".Length))] = costfield.CreateFormula(c); - - var vtoverridefield = rec.FindField(new string[] { "Vehicle List Type Override", "Vechicle List Type Override" }, ref index, false, 0, true); // silly Aaron can't spell "vehicle" - if (vtoverridefield != null) - c.VehicleTypes = ParseVehicleTypes(vtoverridefield.Value, ",", rec); - else - c.VehicleTypes = ParseVehicleTypes(rec.Get("Vehicle Type", c), @"\", rec); - - c.SupplyUsage = rec.Get("Supply Amount Used", c); - - var restrictions = rec.Get("Restrictions", c); - if (!string.IsNullOrEmpty(restrictions) && restrictions != "None") - { - var word = restrictions.Value.Split(' ').First(); - int num; - if (numbers.Contains(word)) - c.MaxPerVehicle = numbers.IndexOf(word); - else if (int.TryParse(word, out num)) - c.MaxPerVehicle = num; - else - Mod.Errors.Add(new DataParsingException("Can't parse \"" + word + "\" as a max-per-vehicle restriction.", Mod.CurrentFileName, rec)); - } - - c.Group = rec.Get("General Group", c); - c.Family = rec.Get("Family", c); - c.RomanNumeral = rec.Get("Roman Numeral", c); - c.StellarConstructionGroup = rec.Get("Custom Group", c); - - foreach (var tr in RequirementLoader.LoadEmpireRequirements(rec, c, RequirementType.Unlock)) - c.UnlockRequirements.Add(tr); - - // TODO - build and use requirements - - foreach (var abil in AbilityLoader.Load(Filename, rec, c)) - c.Abilities.Add(abil); - - var wfield = rec.FindField("Weapon Type", ref index, false, 0, true); - if (wfield != null) - { - WeaponInfo w = null; - if (wfield.Value == "Seeking" || wfield.Value == "Seeking Point-Defense") - { - var sw = new SeekingWeaponInfo(); - sw.SeekerSpeed = rec.Get("Weapon Seeker Speed", c); - sw.SeekerDurability = rec.Get("Weapon Seeker Dmg Res", c); - w = sw; - } - else if (wfield.Value == "Direct Fire" || wfield.Value == "Point-Defense") - { - var dfw = new DirectFireWeaponInfo(); - dfw.AccuracyModifier = rec.Get("Weapon Modifier", c); - w = dfw; - } - else if (wfield.Value == "Warhead" || wfield.Value == "Warhead Point-Defense") - { - var ww = new WarheadWeaponInfo(); - w = ww; - } - else if (string.IsNullOrEmpty(wfield.Value) || wfield.Value == "None") - w = null; - else - Mod.Errors.Add(new DataParsingException("Invalid weapon type \"" + wfield.Value + "\".", Mod.CurrentFileName, rec, wfield)); - if (w != null) - { - if (wfield.Value.EndsWith("Point-Defense")) - w.IsPointDefense = true; - - var wtoverridefield = rec.FindField("Weapon List Target Override", ref index, false, 0, true); - if (wtoverridefield != null) - w.Targets = ParseWeaponTargets(wtoverridefield.Value, ",", rec); - else - w.Targets = ParseWeaponTargets(rec.Get("Weapon Target", c), @"\", rec); - - w.MinRange = rec.Get(new string[] { "Min Range", "Minimum Range", "Weapon Min Range", "Weapon Minimum Range" }, c) ?? 0; - w.MaxRange = rec.Get(new string[] { "Max Range", "Maximum Range", "Weapon Max Range", "Weapon Maximum Range" }, c) ?? 20; - var dmgfield = rec.FindField(new string[] { "Damage", "Weapon Damage", "Damage At Rng", "Weapon Damage At Rng", "Damage At Range", "Weapon Damage At Range" }, ref index); - if (dmgfield.Value.StartsWith("=")) - w.Damage = dmgfield.CreateFormula(c); - else - { - string dmgstr = null; - try - { - var dict = new SafeDictionary(); - var split = dmgfield.Value.Split(' '); - for (var i = 0; i < split.Length; i++) - { - if (split[i].ToInt() == 0) - continue; - dict[i + 1] = split[i].ToInt(); - } - - // HACK - SE4 doesn't explicitly specify damage at range zero so copy the damage at range one value - if (dict[1] != 0) - { - dict[0] = dict[1]; - w.MinRange = 0; - } - - w.MinRange = dict.Keys.Min(); - w.MaxRange = dict.Keys.Max(); - - w.Damage = dict.BuildMultiConditionalLessThanOrEqual(c, "range", 0); - } - catch (Exception ex) - { - Mod.Errors.Add(new DataParsingException("Can't parse \"" + dmgstr + "\" as a damage string: " + ex.Message, Mod.CurrentFileName, rec)); - } - } - - var damTypeName = rec.Get("Weapon Damage Type", c); - w.DamageType = Mod.Current.DamageTypes.FindByName(damTypeName); - - if (w.DamageType == null) - { - // no valid damage type? then make it normal damage and log a warning - w.DamageType = DamageType.Normal; - Mod.Errors.Add(new DataParsingException("Unknown damage type \"" + damTypeName + "\"; setting " + c + "'s damage type to Normal.", Mod.CurrentFileName, rec)); - } - - w.ReloadRate = rec.Get("Weapon Reload Rate", c); - - var wdisptype = rec.Get("Weapon Display Type", c); - var wdispname = rec.Get("Weapon Display", c); - if (wdisptype == "Beam") - w.DisplayEffect = new BeamWeaponDisplayEffect(wdispname); - else if (wdisptype == "Torp" || wdisptype == "Torpedo" || wdisptype == "Projectile") - w.DisplayEffect = new ProjectileWeaponDisplayEffect(wdispname); - else if (wdisptype == "Seeker") - w.DisplayEffect = new SeekerWeaponDisplayEffect(wdispname); - else - Mod.Errors.Add(new DataParsingException("Invalid weapon display effect type \"" + wdisptype + "\".", Mod.CurrentFileName, rec)); - - // sanity check - if (wdisptype == "Beam" && w is SeekingWeaponInfo) - Mod.Errors.Add(new DataParsingException("A seeking weapon cannot use a beam display effect.", Mod.CurrentFileName, rec)); - - w.Sound = rec.Get("Weapon Sound", c); - w.Family = rec.Get("Weapon Family", c); - } - c.WeaponInfo = w; - - yield return c; - } - } - } - - private VehicleTypes ParseVehicleTypes(string s, string separator, Record rec) - { - if (s == null) - return VehicleTypes.All; - return s.ParseEnum(); - } - - private WeaponTargets ParseWeaponTargets(string s, string separator, Record rec) - { - if (s == null) - return WeaponTargets.All; - return s.ParseEnum(); - } +using FrEee.Objects.Technology; +using FrEee.Modding.Templates; +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.Vehicles; +using FrEee.Utility; +using FrEee.Processes.Combat; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads components from Components.txt. +/// +public class ComponentLoader : DataFileLoader +{ + public ComponentLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "Components.txt"; + + private static List numbers = new List() + { + "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten" + }; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var c = new ComponentTemplate(); + c.TemplateParameters = rec.Parameters; + mod.ComponentTemplates.Add(c); + + int index = -1; + + c.ModID = rec.Get("ID", c); + c.Name = rec.Get("Name", c); + c.Description = rec.Get("Description", c); + + var picfield = rec.FindField("Pic", ref index, false, 0, true); + if (picfield != null) + c.PictureName = picfield.CreateFormula(c); + else + c.PictureName = "Comp_" + rec.Get("Pic Num", c).Value.ToString("000"); // for compatibility with SE4 + + c.Size = rec.Get("Tonnage Space Taken", c); + c.Durability = rec.Get("Tonnage Structure", c); + + foreach (var costfield in rec.Fields.Where(cf => cf.Name.StartsWith("Cost "))) + c.Cost[Resource.Find(costfield.Name.Substring("Cost ".Length))] = costfield.CreateFormula(c); + + var vtoverridefield = rec.FindField(new string[] { "Vehicle List Type Override", "Vechicle List Type Override" }, ref index, false, 0, true); // silly Aaron can't spell "vehicle" + if (vtoverridefield != null) + c.VehicleTypes = ParseVehicleTypes(vtoverridefield.Value, ",", rec); + else + c.VehicleTypes = ParseVehicleTypes(rec.Get("Vehicle Type", c), @"\", rec); + + c.SupplyUsage = rec.Get("Supply Amount Used", c); + + var restrictions = rec.Get("Restrictions", c); + if (!string.IsNullOrEmpty(restrictions) && restrictions != "None") + { + var word = restrictions.Value.Split(' ').First(); + int num; + if (numbers.Contains(word)) + c.MaxPerVehicle = numbers.IndexOf(word); + else if (int.TryParse(word, out num)) + c.MaxPerVehicle = num; + else + Mod.Errors.Add(new DataParsingException("Can't parse \"" + word + "\" as a max-per-vehicle restriction.", Mod.CurrentFileName, rec)); + } + + c.Group = rec.Get("General Group", c); + c.Family = rec.Get("Family", c); + c.RomanNumeral = rec.Get("Roman Numeral", c); + c.StellarConstructionGroup = rec.Get("Custom Group", c); + + foreach (var tr in RequirementLoader.LoadEmpireRequirements(rec, c, RequirementType.Unlock)) + c.UnlockRequirements.Add(tr); + + // TODO - build and use requirements + + foreach (var abil in AbilityLoader.Load(Filename, rec, c)) + c.Abilities.Add(abil); + + var wfield = rec.FindField("Weapon Type", ref index, false, 0, true); + if (wfield != null) + { + WeaponInfo w = null; + if (wfield.Value == "Seeking" || wfield.Value == "Seeking Point-Defense") + { + var sw = new SeekingWeaponInfo(); + sw.SeekerSpeed = rec.Get("Weapon Seeker Speed", c); + sw.SeekerDurability = rec.Get("Weapon Seeker Dmg Res", c); + w = sw; + } + else if (wfield.Value == "Direct Fire" || wfield.Value == "Point-Defense") + { + var dfw = new DirectFireWeaponInfo(); + dfw.AccuracyModifier = rec.Get("Weapon Modifier", c); + w = dfw; + } + else if (wfield.Value == "Warhead" || wfield.Value == "Warhead Point-Defense") + { + var ww = new WarheadWeaponInfo(); + w = ww; + } + else if (string.IsNullOrEmpty(wfield.Value) || wfield.Value == "None") + w = null; + else + Mod.Errors.Add(new DataParsingException("Invalid weapon type \"" + wfield.Value + "\".", Mod.CurrentFileName, rec, wfield)); + if (w != null) + { + if (wfield.Value.EndsWith("Point-Defense")) + w.IsPointDefense = true; + + var wtoverridefield = rec.FindField("Weapon List Target Override", ref index, false, 0, true); + if (wtoverridefield != null) + w.Targets = ParseWeaponTargets(wtoverridefield.Value, ",", rec); + else + w.Targets = ParseWeaponTargets(rec.Get("Weapon Target", c), @"\", rec); + + w.MinRange = rec.Get(new string[] { "Min Range", "Minimum Range", "Weapon Min Range", "Weapon Minimum Range" }, c) ?? 0; + w.MaxRange = rec.Get(new string[] { "Max Range", "Maximum Range", "Weapon Max Range", "Weapon Maximum Range" }, c) ?? 20; + var dmgfield = rec.FindField(new string[] { "Damage", "Weapon Damage", "Damage At Rng", "Weapon Damage At Rng", "Damage At Range", "Weapon Damage At Range" }, ref index); + if (dmgfield.Value.StartsWith("=")) + w.Damage = dmgfield.CreateFormula(c); + else + { + string dmgstr = null; + try + { + var dict = new SafeDictionary(); + var split = dmgfield.Value.Split(' '); + for (var i = 0; i < split.Length; i++) + { + if (split[i].ToInt() == 0) + continue; + dict[i + 1] = split[i].ToInt(); + } + + // HACK - SE4 doesn't explicitly specify damage at range zero so copy the damage at range one value + if (dict[1] != 0) + { + dict[0] = dict[1]; + w.MinRange = 0; + } + + w.MinRange = dict.Keys.Min(); + w.MaxRange = dict.Keys.Max(); + + w.Damage = dict.BuildMultiConditionalLessThanOrEqual(c, "range", 0); + } + catch (Exception ex) + { + Mod.Errors.Add(new DataParsingException("Can't parse \"" + dmgstr + "\" as a damage string: " + ex.Message, Mod.CurrentFileName, rec)); + } + } + + var damTypeName = rec.Get("Weapon Damage Type", c); + w.DamageType = Mod.Current.DamageTypes.FindByName(damTypeName); + + if (w.DamageType == null) + { + // no valid damage type? then make it normal damage and log a warning + w.DamageType = DamageType.Normal; + Mod.Errors.Add(new DataParsingException("Unknown damage type \"" + damTypeName + "\"; setting " + c + "'s damage type to Normal.", Mod.CurrentFileName, rec)); + } + + w.ReloadRate = rec.Get("Weapon Reload Rate", c); + + var wdisptype = rec.Get("Weapon Display Type", c); + var wdispname = rec.Get("Weapon Display", c); + if (wdisptype == "Beam") + w.DisplayEffect = new BeamWeaponDisplayEffect(wdispname); + else if (wdisptype == "Torp" || wdisptype == "Torpedo" || wdisptype == "Projectile") + w.DisplayEffect = new ProjectileWeaponDisplayEffect(wdispname); + else if (wdisptype == "Seeker") + w.DisplayEffect = new SeekerWeaponDisplayEffect(wdispname); + else + Mod.Errors.Add(new DataParsingException("Invalid weapon display effect type \"" + wdisptype + "\".", Mod.CurrentFileName, rec)); + + // sanity check + if (wdisptype == "Beam" && w is SeekingWeaponInfo) + Mod.Errors.Add(new DataParsingException("A seeking weapon cannot use a beam display effect.", Mod.CurrentFileName, rec)); + + w.Sound = rec.Get("Weapon Sound", c); + w.Family = rec.Get("Weapon Family", c); + } + c.WeaponInfo = w; + + yield return c; + } + } + } + + private VehicleTypes ParseVehicleTypes(string s, string separator, Record rec) + { + if (s == null) + return VehicleTypes.All; + return s.ParseEnum(); + } + + private WeaponTargets ParseWeaponTargets(string s, string separator, Record rec) + { + if (s == null) + return WeaponTargets.All; + return s.ParseEnum(); + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/CultureLoader.cs b/FrEee.Core/Modding/Loaders/CultureLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/CultureLoader.cs rename to FrEee.Core/Modding/Loaders/CultureLoader.cs index 74f3b230a..761ca4e8d 100644 --- a/FrEee/Modding/Loaders/CultureLoader.cs +++ b/FrEee.Core/Modding/Loaders/CultureLoader.cs @@ -1,43 +1,43 @@ -using FrEee.Objects.Civilization; -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads empire cultures from Cultures.txt. -/// -public class CultureLoader : DataFileLoader -{ - public CultureLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "Cultures.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var c = new Culture(); - c.TemplateParameters = rec.Parameters; - mod.Cultures.Add(c); - - c.ModID = rec.Get("ID", c); - c.Name = rec.Get("Name", c); - c.Description = rec.Get("Description", c); - c.Production = rec.Get("Production", c) ?? 0; - c.Research = rec.Get("Research", c) ?? 0; - c.Intelligence = rec.Get("Intelligence", c) ?? 0; - c.Trade = rec.Get("Trade", c) ?? 0; - c.SpaceCombat = rec.Get("Space Combat", c) ?? 0; - c.GroundCombat = rec.Get("Ground Combat", c) ?? 0; - c.Happiness = rec.Get("Happiness", c) ?? 0; - c.MaintenanceReduction = rec.Get("Maintenance", c) ?? 0; - c.Construction = rec.Get("SY Rate", c) ?? 0; - c.Repair = rec.Get("Repair", c) ?? 0; - - yield return c; - } - } +using FrEee.Objects.Civilization; +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads empire cultures from Cultures.txt. +/// +public class CultureLoader : DataFileLoader +{ + public CultureLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "Cultures.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var c = new Culture(); + c.TemplateParameters = rec.Parameters; + mod.Cultures.Add(c); + + c.ModID = rec.Get("ID", c); + c.Name = rec.Get("Name", c); + c.Description = rec.Get("Description", c); + c.Production = rec.Get("Production", c) ?? 0; + c.Research = rec.Get("Research", c) ?? 0; + c.Intelligence = rec.Get("Intelligence", c) ?? 0; + c.Trade = rec.Get("Trade", c) ?? 0; + c.SpaceCombat = rec.Get("Space Combat", c) ?? 0; + c.GroundCombat = rec.Get("Ground Combat", c) ?? 0; + c.Happiness = rec.Get("Happiness", c) ?? 0; + c.MaintenanceReduction = rec.Get("Maintenance", c) ?? 0; + c.Construction = rec.Get("SY Rate", c) ?? 0; + c.Repair = rec.Get("Repair", c) ?? 0; + + yield return c; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/DamageTypeLoader.cs b/FrEee.Core/Modding/Loaders/DamageTypeLoader.cs similarity index 97% rename from FrEee/Modding/Loaders/DamageTypeLoader.cs rename to FrEee.Core/Modding/Loaders/DamageTypeLoader.cs index eccc0a9e1..816619a3c 100644 --- a/FrEee/Modding/Loaders/DamageTypeLoader.cs +++ b/FrEee.Core/Modding/Loaders/DamageTypeLoader.cs @@ -1,51 +1,51 @@ -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads damage types from DamageTypes.txt. -/// -public class DamageTypeLoader : DataFileLoader -{ - public DamageTypeLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "DamageTypes.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var dt = new DamageType(); - dt.TemplateParameters = rec.Parameters; - mod.DamageTypes.Add(dt); - - dt.ModID = rec.Get("ID", dt); - dt.Name = rec.Get("Name", dt); - dt.Description = rec.Get("Description", dt); - dt.NormalShieldDamage = rec.Get("Normal Shield Damage", dt) ?? 100; - dt.NormalShieldPiercing = rec.Get("Normal Shield Piercing", dt) ?? 0; - dt.PhasedShieldDamage = rec.Get("Phased Shield Damage", dt) ?? 100; - dt.PhasedShieldPiercing = rec.Get("Phased Shield Piercing", dt) ?? 0; - dt.ComponentDamage = rec.Get("Component Damage", dt) ?? 100; - dt.ComponentPiercing = rec.Get("Component Piercing", dt) ?? 0; - dt.SeekerDamage = rec.Get("Seeker Damage", dt) ?? dt.ComponentDamage; - dt.PopulationDamage = rec.Get("Population Damage", dt) ?? 100; - dt.ConditionsDamage = rec.Get("Conditions Damage", dt) ?? 0; - dt.FacilityDamage = rec.Get("Facility Damage", dt) ?? 100; - dt.FacilityPiercing = rec.Get("Facility Piercing", dt) ?? 100; - dt.PlagueLevel = rec.Get("Plague Level", dt) ?? 0; - dt.TargetPush = rec.Get("Target Push", dt) ?? 0; - dt.TargetTeleport = rec.Get("Target Teleport", dt) ?? 0; - dt.IncreaseReload = rec.Get("Increase Reload", dt) ?? 0; - dt.DisruptReload = rec.Get("Disrupt Reload", dt) ?? 0; - dt.ShipCapture = rec.Get("Ship Capture", dt) ?? 0; - dt.EmissiveArmor = rec.Get("Emissive Armor", dt) ?? 100; - dt.ShieldGenerationFromDamage = rec.Get("Shield Generation From Damage", dt) ?? 100; - - yield return dt; - } - } +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads damage types from DamageTypes.txt. +/// +public class DamageTypeLoader : DataFileLoader +{ + public DamageTypeLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "DamageTypes.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var dt = new DamageType(); + dt.TemplateParameters = rec.Parameters; + mod.DamageTypes.Add(dt); + + dt.ModID = rec.Get("ID", dt); + dt.Name = rec.Get("Name", dt); + dt.Description = rec.Get("Description", dt); + dt.NormalShieldDamage = rec.Get("Normal Shield Damage", dt) ?? 100; + dt.NormalShieldPiercing = rec.Get("Normal Shield Piercing", dt) ?? 0; + dt.PhasedShieldDamage = rec.Get("Phased Shield Damage", dt) ?? 100; + dt.PhasedShieldPiercing = rec.Get("Phased Shield Piercing", dt) ?? 0; + dt.ComponentDamage = rec.Get("Component Damage", dt) ?? 100; + dt.ComponentPiercing = rec.Get("Component Piercing", dt) ?? 0; + dt.SeekerDamage = rec.Get("Seeker Damage", dt) ?? dt.ComponentDamage; + dt.PopulationDamage = rec.Get("Population Damage", dt) ?? 100; + dt.ConditionsDamage = rec.Get("Conditions Damage", dt) ?? 0; + dt.FacilityDamage = rec.Get("Facility Damage", dt) ?? 100; + dt.FacilityPiercing = rec.Get("Facility Piercing", dt) ?? 100; + dt.PlagueLevel = rec.Get("Plague Level", dt) ?? 0; + dt.TargetPush = rec.Get("Target Push", dt) ?? 0; + dt.TargetTeleport = rec.Get("Target Teleport", dt) ?? 0; + dt.IncreaseReload = rec.Get("Increase Reload", dt) ?? 0; + dt.DisruptReload = rec.Get("Disrupt Reload", dt) ?? 0; + dt.ShipCapture = rec.Get("Ship Capture", dt) ?? 0; + dt.EmissiveArmor = rec.Get("Emissive Armor", dt) ?? 100; + dt.ShieldGenerationFromDamage = rec.Get("Shield Generation From Damage", dt) ?? 100; + + yield return dt; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/DataFileLoader.cs b/FrEee.Core/Modding/Loaders/DataFileLoader.cs similarity index 95% rename from FrEee/Modding/Loaders/DataFileLoader.cs rename to FrEee.Core/Modding/Loaders/DataFileLoader.cs index e55efb4f1..006a30f1d 100644 --- a/FrEee/Modding/Loaders/DataFileLoader.cs +++ b/FrEee.Core/Modding/Loaders/DataFileLoader.cs @@ -1,24 +1,24 @@ -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads data from a data file. -/// -public abstract class DataFileLoader : ILoader -{ - public DataFileLoader(string modPath, string filename, DataFile df) - { - ModPath = modPath; - FileName = filename; - DataFile = df; - } - - public DataFile DataFile { get; set; } - - public string FileName { get; set; } - - public string ModPath { get; set; } - - public abstract IEnumerable Load(Mod mod); +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads data from a data file. +/// +public abstract class DataFileLoader : ILoader +{ + public DataFileLoader(string modPath, string filename, DataFile df) + { + ModPath = modPath; + FileName = filename; + DataFile = df; + } + + public DataFile DataFile { get; set; } + + public string FileName { get; set; } + + public string ModPath { get; set; } + + public abstract IEnumerable Load(Mod mod); } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/DesignRoleLoader.cs b/FrEee.Core/Modding/Loaders/DesignRoleLoader.cs similarity index 95% rename from FrEee/Modding/Loaders/DesignRoleLoader.cs rename to FrEee.Core/Modding/Loaders/DesignRoleLoader.cs index f6689e977..91f75d539 100644 --- a/FrEee/Modding/Loaders/DesignRoleLoader.cs +++ b/FrEee.Core/Modding/Loaders/DesignRoleLoader.cs @@ -1,32 +1,32 @@ -using System; -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads design roles from DefaultDesignTypes.txt -/// -[Serializable] -public class DesignRoleLoader : ILoader -{ - public DesignRoleLoader(string modPath) - { - ModPath = modPath; - FileName = Filename; - DataFile = DataFile.Load(modPath, Filename); - } - - public DataFile DataFile { get; set; } - public string FileName { get; set; } - public string ModPath { get; set; } - public const string Filename = "DefaultDesignTypes.txt"; - - public IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - mod.DesignRoles.Add(rec.Get("Name")); - } - yield break; // no actual mod objects to load - } +using System; +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads design roles from DefaultDesignTypes.txt +/// +[Serializable] +public class DesignRoleLoader : ILoader +{ + public DesignRoleLoader(string modPath) + { + ModPath = modPath; + FileName = Filename; + DataFile = DataFile.Load(modPath, Filename); + } + + public DataFile DataFile { get; set; } + public string FileName { get; set; } + public string ModPath { get; set; } + public const string Filename = "DefaultDesignTypes.txt"; + + public IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + mod.DesignRoles.Add(rec.Get("Name")); + } + yield break; // no actual mod objects to load + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/EmpireAILoader.cs b/FrEee.Core/Modding/Loaders/EmpireAILoader.cs similarity index 96% rename from FrEee/Modding/Loaders/EmpireAILoader.cs rename to FrEee.Core/Modding/Loaders/EmpireAILoader.cs index c5ba33c78..98518119b 100644 --- a/FrEee/Modding/Loaders/EmpireAILoader.cs +++ b/FrEee.Core/Modding/Loaders/EmpireAILoader.cs @@ -1,114 +1,115 @@ -using FrEee.Objects.AI; -using FrEee.Objects.Civilization; -using FrEee.Utility; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads empire AIs. -/// -public class EmpireAILoader : ILoader -{ - public EmpireAILoader(string modPath) - { - FileName = "AI.script"; - ModPath = modPath; - } - - public string FileName - { - get; - set; - } - - public string ModPath - { - get; - set; - } - - public IEnumerable Load(Mod mod) - { - string empsFolder; - if (ModPath == null) - //empsFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Pictures", "Races"); - empsFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Scripts", "AI"); - else - empsFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), ModPath, "Scripts", "AI"); - //empsFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), ModPath, "Pictures", "Races"); - if (Directory.Exists(empsFolder)) - { - foreach (var empFolder in Directory.GetDirectories(empsFolder)) - { - if (File.Exists(Path.Combine(empFolder, "AI.py"))) - { - var script = PythonScript.Load(Path.Combine(empFolder, "AI")); - if (script == null) - continue; // script does not exist for this shipset - var ministers = new SafeDictionary>(); - string curCategory = "Uncategorized"; - var ministersFile = Path.Combine(empFolder, "AI.ministers"); - if (File.Exists(ministersFile)) - { - foreach (var line in File.ReadAllLines(ministersFile)) - { - if (line.StartsWith("\t")) - { - // found a minister name - var ministerName = line.Substring(1); - if (ministers[curCategory] == null) - ministers[curCategory] = new List(); - ministers[curCategory].Add(ministerName); - } - else - { - // found a minister category - curCategory = line; - } - } - } - var ai = new PythonAI(Path.GetFileName(empFolder), script, ministers); - mod.EmpireAIs.Add(ai); - yield return ai; - } - //C# AI. - else if (File.Exists(Path.Combine(empFolder, "AI.csx"))) - { - var script = CSScript.Load(Path.Combine(empFolder, "AI")); - if (script == null) - continue; // script does not exist for this shipset - var ministers = new SafeDictionary>(); - string curCategory = "Uncategorized"; - var ministersFile = Path.Combine(empFolder, "AI.ministers"); - if (File.Exists(ministersFile)) - { - foreach (var line in File.ReadAllLines(ministersFile)) - { - if (line.StartsWith("\t")) - { - // found a minister name - var ministerName = line.Substring(1); - if (ministers[curCategory] == null) - ministers[curCategory] = new List(); - ministers[curCategory].Add(ministerName); - } - else - { - // found a minister category - curCategory = line; - } - } - } - // TODO: fix CSAI crash loading FrEee.Core.dll - //var ai = new CSAI(Path.GetFileName(empFolder), script, ministers); - //mod.EmpireAIs.Add(ai); - //yield return ai; - } - } - } - } -} +using FrEee.Processes.AI; +using FrEee.Objects.Civilization; +using FrEee.Utility; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using FrEee.Objects.GameState; +using FrEee.Utility; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads empire AIs. +/// +public class EmpireAILoader : ILoader +{ + public EmpireAILoader(string modPath) + { + FileName = "AI.script"; + ModPath = modPath; + } + + public string FileName + { + get; + set; + } + + public string ModPath + { + get; + set; + } + + public IEnumerable Load(Mod mod) + { + string empsFolder; + if (ModPath == null) + //empsFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Pictures", "Races"); + empsFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Scripts", "AI"); + else + empsFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), ModPath, "Scripts", "AI"); + //empsFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), ModPath, "Pictures", "Races"); + if (Directory.Exists(empsFolder)) + { + foreach (var empFolder in Directory.GetDirectories(empsFolder)) + { + if (File.Exists(Path.Combine(empFolder, "AI.py"))) + { + var script = PythonScript.Load(Path.Combine(empFolder, "AI")); + if (script == null) + continue; // script does not exist for this shipset + var ministers = new SafeDictionary>(); + string curCategory = "Uncategorized"; + var ministersFile = Path.Combine(empFolder, "AI.ministers"); + if (File.Exists(ministersFile)) + { + foreach (var line in File.ReadAllLines(ministersFile)) + { + if (line.StartsWith("\t")) + { + // found a minister name + var ministerName = line.Substring(1); + if (ministers[curCategory] == null) + ministers[curCategory] = new List(); + ministers[curCategory].Add(ministerName); + } + else + { + // found a minister category + curCategory = line; + } + } + } + var ai = new PythonAI(Path.GetFileName(empFolder), script, ministers); + mod.EmpireAIs.Add(ai); + yield return ai; + } + //C# AI. + else if (File.Exists(Path.Combine(empFolder, "AI.csx"))) + { + var script = CSScript.Load(Path.Combine(empFolder, "AI")); + if (script == null) + continue; // script does not exist for this shipset + var ministers = new SafeDictionary>(); + string curCategory = "Uncategorized"; + var ministersFile = Path.Combine(empFolder, "AI.ministers"); + if (File.Exists(ministersFile)) + { + foreach (var line in File.ReadAllLines(ministersFile)) + { + if (line.StartsWith("\t")) + { + // found a minister name + var ministerName = line.Substring(1); + if (ministers[curCategory] == null) + ministers[curCategory] = new List(); + ministers[curCategory].Add(ministerName); + } + else + { + // found a minister category + curCategory = line; + } + } + } + // TODO: fix CSAI crash loading FrEee.Core.dll + //var ai = new CSAI(Path.GetFileName(empFolder), script, ministers); + //mod.EmpireAIs.Add(ai); + //yield return ai; + } + } + } + } +} diff --git a/FrEee/Modding/Loaders/EventLoader.cs b/FrEee.Core/Modding/Loaders/EventLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/EventLoader.cs rename to FrEee.Core/Modding/Loaders/EventLoader.cs index 573ff71e1..92464ae80 100644 --- a/FrEee/Modding/Loaders/EventLoader.cs +++ b/FrEee.Core/Modding/Loaders/EventLoader.cs @@ -1,77 +1,77 @@ -using FrEee.Objects.Events; -using FrEee.Extensions; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads event templates from Events.txt. -/// -public class EventLoader : DataFileLoader -{ - public EventLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "Events.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var et = new EventTemplate(); - et.TemplateParameters = rec.Parameters; - mod.EventTemplates.Add(et); - - et.ModID = rec.Get("ID", et); - et.Type = mod.EventTypes.FindByName(rec.Get("Type", et)); - et.Severity = rec.Get("Severity", et); - et.EffectAmount = rec.Get("Effect Amount", et); - et.MessageTarget = rec.Get("Message To", et); - et.OccurrenceMessages = LoadMessages(rec, et, "Message").ToList(); - et.Picture = rec.Get("Picture", et); - et.TimeTillCompletion = rec.Get("Time Till Completion", et); - et.WarningMessages = LoadMessages(rec, et, "Start Message").ToList(); - - yield return et; - } - } - - /// - /// Loads event messages from a record. - /// - /// - public static IEnumerable LoadMessages(Record rec, EventTemplate et, string prefix) - { - int count = 0; - int index = -1; - while (true) - { - count++; - - var m = new EventMessage(); - - var titleField = rec.FindField(new string[] - { - $"{prefix} Title {count}", - $"{prefix} Title" - }, ref index, false, index + 1); - if (titleField == null) - break; // no more messages - var title = titleField.CreateFormula(et); - - var textField = rec.FindField(new string[] - { - $"{prefix} {count}", - $"{prefix}" - }, ref index, false, index + 1); - if (textField == null) - break; // no more messages - var text = textField.CreateFormula(et); - - yield return new EventMessage { Title = title, Text = text }; - } - } +using FrEee.Objects.Events; +using FrEee.Extensions; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads event templates from Events.txt. +/// +public class EventLoader : DataFileLoader +{ + public EventLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "Events.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var et = new EventTemplate(); + et.TemplateParameters = rec.Parameters; + mod.EventTemplates.Add(et); + + et.ModID = rec.Get("ID", et); + et.Type = mod.EventTypes.FindByName(rec.Get("Type", et)); + et.Severity = rec.Get("Severity", et); + et.EffectAmount = rec.Get("Effect Amount", et); + et.MessageTarget = rec.Get("Message To", et); + et.OccurrenceMessages = LoadMessages(rec, et, "Message").ToList(); + et.Picture = rec.Get("Picture", et); + et.TimeTillCompletion = rec.Get("Time Till Completion", et); + et.WarningMessages = LoadMessages(rec, et, "Start Message").ToList(); + + yield return et; + } + } + + /// + /// Loads event messages from a record. + /// + /// + public static IEnumerable LoadMessages(Record rec, EventTemplate et, string prefix) + { + int count = 0; + int index = -1; + while (true) + { + count++; + + var m = new EventMessage(); + + var titleField = rec.FindField(new string[] + { + $"{prefix} Title {count}", + $"{prefix} Title" + }, ref index, false, index + 1); + if (titleField == null) + break; // no more messages + var title = titleField.CreateFormula(et); + + var textField = rec.FindField(new string[] + { + $"{prefix} {count}", + $"{prefix}" + }, ref index, false, index + 1); + if (textField == null) + break; // no more messages + var text = textField.CreateFormula(et); + + yield return new EventMessage { Title = title, Text = text }; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/EventTypeLoader.cs b/FrEee.Core/Modding/Loaders/EventTypeLoader.cs similarity index 94% rename from FrEee/Modding/Loaders/EventTypeLoader.cs rename to FrEee.Core/Modding/Loaders/EventTypeLoader.cs index 05d52e9d1..0a4d310b4 100644 --- a/FrEee/Modding/Loaders/EventTypeLoader.cs +++ b/FrEee.Core/Modding/Loaders/EventTypeLoader.cs @@ -1,38 +1,39 @@ -using FrEee.Serialization; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads event types from EventTypes.txt. -/// -public class EventTypeLoader : DataFileLoader -{ - public EventTypeLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "EventTypes.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var et = new EventType(); - et.TemplateParameters = rec.Parameters; - mod.EventTypes.Add(et); - - et.ModID = rec.Get("ID", et); - et.Name = rec.Get("Name", et); - et.Imports = rec.GetScript("Import", et); - et.Parameters = rec.GetScript("Parameter", et); - et.TargetSelector = rec.GetReferenceEnumerable>(new string[] { "Target Selector" }, et); - et.TargetSelector.ExternalScripts = et.TargetSelector.ExternalScripts.Append(et.Imports).ToArray(); - et.Action = rec.GetScript("Action", et); - et.Action.ExternalScripts = new PythonScript[] { et.Imports, et.Parameters }.ToHashSet(); - yield return et; - } - } +using FrEee.Objects.GameState; +using FrEee.Serialization; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads event types from EventTypes.txt. +/// +public class EventTypeLoader : DataFileLoader +{ + public EventTypeLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "EventTypes.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var et = new EventType(); + et.TemplateParameters = rec.Parameters; + mod.EventTypes.Add(et); + + et.ModID = rec.Get("ID", et); + et.Name = rec.Get("Name", et); + et.Imports = rec.GetScript("Import", et); + et.Parameters = rec.GetScript("Parameter", et); + et.TargetSelector = rec.GetReferenceEnumerable>(new string[] { "Target Selector" }, et); + et.TargetSelector.ExternalScripts = et.TargetSelector.ExternalScripts.Append(et.Imports).ToArray(); + et.Action = rec.GetScript("Action", et); + et.Action.ExternalScripts = new PythonScript[] { et.Imports, et.Parameters }.ToHashSet(); + yield return et; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/FacilityLoader.cs b/FrEee.Core/Modding/Loaders/FacilityLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/FacilityLoader.cs rename to FrEee.Core/Modding/Loaders/FacilityLoader.cs index f37dce5a9..3462d7a06 100644 --- a/FrEee/Modding/Loaders/FacilityLoader.cs +++ b/FrEee.Core/Modding/Loaders/FacilityLoader.cs @@ -1,58 +1,58 @@ -using FrEee.Objects.Technology; -using FrEee.Utility; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads facilities from Facility.txt. -/// -[Serializable] -public class FacilityLoader : DataFileLoader -{ - public FacilityLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "Facility.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var f = new FacilityTemplate(); - f.TemplateParameters = rec.Parameters; - mod.FacilityTemplates.Add(f); - - int index = -1; - - f.ModID = rec.Get("ID", f); - f.Name = rec.Get("Name", f); - f.Description = rec.Get("Description", f); - f.Group = rec.Get("Facility Group", f); - f.Family = rec.Get("Facility Family", f); - f.RomanNumeral = rec.Get("Roman Numeral", f); - var picfield = rec.FindField("Pic", ref index, false, 0, true); - if (picfield != null) - f.PictureName = picfield.Value; - else - f.PictureName = "Facil_" + rec.Get("Pic Num", f).Value.ToString("000"); // for compatibility with SE4 - - foreach (var costfield in rec.Fields.Where(cf => cf.Name.StartsWith("Cost "))) - f.Cost[Resource.Find(costfield.Name.Substring("Cost ".Length))] = costfield.CreateFormula(f); - - foreach (var tr in RequirementLoader.LoadEmpireRequirements(rec, f, RequirementType.Unlock)) - f.UnlockRequirements.Add(tr); - - // TODO - build and use requirements - - foreach (var abil in AbilityLoader.Load(Filename, rec, f).ToArray()) - f.Abilities.Add(abil); - - yield return f; - } - } -} +using FrEee.Objects.Technology; +using FrEee.Utility; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads facilities from Facility.txt. +/// +[Serializable] +public class FacilityLoader : DataFileLoader +{ + public FacilityLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "Facility.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var f = new FacilityTemplate(); + f.TemplateParameters = rec.Parameters; + mod.FacilityTemplates.Add(f); + + int index = -1; + + f.ModID = rec.Get("ID", f); + f.Name = rec.Get("Name", f); + f.Description = rec.Get("Description", f); + f.Group = rec.Get("Facility Group", f); + f.Family = rec.Get("Facility Family", f); + f.RomanNumeral = rec.Get("Roman Numeral", f); + var picfield = rec.FindField("Pic", ref index, false, 0, true); + if (picfield != null) + f.PictureName = picfield.Value; + else + f.PictureName = "Facil_" + rec.Get("Pic Num", f).Value.ToString("000"); // for compatibility with SE4 + + foreach (var costfield in rec.Fields.Where(cf => cf.Name.StartsWith("Cost "))) + f.Cost[Resource.Find(costfield.Name.Substring("Cost ".Length))] = costfield.CreateFormula(f); + + foreach (var tr in RequirementLoader.LoadEmpireRequirements(rec, f, RequirementType.Unlock)) + f.UnlockRequirements.Add(tr); + + // TODO - build and use requirements + + foreach (var abil in AbilityLoader.Load(Filename, rec, f).ToArray()) + f.Abilities.Add(abil); + + yield return f; + } + } +} diff --git a/FrEee/Modding/Loaders/GalaxyLoader.cs b/FrEee.Core/Modding/Loaders/GalaxyLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/GalaxyLoader.cs rename to FrEee.Core/Modding/Loaders/GalaxyLoader.cs index 3f9808972..d73eb5868 100644 --- a/FrEee/Modding/Loaders/GalaxyLoader.cs +++ b/FrEee.Core/Modding/Loaders/GalaxyLoader.cs @@ -1,115 +1,115 @@ -using FrEee.Setup.StarSystemPlacementStrategies; -using FrEee.Modding.Templates; -using FrEee.Extensions; -using System; -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads galaxy templates from QuadrantTypes.txt. -/// -[Serializable] -public class GalaxyLoader : DataFileLoader -{ - public GalaxyLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "QuadrantTypes.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var galtemp = new GalaxyTemplate(); - galtemp.TemplateParameters = rec.Parameters; - string temp; - int index = -1; - - galtemp.ModID = rec.Get("ID", galtemp); - rec.TryFindFieldValue("Name", out temp, ref index, Mod.Errors, 0, true); - galtemp.Name = temp; - mod.GalaxyTemplates.Add(galtemp); - - rec.TryFindFieldValue("Description", out temp, ref index, Mod.Errors, 0, true); - galtemp.Description = temp; - - rec.TryFindFieldValue("Min Dist Between Systems", out temp, ref index, Mod.Errors, 0, true); - int mindist; - if (!int.TryParse(temp, out mindist)) - Mod.Errors.Add(new DataParsingException("Cannot find field \"Min Dist Between Systems\"", Mod.CurrentFileName, rec)); - galtemp.MinimumStarSystemDistance = mindist; - - rec.TryFindFieldValue("System Placement", out temp, ref index, Mod.Errors, 0, true); - if (temp == "Random") - galtemp.StarSystemPlacementStrategy = new RandomStarSystemPlacementStrategy(); - else if (temp == "Clusters") - galtemp.StarSystemPlacementStrategy = new ClusteredStarSystemPlacementStrategy(); - else if (temp == "Spiral") - galtemp.StarSystemPlacementStrategy = new SpiralStarSystemPlacementStrategy(); - else if (temp == "Diffuse") - galtemp.StarSystemPlacementStrategy = new DiffuseStarSystemPlacementStrategy(); - else if (temp == "Grid") - galtemp.StarSystemPlacementStrategy = new GridStarSystemPlacementStrategy(); - else - { - Mod.Errors.Add(new DataParsingException("Invalid value \"" + temp + "\" for field \"System Placement\". Must be Random, Clusters, Spiral, Diffuse, or Grid.", Mod.CurrentFileName, rec)); - galtemp.StarSystemPlacementStrategy = new RandomStarSystemPlacementStrategy(); // default - } - - rec.TryFindFieldValue("Max Warp Points per Sys", out temp, ref index, Mod.Errors, 0, true); - int maxwarp; - if (!int.TryParse(temp, out maxwarp)) - Mod.Errors.Add(new DataParsingException("Cannot find field \"Max Warp Points per Sys\"", Mod.CurrentFileName, rec)); - galtemp.MaxWarpPointsPerSystem = maxwarp; - - rec.TryFindFieldValue("Min Angle Between WP", out temp, ref index, Mod.Errors, 0, true); - int minangle; - if (!int.TryParse(temp, out minangle)) - Mod.Errors.Add(new DataParsingException("Cannot find field \"Min Angle Between WP\"", Mod.CurrentFileName, rec)); - galtemp.MinWarpPointAngle = minangle; - - int count = 1; - int start = 0; - while (true) - { - StarSystemTemplate sst; - int chance; - - if (!rec.TryFindFieldValue(new string[] { "Type " + count + " Name", "Type Name" }, out temp, ref start, null, start, true)) - break; // couldn't load next chance - else - { - sst = mod.StarSystemTemplates.FindByName(temp); - if (sst == null) - { - Mod.Errors.Add(new DataParsingException("Could not find star system template \"" + temp + "\".", Mod.CurrentFileName, rec, null)); - continue; // skip this chance - } - } - start++; - - if (!rec.TryFindFieldValue(new string[] { "Type " + count + " Chance", "Type Chance" }, out temp, ref start, null, start)) - break; // couldn't load next chance - else - { - if (!int.TryParse(temp, out chance)) - Mod.Errors.Add(new DataParsingException("Type Chance field value must be an integer.", Mod.CurrentFileName, rec, null)); - } - start++; - - // silly Adamant Mod refers to the same star system type twice... - if (galtemp.StarSystemTemplateChances.ContainsKey(sst)) - galtemp.StarSystemTemplateChances[sst] += chance; - else - galtemp.StarSystemTemplateChances.Add(sst, chance); - - count++; - } - - yield return galtemp; - } - } +using FrEee.Processes.Setup.StarSystemPlacementStrategies; +using FrEee.Modding.Templates; +using FrEee.Extensions; +using System; +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads galaxy templates from QuadrantTypes.txt. +/// +[Serializable] +public class GalaxyLoader : DataFileLoader +{ + public GalaxyLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "QuadrantTypes.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var galtemp = new GalaxyTemplate(); + galtemp.TemplateParameters = rec.Parameters; + string temp; + int index = -1; + + galtemp.ModID = rec.Get("ID", galtemp); + rec.TryFindFieldValue("Name", out temp, ref index, Mod.Errors, 0, true); + galtemp.Name = temp; + mod.GalaxyTemplates.Add(galtemp); + + rec.TryFindFieldValue("Description", out temp, ref index, Mod.Errors, 0, true); + galtemp.Description = temp; + + rec.TryFindFieldValue("Min Dist Between Systems", out temp, ref index, Mod.Errors, 0, true); + int mindist; + if (!int.TryParse(temp, out mindist)) + Mod.Errors.Add(new DataParsingException("Cannot find field \"Min Dist Between Systems\"", Mod.CurrentFileName, rec)); + galtemp.MinimumStarSystemDistance = mindist; + + rec.TryFindFieldValue("System Placement", out temp, ref index, Mod.Errors, 0, true); + if (temp == "Random") + galtemp.StarSystemPlacementStrategy = new RandomStarSystemPlacementStrategy(); + else if (temp == "Clusters") + galtemp.StarSystemPlacementStrategy = new ClusteredStarSystemPlacementStrategy(); + else if (temp == "Spiral") + galtemp.StarSystemPlacementStrategy = new SpiralStarSystemPlacementStrategy(); + else if (temp == "Diffuse") + galtemp.StarSystemPlacementStrategy = new DiffuseStarSystemPlacementStrategy(); + else if (temp == "Grid") + galtemp.StarSystemPlacementStrategy = new GridStarSystemPlacementStrategy(); + else + { + Mod.Errors.Add(new DataParsingException("Invalid value \"" + temp + "\" for field \"System Placement\". Must be Random, Clusters, Spiral, Diffuse, or Grid.", Mod.CurrentFileName, rec)); + galtemp.StarSystemPlacementStrategy = new RandomStarSystemPlacementStrategy(); // default + } + + rec.TryFindFieldValue("Max Warp Points per Sys", out temp, ref index, Mod.Errors, 0, true); + int maxwarp; + if (!int.TryParse(temp, out maxwarp)) + Mod.Errors.Add(new DataParsingException("Cannot find field \"Max Warp Points per Sys\"", Mod.CurrentFileName, rec)); + galtemp.MaxWarpPointsPerSystem = maxwarp; + + rec.TryFindFieldValue("Min Angle Between WP", out temp, ref index, Mod.Errors, 0, true); + int minangle; + if (!int.TryParse(temp, out minangle)) + Mod.Errors.Add(new DataParsingException("Cannot find field \"Min Angle Between WP\"", Mod.CurrentFileName, rec)); + galtemp.MinWarpPointAngle = minangle; + + int count = 1; + int start = 0; + while (true) + { + StarSystemTemplate sst; + int chance; + + if (!rec.TryFindFieldValue(new string[] { "Type " + count + " Name", "Type Name" }, out temp, ref start, null, start, true)) + break; // couldn't load next chance + else + { + sst = mod.StarSystemTemplates.FindByName(temp); + if (sst == null) + { + Mod.Errors.Add(new DataParsingException("Could not find star system template \"" + temp + "\".", Mod.CurrentFileName, rec, null)); + continue; // skip this chance + } + } + start++; + + if (!rec.TryFindFieldValue(new string[] { "Type " + count + " Chance", "Type Chance" }, out temp, ref start, null, start)) + break; // couldn't load next chance + else + { + if (!int.TryParse(temp, out chance)) + Mod.Errors.Add(new DataParsingException("Type Chance field value must be an integer.", Mod.CurrentFileName, rec, null)); + } + start++; + + // silly Adamant Mod refers to the same star system type twice... + if (galtemp.StarSystemTemplateChances.ContainsKey(sst)) + galtemp.StarSystemTemplateChances[sst] += chance; + else + galtemp.StarSystemTemplateChances.Add(sst, chance); + + count++; + } + + yield return galtemp; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/HappinessModelLoader.cs b/FrEee.Core/Modding/Loaders/HappinessModelLoader.cs similarity index 97% rename from FrEee/Modding/Loaders/HappinessModelLoader.cs rename to FrEee.Core/Modding/Loaders/HappinessModelLoader.cs index 578d541ee..3b4bab1de 100644 --- a/FrEee/Modding/Loaders/HappinessModelLoader.cs +++ b/FrEee.Core/Modding/Loaders/HappinessModelLoader.cs @@ -1,73 +1,73 @@ -using FrEee.Objects.Civilization; -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads happiness models from Happiness.txt. -/// -public class HappinessModelLoader : DataFileLoader -{ - public HappinessModelLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "Happiness.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var h = new HappinessModel(); - h.TemplateParameters = rec.Parameters; - mod.HappinessModels.Add(h); - - h.ModID = rec.Get("ID", h); - h.Name = rec.Get("Name", h); - h.Description = rec.Get("Description", h); - h.MaxPositiveTurnAngerChange = rec.Get("Max Positive Anger Change", h); - h.MaxNegativeTurnAngerChange = rec.Get("Max Negative Anger Change", h); - h.OurHomeworldLost = rec.Get("Homeworld Lost", h); - h.OurPlanetLost = rec.Get("Any Planet Lost", h); - h.PlanetColonized = rec.Get("Any Planet Colonized", h); - h.OurPlanetCaptured = rec.Get("Any Our Planet Captured", h); - h.EnemyPlanetCaptured = rec.Get("Any Enemy Planet Captured", h); - h.OurShipLost = rec.Get("Any Ship Lost", h); - h.AnyShipConstructed = rec.Get("Any Ship Constructed", h); - h.TreatyWar = rec.Get("New Treaty War", h); - h.TreatyNonIntercourse = rec.Get("New Treaty Non Intercourse", h); - h.TreatyNone = rec.Get("New Treaty None", h); - h.TreatyNonAggression = rec.Get("New Treaty Non Aggression", h); - h.TreatySubjugationSubordinate = rec.Get("New Treaty Subjugated (Sub)", h); - h.TreatyProtectorateSubordinate = rec.Get("New Treaty Protectorate (Sub)", h); - h.TreatySubjugationDominant = rec.Get("New Treaty Subjugated (Dom)", h); - h.TreatyProtectorateDominant = rec.Get("New Treaty Protectorate (Dom)", h); - h.TreatyTrade = rec.Get("New Treaty Trade", h); - h.TreatyTradeAndResearch = rec.Get("New Treaty Trade and Research", h); - h.TreatyMilitaryAlliance = rec.Get("New Treaty Military Alliance", h); - h.TreatyPartnership = rec.Get("New Treaty Partnership", h); - h.BattleInSystemWin = rec.Get("Battle in System - Win", h); - h.BattleInSystemLoss = rec.Get("Battle in System - Loss", h); - h.BattleInSystemStalemate = rec.Get("Battle in System - Stalemate", h); - h.BattleInSectorWin = rec.Get("Battle in Sector - Win", h); - h.BattleInSectorLoss = rec.Get("Battle in Sector - Loss", h); - h.BattleInSectorStalemate = rec.Get("Battle in Sector - Stalemate", h); - h.EnemyShipInSystem = rec.Get("Enemy Ship in System", h); - h.EnemyShipInSector = rec.Get("Enemy Ship in Sector", h); - h.OurShipInSector = rec.Get("Our Ship in Sector", h); - h.OurShipInSystem = rec.Get("Our Ship in System", h); - h.EnemyTroopsOnPlanet = rec.Get("Enemy Troops on Planet", h); - h.OurTroopOnPlanet = rec.Get("Our Troops on Planet", h); - h.OneMillionPopulationKilled = rec.Get("1M Population Killed", h); - h.OurShipLostInSystem = rec.Get("Ship Lost in System", h); - h.ShipConstructed = rec.Get("Ship Constructed", h); - h.FacilityConstructed = rec.Get("Facility Constructed", h); - h.OurPlanetPlagued = rec.Get("Planet Plagued", h); - h.NaturalTurnAngerChangeOurRace = rec.Get("Natural Decrease", h); - h.NaturalTurnAngerChangeOtherRaces = rec.Get("Natural Decrease for Other Races", h); - - yield return h; - } - } +using FrEee.Objects.Civilization; +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads happiness models from Happiness.txt. +/// +public class HappinessModelLoader : DataFileLoader +{ + public HappinessModelLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "Happiness.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var h = new HappinessModel(); + h.TemplateParameters = rec.Parameters; + mod.HappinessModels.Add(h); + + h.ModID = rec.Get("ID", h); + h.Name = rec.Get("Name", h); + h.Description = rec.Get("Description", h); + h.MaxPositiveTurnAngerChange = rec.Get("Max Positive Anger Change", h); + h.MaxNegativeTurnAngerChange = rec.Get("Max Negative Anger Change", h); + h.OurHomeworldLost = rec.Get("Homeworld Lost", h); + h.OurPlanetLost = rec.Get("Any Planet Lost", h); + h.PlanetColonized = rec.Get("Any Planet Colonized", h); + h.OurPlanetCaptured = rec.Get("Any Our Planet Captured", h); + h.EnemyPlanetCaptured = rec.Get("Any Enemy Planet Captured", h); + h.OurShipLost = rec.Get("Any Ship Lost", h); + h.AnyShipConstructed = rec.Get("Any Ship Constructed", h); + h.TreatyWar = rec.Get("New Treaty War", h); + h.TreatyNonIntercourse = rec.Get("New Treaty Non Intercourse", h); + h.TreatyNone = rec.Get("New Treaty None", h); + h.TreatyNonAggression = rec.Get("New Treaty Non Aggression", h); + h.TreatySubjugationSubordinate = rec.Get("New Treaty Subjugated (Sub)", h); + h.TreatyProtectorateSubordinate = rec.Get("New Treaty Protectorate (Sub)", h); + h.TreatySubjugationDominant = rec.Get("New Treaty Subjugated (Dom)", h); + h.TreatyProtectorateDominant = rec.Get("New Treaty Protectorate (Dom)", h); + h.TreatyTrade = rec.Get("New Treaty Trade", h); + h.TreatyTradeAndResearch = rec.Get("New Treaty Trade and Research", h); + h.TreatyMilitaryAlliance = rec.Get("New Treaty Military Alliance", h); + h.TreatyPartnership = rec.Get("New Treaty Partnership", h); + h.BattleInSystemWin = rec.Get("Battle in System - Win", h); + h.BattleInSystemLoss = rec.Get("Battle in System - Loss", h); + h.BattleInSystemStalemate = rec.Get("Battle in System - Stalemate", h); + h.BattleInSectorWin = rec.Get("Battle in Sector - Win", h); + h.BattleInSectorLoss = rec.Get("Battle in Sector - Loss", h); + h.BattleInSectorStalemate = rec.Get("Battle in Sector - Stalemate", h); + h.EnemyShipInSystem = rec.Get("Enemy Ship in System", h); + h.EnemyShipInSector = rec.Get("Enemy Ship in Sector", h); + h.OurShipInSector = rec.Get("Our Ship in Sector", h); + h.OurShipInSystem = rec.Get("Our Ship in System", h); + h.EnemyTroopsOnPlanet = rec.Get("Enemy Troops on Planet", h); + h.OurTroopOnPlanet = rec.Get("Our Troops on Planet", h); + h.OneMillionPopulationKilled = rec.Get("1M Population Killed", h); + h.OurShipLostInSystem = rec.Get("Ship Lost in System", h); + h.ShipConstructed = rec.Get("Ship Constructed", h); + h.FacilityConstructed = rec.Get("Facility Constructed", h); + h.OurPlanetPlagued = rec.Get("Planet Plagued", h); + h.NaturalTurnAngerChangeOurRace = rec.Get("Natural Decrease", h); + h.NaturalTurnAngerChangeOtherRaces = rec.Get("Natural Decrease for Other Races", h); + + yield return h; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/HullLoader.cs b/FrEee.Core/Modding/Loaders/HullLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/HullLoader.cs rename to FrEee.Core/Modding/Loaders/HullLoader.cs index 0b176e87c..bf27dbcdf 100644 --- a/FrEee/Modding/Loaders/HullLoader.cs +++ b/FrEee.Core/Modding/Loaders/HullLoader.cs @@ -1,108 +1,108 @@ -using FrEee.Objects.Technology; -using FrEee.Objects.Vehicles; -using FrEee.Utility; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads hulls from VehicleSize.txt. -/// -public class HullLoader : DataFileLoader -{ - public HullLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "VehicleSize.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - IHull hull; - var hullname = rec.Get("Name", null); - var hulltype = rec.Get("Vehicle Type", null); - switch (hulltype) - { - case "Ship": - hull = new Hull(); - break; - - case "Base": - hull = new Hull(); - break; - - case "Fighter": - hull = new Hull(); - break; - - case "Satellite": - hull = new Hull(); - break; - - case "Troop": - hull = new Hull(); - break; - - case "Drone": - hull = new Hull(); - break; - - case "Mine": - hull = new Hull(); - break; - - case "Weapon Platform": - hull = new Hull(); - break; - - default: - Mod.Errors.Add(new DataParsingException("Invalid vehicle type \"" + hulltype + "\" specified for " + hullname + " hull.", Mod.CurrentFileName, rec)); - continue; - } - hull.TemplateParameters = rec.Parameters; - hull.ModID = rec.Get("ID", hull); - hull.Name = hullname; - mod.Hulls.Add(hull); - - hull.ShortName = rec.Get("Short Name", hull); - hull.Description = rec.Get("Description", hull); - hull.Code = rec.Get("Code", hull); - - var bitmapfields = rec.Fields.Where(f => f.Name.EndsWith("Bitmap Name")); - foreach (var f in bitmapfields) - { - hull.PictureNames.Add(f.Value); - } - - hull.Size = rec.Get("Tonnage", hull); - - foreach (var costfield in rec.Fields.Where(cf => cf.Name.StartsWith("Cost "))) - hull.Cost[Resource.Find(costfield.Name.Substring("Cost ".Length))] = costfield.CreateFormula(hull); - - hull.ThrustPerMove = rec.Get("Engines Per Move", hull); - - foreach (var tr in RequirementLoader.LoadEmpireRequirements(rec, hull, RequirementType.Unlock)) - hull.UnlockRequirements.Add(tr); - - // TODO - build and use requirements - - foreach (var abil in AbilityLoader.Load(Filename, rec, hull)) - hull.Abilities.Add(abil); - - hull.NeedsBridge = rec.Get("Requirement Must Have Bridge", hull); - hull.CanUseAuxiliaryControl = rec.Get("Requirement Can Have Aux Con", hull); - hull.MinLifeSupport = rec.Get("Requirement Min Life Support", hull); - hull.MinCrewQuarters = rec.Get("Requirement Min Crew Quarters", hull); - hull.MaxEngines = rec.Get("Requirement Max Engines", hull); - hull.MinPercentFighterBays = rec.Get("Requirement Pct Fighter Bays", hull); - hull.MinPercentColonyModules = rec.Get("Requirement Pct Colony Mods", hull); - hull.MinPercentCargoBays = rec.Get("Requirement Pct Cargo", hull); - - yield return hull; - } - } +using FrEee.Objects.Technology; +using FrEee.Objects.Vehicles; +using FrEee.Utility; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads hulls from VehicleSize.txt. +/// +public class HullLoader : DataFileLoader +{ + public HullLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "VehicleSize.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + IHull hull; + var hullname = rec.Get("Name", null); + var hulltype = rec.Get("Vehicle Type", null); + switch (hulltype) + { + case "Ship": + hull = new Hull(); + break; + + case "Base": + hull = new Hull(); + break; + + case "Fighter": + hull = new Hull(); + break; + + case "Satellite": + hull = new Hull(); + break; + + case "Troop": + hull = new Hull(); + break; + + case "Drone": + hull = new Hull(); + break; + + case "Mine": + hull = new Hull(); + break; + + case "Weapon Platform": + hull = new Hull(); + break; + + default: + Mod.Errors.Add(new DataParsingException("Invalid vehicle type \"" + hulltype + "\" specified for " + hullname + " hull.", Mod.CurrentFileName, rec)); + continue; + } + hull.TemplateParameters = rec.Parameters; + hull.ModID = rec.Get("ID", hull); + hull.Name = hullname; + mod.Hulls.Add(hull); + + hull.ShortName = rec.Get("Short Name", hull); + hull.Description = rec.Get("Description", hull); + hull.Code = rec.Get("Code", hull); + + var bitmapfields = rec.Fields.Where(f => f.Name.EndsWith("Bitmap Name")); + foreach (var f in bitmapfields) + { + hull.PictureNames.Add(f.Value); + } + + hull.Size = rec.Get("Tonnage", hull); + + foreach (var costfield in rec.Fields.Where(cf => cf.Name.StartsWith("Cost "))) + hull.Cost[Resource.Find(costfield.Name.Substring("Cost ".Length))] = costfield.CreateFormula(hull); + + hull.ThrustPerMove = rec.Get("Engines Per Move", hull); + + foreach (var tr in RequirementLoader.LoadEmpireRequirements(rec, hull, RequirementType.Unlock)) + hull.UnlockRequirements.Add(tr); + + // TODO - build and use requirements + + foreach (var abil in AbilityLoader.Load(Filename, rec, hull)) + hull.Abilities.Add(abil); + + hull.NeedsBridge = rec.Get("Requirement Must Have Bridge", hull); + hull.CanUseAuxiliaryControl = rec.Get("Requirement Can Have Aux Con", hull); + hull.MinLifeSupport = rec.Get("Requirement Min Life Support", hull); + hull.MinCrewQuarters = rec.Get("Requirement Min Crew Quarters", hull); + hull.MaxEngines = rec.Get("Requirement Max Engines", hull); + hull.MinPercentFighterBays = rec.Get("Requirement Pct Fighter Bays", hull); + hull.MinPercentColonyModules = rec.Get("Requirement Pct Colony Mods", hull); + hull.MinPercentCargoBays = rec.Get("Requirement Pct Cargo", hull); + + yield return hull; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/ILoader.cs b/FrEee.Core/Modding/Loaders/ILoader.cs similarity index 95% rename from FrEee/Modding/Loaders/ILoader.cs rename to FrEee.Core/Modding/Loaders/ILoader.cs index 6d51f22b1..8a6dc234d 100644 --- a/FrEee/Modding/Loaders/ILoader.cs +++ b/FrEee.Core/Modding/Loaders/ILoader.cs @@ -1,20 +1,20 @@ -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads mod data. -/// -public interface ILoader -{ - string FileName { get; set; } - - string ModPath { get; set; } - - /// - /// Loads mod data. - /// - /// The mod we are loading data into. - /// Any mod objects which need IDs generated. - IEnumerable Load(Mod mod); +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads mod data. +/// +public interface ILoader +{ + string FileName { get; set; } + + string ModPath { get; set; } + + /// + /// Loads mod data. + /// + /// The mod we are loading data into. + /// Any mod objects which need IDs generated. + IEnumerable Load(Mod mod); } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/ModInfoLoader.cs b/FrEee.Core/Modding/Loaders/ModInfoLoader.cs similarity index 95% rename from FrEee/Modding/Loaders/ModInfoLoader.cs rename to FrEee.Core/Modding/Loaders/ModInfoLoader.cs index 7fd90d22c..19f8f7a50 100644 --- a/FrEee/Modding/Loaders/ModInfoLoader.cs +++ b/FrEee.Core/Modding/Loaders/ModInfoLoader.cs @@ -1,117 +1,117 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads modinfo.txt. -/// -public class ModInfoLoader : ILoader -{ - public ModInfoLoader(string modPath) - { - ModPath = modPath; - FileName = "MODINFO.TXT"; - } - - /// - /// The file name to read from. - /// Note that ModInfoLoader will load from the mod root folder, not from the data folder. - /// - public string FileName { get; set; } - - /// - /// The mod path, or null to use stock. - /// - public string ModPath { get; set; } - - public IEnumerable Load(Mod mod) - { - if (mod.Info == null) - mod.Info = new ModInfo(); - mod.Info.Folder = ModPath; - - string filepath; - if (ModPath == null) - filepath = FileName; - else - filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", ModPath, FileName); - if (!File.Exists(filepath)) - { - mod.Info.Name = ModPath ?? "Stock"; - mod.Info.Version = "(Unknown)"; - mod.Info.Author = "(Unknown)"; - mod.Info.Email = "(Unknown)"; - mod.Info.Website = "(Unknown)"; - mod.Info.Description = "(This mod does not have a MODINFO.TXT)"; - } - else - { - IEnumerable lines = File.ReadAllLines(filepath); - lines = lines.Skip(1); // skip Modinfo2 line - string curField = null; - foreach (var line in lines) - { - if (curField == null) - { - if (line == "Obsolete:-") - curField = "Obsolete"; - else if (line == "ModName:-") - curField = "ModName"; - else if (line == "Version:-") - curField = "Version"; - else if (line == "Author:-") - curField = "Author"; - else if (line == "EMail:-") - curField = "EMail"; - else if (line == "Website:-") - curField = "Website"; - else if (line == "Description:-") - curField = "Description"; - } - else if (curField == "Obsolete") - { - bool isObsolete; - bool.TryParse(line, out isObsolete); - mod.Info.IsObsolete = isObsolete; - curField = null; - } - else if (curField == "ModName") - { - mod.Info.Name = line; - curField = null; - } - else if (curField == "Version") - { - mod.Info.Version = line; - curField = null; - } - else if (curField == "Author") - { - mod.Info.Author = line; - curField = null; - } - else if (curField == "EMail") - { - mod.Info.Email = line; - curField = null; - } - else if (curField == "Website") - { - mod.Info.Website = line; - curField = null; - } - else if (curField == "Description") - { - if (!string.IsNullOrEmpty(mod.Info.Description)) - mod.Info.Description += '\n'; - mod.Info.Description += line; - } - } - } - - return Enumerable.Empty(); - } +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads modinfo.txt. +/// +public class ModInfoLoader : ILoader +{ + public ModInfoLoader(string modPath) + { + ModPath = modPath; + FileName = "MODINFO.TXT"; + } + + /// + /// The file name to read from. + /// Note that ModInfoLoader will load from the mod root folder, not from the data folder. + /// + public string FileName { get; set; } + + /// + /// The mod path, or null to use stock. + /// + public string ModPath { get; set; } + + public IEnumerable Load(Mod mod) + { + if (mod.Info == null) + mod.Info = new ModInfo(); + mod.Info.Folder = ModPath; + + string filepath; + if (ModPath == null) + filepath = FileName; + else + filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", ModPath, FileName); + if (!File.Exists(filepath)) + { + mod.Info.Name = ModPath ?? "Stock"; + mod.Info.Version = "(Unknown)"; + mod.Info.Author = "(Unknown)"; + mod.Info.Email = "(Unknown)"; + mod.Info.Website = "(Unknown)"; + mod.Info.Description = "(This mod does not have a MODINFO.TXT)"; + } + else + { + IEnumerable lines = File.ReadAllLines(filepath); + lines = lines.Skip(1); // skip Modinfo2 line + string curField = null; + foreach (var line in lines) + { + if (curField == null) + { + if (line == "Obsolete:-") + curField = "Obsolete"; + else if (line == "ModName:-") + curField = "ModName"; + else if (line == "Version:-") + curField = "Version"; + else if (line == "Author:-") + curField = "Author"; + else if (line == "EMail:-") + curField = "EMail"; + else if (line == "Website:-") + curField = "Website"; + else if (line == "Description:-") + curField = "Description"; + } + else if (curField == "Obsolete") + { + bool isObsolete; + bool.TryParse(line, out isObsolete); + mod.Info.IsObsolete = isObsolete; + curField = null; + } + else if (curField == "ModName") + { + mod.Info.Name = line; + curField = null; + } + else if (curField == "Version") + { + mod.Info.Version = line; + curField = null; + } + else if (curField == "Author") + { + mod.Info.Author = line; + curField = null; + } + else if (curField == "EMail") + { + mod.Info.Email = line; + curField = null; + } + else if (curField == "Website") + { + mod.Info.Website = line; + curField = null; + } + else if (curField == "Description") + { + if (!string.IsNullOrEmpty(mod.Info.Description)) + mod.Info.Description += '\n'; + mod.Info.Description += line; + } + } + } + + return Enumerable.Empty(); + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/ModSettingsLoader.cs b/FrEee.Core/Modding/Loaders/ModSettingsLoader.cs similarity index 97% rename from FrEee/Modding/Loaders/ModSettingsLoader.cs rename to FrEee.Core/Modding/Loaders/ModSettingsLoader.cs index 668c19744..cb93a877d 100644 --- a/FrEee/Modding/Loaders/ModSettingsLoader.cs +++ b/FrEee.Core/Modding/Loaders/ModSettingsLoader.cs @@ -1,123 +1,123 @@ -using FrEee.Objects.Civilization; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads mod settings from Settings.txt. -/// -public class ModSettingsLoader : DataFileLoader -{ - public ModSettingsLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "Settings.txt"; - - public override IEnumerable Load(Mod mod) - { - var rec = DataFile.Records.FirstOrDefault(); - if (rec == null) - { - Mod.Errors.Add(new DataParsingException("Could not load Settings.txt - no record found.", Filename)); - yield break; - } - - var settings = new ModSettings(); - mod.Settings = settings; - - // TODO - load more settings - - settings.ScrapFacilityReturnRate = rec.Get("Scrap Facility Percent Returned", null) ?? 30; - settings.ScrapUnitReturnRate = rec.Get("Scrap Unit Percent Returned", null) ?? 30; - settings.ScrapShipOrBaseReturnRate = rec.Get("Scrap Ship Percent Returned", null) ?? 30; - - // TODO - load more settings - - settings.StartTradePercent = rec.Get("Starting Trade Percentage", null) ?? 0; - settings.TradePercentPerTurn = rec.Get("Trade Percentage Increase Per Turn", null) ?? 1; - settings.MaxTradePercent = rec.Get("Maximum Trade Percentage", null) ?? 20; - settings.CooperativeResearchBreakthroughChance = rec.Get("Cooperative Research Breakthrough Chance", null) ?? 5; - - // TODO - load more settings - - settings.UpgradeFacilityPercentCost = rec.Get("Upgrade Facility Percent Cost", null) ?? 50; - - // TODO - load more settings - - // event frequency is really per mille per player per turn but silly aaron said it was percent :P - settings.EventFrequencyLow = rec.Get("Event Percent Chance Low") ?? 5; - settings.EventFrequencyMedium = rec.Get("Event Percent Chance Medium") ?? 109; - settings.EventFrequencyHigh = rec.Get("Event Percent Chance High") ?? 25; - settings.MaintenanceDeficitToDestroyOneShip = rec.Get("Maintenance Cost Amt Per Dead", null) ?? 20000; - settings.ShipBaseMaintenanceRate = rec.Get("Empire Ship And Base Percent Maint Cost", null) ?? rec.Get("Empire Starting Percent Maint Cost", null); - settings.UnitMaintenanceRate = rec.Get("Empire Unit Percent Maint Cost", null) ?? 0; - settings.FacilityMaintenanceRate = rec.Get("Empire Facility Percent Maint Cost", null) ?? 0; - - // TODO - load more settings - - settings.PopulationPerMilitia = rec.Get("Defending Units Per Population", null) ?? 20; // yes, Aaron did say units per pop but it's really pops per unit! - settings.MilitiaFirepower = rec.Get("Population Defender Attack Strength") ?? 10; - settings.MilitiaHitpoints = rec.Get("Population Defender Hit Points") ?? 30; - - // TODO - load more settings - - - settings.Reproduction = rec.Get("Empire Starting Percent Reproduction", null) ?? 10; - settings.ReproductionMultiplier = rec.Get("Reproduction Multiplier", null) ?? 0.1; - - // TODO - load more settings - - settings.PopulationFactor = rec.Get("Population Factor", null) ?? (int)1e6; // specifies unit of population for other settings - settings.PopulationHitpoints = (rec.Get("Damage Points To Kill One Population", null) ?? 10).Value / settings.PopulationFactor; - - // TODO - load more settings - - settings.PopulationModifiers = new SortedDictionary(PopulationModifierLoader.Load(rec).ToDictionary(pm => pm.PopulationAmount)); - - // TODO - load more settings - - // load aptitudes - foreach (var a in Aptitude.All) - { - a.MinPercent = rec.Get("Characteristic " + a.Name + " Min Pct", null); - a.MaxPercent = rec.Get("Characteristic " + a.Name + " Max Pct", null); - a.Cost = rec.Get("Characteristic " + a.Name + " Pct Cost", null); - a.Threshold = rec.Get("Characteristic " + a.Name + " Threshold", null); - a.LowCost = rec.Get("Characteristic " + a.Name + " Threshhold Pct Cost Neg", null); - a.HighCost = rec.Get("Characteristic " + a.Name + " Threshhold Pct Cost Pos", null); - } - - // load mood modifiers - foreach (var mood in new Mood[] { Mood.Riot, Mood.Angry, Mood.Unhappy, Mood.Indifferent, Mood.Happy, Mood.Jubilant }) - settings.MoodProductivityModifiers.Add(mood, rec.Get($"Mood {mood} Modifier")); - settings.MoodProductivityModifiers.Add(Mood.Emotionless, rec.Get("Mood Emotionless Modifier") ?? settings.MoodProductivityModifiers[Mood.Happy]); - - // TODO - load more settings - - settings.WeaponAccuracyPointBlank = rec.Get("Combat Base To Hit Value", null) ?? 100; - settings.WeaponAccuracyLossPerSquare = rec.Get("Combat To Hit Modifier Per Square Distance", null) ?? 10; - - // TODO - load more settings - - settings.SpaceCombatTurns = rec.Get("Number Of Space Combat Turns", null) ?? 30; - settings.GroundCombatTurns = rec.Get("Number Of Ground Combat Turns", null) ?? 10; - settings.CombatSpeedPercentPerStrategicSpeed = rec.Get("Combat Speed Percent Per Strategic Speed", null) ?? 50; - - // TODO - load more settings - - settings.PopulationSize = (double)(rec.Get("Population Mass", null) ?? 5) / settings.PopulationFactor; - settings.ReproductionFrequency = rec.Get("Reproduction Check Frequency", null) ?? 1; // TODO - change property name to ReproductionFrequency - settings.ValueChangeFrequency = rec.Get("Value Change Frequency", null) ?? 10; - - // TODO - load more settings - - settings.SeekerEvasion = rec.Get("Seeker Combat Defense Modifier"); - settings.PlanetAccuracy = rec.Get("Planet Combat Offense Modifier"); - settings.PlanetEvasion = rec.Get("Planet Combat Defense Modifier"); - - yield break; - } +using FrEee.Objects.Civilization; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads mod settings from Settings.txt. +/// +public class ModSettingsLoader : DataFileLoader +{ + public ModSettingsLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "Settings.txt"; + + public override IEnumerable Load(Mod mod) + { + var rec = DataFile.Records.FirstOrDefault(); + if (rec == null) + { + Mod.Errors.Add(new DataParsingException("Could not load Settings.txt - no record found.", Filename)); + yield break; + } + + var settings = new ModSettings(); + mod.Settings = settings; + + // TODO - load more settings + + settings.ScrapFacilityReturnRate = rec.Get("Scrap Facility Percent Returned", null) ?? 30; + settings.ScrapUnitReturnRate = rec.Get("Scrap Unit Percent Returned", null) ?? 30; + settings.ScrapShipOrBaseReturnRate = rec.Get("Scrap Ship Percent Returned", null) ?? 30; + + // TODO - load more settings + + settings.StartTradePercent = rec.Get("Starting Trade Percentage", null) ?? 0; + settings.TradePercentPerTurn = rec.Get("Trade Percentage Increase Per Turn", null) ?? 1; + settings.MaxTradePercent = rec.Get("Maximum Trade Percentage", null) ?? 20; + settings.CooperativeResearchBreakthroughChance = rec.Get("Cooperative Research Breakthrough Chance", null) ?? 5; + + // TODO - load more settings + + settings.UpgradeFacilityPercentCost = rec.Get("Upgrade Facility Percent Cost", null) ?? 50; + + // TODO - load more settings + + // event frequency is really per mille per player per turn but silly aaron said it was percent :P + settings.EventFrequencyLow = rec.Get("Event Percent Chance Low") ?? 5; + settings.EventFrequencyMedium = rec.Get("Event Percent Chance Medium") ?? 109; + settings.EventFrequencyHigh = rec.Get("Event Percent Chance High") ?? 25; + settings.MaintenanceDeficitToDestroyOneShip = rec.Get("Maintenance Cost Amt Per Dead", null) ?? 20000; + settings.ShipBaseMaintenanceRate = rec.Get("Empire Ship And Base Percent Maint Cost", null) ?? rec.Get("Empire Starting Percent Maint Cost", null); + settings.UnitMaintenanceRate = rec.Get("Empire Unit Percent Maint Cost", null) ?? 0; + settings.FacilityMaintenanceRate = rec.Get("Empire Facility Percent Maint Cost", null) ?? 0; + + // TODO - load more settings + + settings.PopulationPerMilitia = rec.Get("Defending Units Per Population", null) ?? 20; // yes, Aaron did say units per pop but it's really pops per unit! + settings.MilitiaFirepower = rec.Get("Population Defender Attack Strength") ?? 10; + settings.MilitiaHitpoints = rec.Get("Population Defender Hit Points") ?? 30; + + // TODO - load more settings + + + settings.Reproduction = rec.Get("Empire Starting Percent Reproduction", null) ?? 10; + settings.ReproductionMultiplier = rec.Get("Reproduction Multiplier", null) ?? 0.1; + + // TODO - load more settings + + settings.PopulationFactor = rec.Get("Population Factor", null) ?? (int)1e6; // specifies unit of population for other settings + settings.PopulationHitpoints = (rec.Get("Damage Points To Kill One Population", null) ?? 10).Value / settings.PopulationFactor; + + // TODO - load more settings + + settings.PopulationModifiers = new SortedDictionary(PopulationModifierLoader.Load(rec).ToDictionary(pm => pm.PopulationAmount)); + + // TODO - load more settings + + // load aptitudes + foreach (var a in Aptitude.All) + { + a.MinPercent = rec.Get("Characteristic " + a.Name + " Min Pct", null); + a.MaxPercent = rec.Get("Characteristic " + a.Name + " Max Pct", null); + a.Cost = rec.Get("Characteristic " + a.Name + " Pct Cost", null); + a.Threshold = rec.Get("Characteristic " + a.Name + " Threshold", null); + a.LowCost = rec.Get("Characteristic " + a.Name + " Threshhold Pct Cost Neg", null); + a.HighCost = rec.Get("Characteristic " + a.Name + " Threshhold Pct Cost Pos", null); + } + + // load mood modifiers + foreach (var mood in new Mood[] { Mood.Riot, Mood.Angry, Mood.Unhappy, Mood.Indifferent, Mood.Happy, Mood.Jubilant }) + settings.MoodProductivityModifiers.Add(mood, rec.Get($"Mood {mood} Modifier")); + settings.MoodProductivityModifiers.Add(Mood.Emotionless, rec.Get("Mood Emotionless Modifier") ?? settings.MoodProductivityModifiers[Mood.Happy]); + + // TODO - load more settings + + settings.WeaponAccuracyPointBlank = rec.Get("Combat Base To Hit Value", null) ?? 100; + settings.WeaponAccuracyLossPerSquare = rec.Get("Combat To Hit Modifier Per Square Distance", null) ?? 10; + + // TODO - load more settings + + settings.SpaceCombatTurns = rec.Get("Number Of Space Combat Turns", null) ?? 30; + settings.GroundCombatTurns = rec.Get("Number Of Ground Combat Turns", null) ?? 10; + settings.CombatSpeedPercentPerStrategicSpeed = rec.Get("Combat Speed Percent Per Strategic Speed", null) ?? 50; + + // TODO - load more settings + + settings.PopulationSize = (double)(rec.Get("Population Mass", null) ?? 5) / settings.PopulationFactor; + settings.ReproductionFrequency = rec.Get("Reproduction Check Frequency", null) ?? 1; // TODO - change property name to ReproductionFrequency + settings.ValueChangeFrequency = rec.Get("Value Change Frequency", null) ?? 10; + + // TODO - load more settings + + settings.SeekerEvasion = rec.Get("Seeker Combat Defense Modifier"); + settings.PlanetAccuracy = rec.Get("Planet Combat Offense Modifier"); + settings.PlanetEvasion = rec.Get("Planet Combat Defense Modifier"); + + yield break; + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/MountLoader.cs b/FrEee.Core/Modding/Loaders/MountLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/MountLoader.cs rename to FrEee.Core/Modding/Loaders/MountLoader.cs index 51724fc6c..e4780470c 100644 --- a/FrEee/Modding/Loaders/MountLoader.cs +++ b/FrEee.Core/Modding/Loaders/MountLoader.cs @@ -1,64 +1,65 @@ -using FrEee.Objects.Technology; -using FrEee.Extensions; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.Vehicles; -using FrEee.Objects.Combat; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads mounts from CompEnhancement.txt. -/// -public class MountLoader : DataFileLoader -{ - public MountLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "CompEnhancement.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var m = new Mount(); - m.TemplateParameters = rec.Parameters; - mod.Mounts.Add(m); - - m.ModID = rec.Get("ID", m); - m.Name = rec.Get("Long Name", m); - m.ShortName = rec.Get("Short Name", m) ?? m.Name; // default to long name - m.Description = rec.Get("Description", m); - m.Code = rec.Get("Code", m); - m.PictureName = rec.Get("Pic", m); - m.CostPercent = rec.Get("Cost Percent", m) ?? 100; - m.SizePercent = rec.Get("Tonnage Percent", m) ?? 100; - m.DurabilityPercent = rec.Get("Tonnage Structure Percent", m) ?? 100; - m.WeaponDamagePercent = rec.Get("Damage Percent", m) ?? 100; - m.SupplyUsagePercent = rec.Get("Supply Percent", m) ?? 100; - m.WeaponRangeModifier = rec.Get("Range Modifier", m) ?? 0; - m.WeaponAccuracyModifier = rec.Get("Weapon To Hit Modifier", m) ?? 0; - m.MinimumVehicleSize = rec.Get("Vehicle Size Minimum", m); - m.MaximumVehicleSize = rec.Get("Vehicle Size Maximum", m); - m.RequiredComponentFamily = rec.Get(new string[] { "Comp Family Requirement", "Component Family Requirement", "Comp Family", "Component Family" }, m); - var wtstring = rec.Get(new string[] { "Weapon Type Requirement", "Weapon Type" }, m); - if (wtstring == null) - m.WeaponTypes = WeaponTypes.AnyComponent; - else - m.WeaponTypes = wtstring.Value.Capitalize().ParseEnum(); - var vtstring = rec.Get(new string[] { "Vehicle Type", "Vehicle Type Requirement" }, m); - if (vtstring == null) - m.VehicleTypes = VehicleTypes.All; - else - m.VehicleTypes = vtstring.Value.Capitalize().ParseEnum(); - m.AbilityPercentages = AbilityLoader.LoadPercentagesOrModifiers(rec, "Percent", m); - m.AbilityModifiers = AbilityLoader.LoadPercentagesOrModifiers(rec, "Modifier", m); - m.UnlockRequirements = RequirementLoader.LoadEmpireRequirements(rec, m, RequirementType.Unlock).ToList(); - // TODO - build and use requirements - - yield return m; - } - } +using FrEee.Objects.Technology; +using FrEee.Extensions; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.Vehicles; +using FrEee.Extensions; +using FrEee.Processes.Combat; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads mounts from CompEnhancement.txt. +/// +public class MountLoader : DataFileLoader +{ + public MountLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "CompEnhancement.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var m = new Mount(); + m.TemplateParameters = rec.Parameters; + mod.Mounts.Add(m); + + m.ModID = rec.Get("ID", m); + m.Name = rec.Get("Long Name", m); + m.ShortName = rec.Get("Short Name", m) ?? m.Name; // default to long name + m.Description = rec.Get("Description", m); + m.Code = rec.Get("Code", m); + m.PictureName = rec.Get("Pic", m); + m.CostPercent = rec.Get("Cost Percent", m) ?? 100; + m.SizePercent = rec.Get("Tonnage Percent", m) ?? 100; + m.DurabilityPercent = rec.Get("Tonnage Structure Percent", m) ?? 100; + m.WeaponDamagePercent = rec.Get("Damage Percent", m) ?? 100; + m.SupplyUsagePercent = rec.Get("Supply Percent", m) ?? 100; + m.WeaponRangeModifier = rec.Get("Range Modifier", m) ?? 0; + m.WeaponAccuracyModifier = rec.Get("Weapon To Hit Modifier", m) ?? 0; + m.MinimumVehicleSize = rec.Get("Vehicle Size Minimum", m); + m.MaximumVehicleSize = rec.Get("Vehicle Size Maximum", m); + m.RequiredComponentFamily = rec.Get(new string[] { "Comp Family Requirement", "Component Family Requirement", "Comp Family", "Component Family" }, m); + var wtstring = rec.Get(new string[] { "Weapon Type Requirement", "Weapon Type" }, m); + if (wtstring == null) + m.WeaponTypes = WeaponTypes.AnyComponent; + else + m.WeaponTypes = wtstring.Value.Capitalize().ParseEnum(); + var vtstring = rec.Get(new string[] { "Vehicle Type", "Vehicle Type Requirement" }, m); + if (vtstring == null) + m.VehicleTypes = VehicleTypes.All; + else + m.VehicleTypes = vtstring.Value.Capitalize().ParseEnum(); + m.AbilityPercentages = AbilityLoader.LoadPercentagesOrModifiers(rec, "Percent", m); + m.AbilityModifiers = AbilityLoader.LoadPercentagesOrModifiers(rec, "Modifier", m); + m.UnlockRequirements = RequirementLoader.LoadEmpireRequirements(rec, m, RequirementType.Unlock).ToList(); + // TODO - build and use requirements + + yield return m; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/PopulationModifierLoader.cs b/FrEee.Core/Modding/Loaders/PopulationModifierLoader.cs similarity index 97% rename from FrEee/Modding/Loaders/PopulationModifierLoader.cs rename to FrEee.Core/Modding/Loaders/PopulationModifierLoader.cs index cd11956d0..9acc59bfc 100644 --- a/FrEee/Modding/Loaders/PopulationModifierLoader.cs +++ b/FrEee.Core/Modding/Loaders/PopulationModifierLoader.cs @@ -1,31 +1,31 @@ -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads population modifiers from a record. -/// -public static class PopulationModifierLoader -{ - /// - /// Loads population modifiers from a record. - /// - /// - public static IEnumerable Load(Record rec) - { - int count = 0; - int start = 0; - while (true) - { - count++; - var pfield = rec.FindField(new string[] { "Pop Modifier " + count + " Population Amount", "Pop Modifier Population Amount" }, ref start, false, start, true); - if (pfield == null) - break; // no more pop modifiers - var popmod = new PopulationModifier(); - popmod.PopulationAmount = pfield.CreateFormula(null).Value * Mod.Current.Settings.PopulationFactor; - popmod.ProductionRate = rec.Get(new string[] { "Pop Modifier " + count + " Production Modifier Percent", "Pop Modifier Production Modifier Percent" }, popmod); - popmod.ConstructionRate = rec.Get(new string[] { "Pop Modifier " + count + " SY Rate Modifier Percent", "Pop Modifier SY Rate Modifier Percent" }, popmod); // this actually affects all queues, not just SY queues - yield return popmod; - } - } +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads population modifiers from a record. +/// +public static class PopulationModifierLoader +{ + /// + /// Loads population modifiers from a record. + /// + /// + public static IEnumerable Load(Record rec) + { + int count = 0; + int start = 0; + while (true) + { + count++; + var pfield = rec.FindField(new string[] { "Pop Modifier " + count + " Population Amount", "Pop Modifier Population Amount" }, ref start, false, start, true); + if (pfield == null) + break; // no more pop modifiers + var popmod = new PopulationModifier(); + popmod.PopulationAmount = pfield.CreateFormula(null).Value * Mod.Current.Settings.PopulationFactor; + popmod.ProductionRate = rec.Get(new string[] { "Pop Modifier " + count + " Production Modifier Percent", "Pop Modifier Production Modifier Percent" }, popmod); + popmod.ConstructionRate = rec.Get(new string[] { "Pop Modifier " + count + " SY Rate Modifier Percent", "Pop Modifier SY Rate Modifier Percent" }, popmod); // this actually affects all queues, not just SY queues + yield return popmod; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/RequirementLoader.cs b/FrEee.Core/Modding/Loaders/RequirementLoader.cs similarity index 97% rename from FrEee/Modding/Loaders/RequirementLoader.cs rename to FrEee.Core/Modding/Loaders/RequirementLoader.cs index 3b9a57301..1ac4d416e 100644 --- a/FrEee/Modding/Loaders/RequirementLoader.cs +++ b/FrEee.Core/Modding/Loaders/RequirementLoader.cs @@ -1,50 +1,50 @@ -using FrEee.Objects.Civilization; -using FrEee.Objects.Technology; -using FrEee.Extensions; -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads technology requirements from a record. -/// -public static class RequirementLoader -{ - /// - /// Loads requirements from a record. - /// - /// - public static IEnumerable> LoadEmpireRequirements(Record rec, IResearchable r, RequirementType rtype) - { - int count = 0; - int start = 0; - if (rtype == RequirementType.Unlock) - { - while (true) - { - count++; - var nfield = rec.FindField(new string[] { "Tech Area Req " + count, "Tech Area Req" }, ref start, false, start, true); - if (nfield == null) - break; // no more tech requirements - var lfield = rec.FindField(new string[] { "Tech Level Req " + count, "Tech Level Req" }, ref start, false, start, true); - var techname = nfield.CreateFormula(r).Value; - var levelFormula = lfield?.CreateFormula(r) ?? 1; - var tech = Mod.Current.Technologies.FindByName(techname); - if (tech == null) - Mod.Errors.Add(new DataParsingException("Could not find a technology named " + techname + ".", Mod.CurrentFileName, rec)); - else - yield return new TechnologyRequirement(r, tech, levelFormula); - } - } - start = 0; - while (true) - { - var reqfield = rec.FindField(rtype + " Requirement", ref start, false, start); - if (reqfield == null) - break; - var descfield = rec.FindField(rtype + " Requirement Description", ref start, false, start); - var desc = descfield == null ? (Formula)reqfield.Value : descfield.CreateFormula(r); - yield return new ScriptRequirement(reqfield.CreateFormula(r), desc); - } - } +using FrEee.Objects.Civilization; +using FrEee.Objects.Technology; +using FrEee.Extensions; +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads technology requirements from a record. +/// +public static class RequirementLoader +{ + /// + /// Loads requirements from a record. + /// + /// + public static IEnumerable> LoadEmpireRequirements(Record rec, IResearchable r, RequirementType rtype) + { + int count = 0; + int start = 0; + if (rtype == RequirementType.Unlock) + { + while (true) + { + count++; + var nfield = rec.FindField(new string[] { "Tech Area Req " + count, "Tech Area Req" }, ref start, false, start, true); + if (nfield == null) + break; // no more tech requirements + var lfield = rec.FindField(new string[] { "Tech Level Req " + count, "Tech Level Req" }, ref start, false, start, true); + var techname = nfield.CreateFormula(r).Value; + var levelFormula = lfield?.CreateFormula(r) ?? 1; + var tech = Mod.Current.Technologies.FindByName(techname); + if (tech == null) + Mod.Errors.Add(new DataParsingException("Could not find a technology named " + techname + ".", Mod.CurrentFileName, rec)); + else + yield return new TechnologyRequirement(r, tech, levelFormula); + } + } + start = 0; + while (true) + { + var reqfield = rec.FindField(rtype + " Requirement", ref start, false, start); + if (reqfield == null) + break; + var descfield = rec.FindField(rtype + " Requirement Description", ref start, false, start); + var desc = descfield == null ? (Formula)reqfield.Value : descfield.CreateFormula(r); + yield return new ScriptRequirement(reqfield.CreateFormula(r), desc); + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/ScriptLoader.cs b/FrEee.Core/Modding/Loaders/ScriptLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/ScriptLoader.cs rename to FrEee.Core/Modding/Loaders/ScriptLoader.cs index c935e9161..b42d9982c 100644 --- a/FrEee/Modding/Loaders/ScriptLoader.cs +++ b/FrEee.Core/Modding/Loaders/ScriptLoader.cs @@ -1,66 +1,66 @@ -using System.Collections.Generic; -using System.IO; -using System.Reflection; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads the mod's general purpose scripts (not AI scripts). -/// -public class ScriptLoader : ILoader -{ - public ScriptLoader(string modPath) - { - ModPath = modPath; - FileName = "*.py"; - } - - public string FileName - { - get; - set; - } - - public string ModPath - { - get; - set; - } - - public IEnumerable Load(Mod mod) - { - // TODO - should scripts be mod objects? - { - var name = "builtins"; - string filename; - string stockFilename = filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Scripts", name); - if (ModPath == null) - filename = stockFilename; - else - filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Mods", ModPath, "Scripts", name); - mod.GlobalScript = PythonScript.Load(filename) ?? PythonScript.Load(stockFilename) ?? new PythonScript(name, ""); - } - { - var name = "GameInit"; - string filename; - string stockFilename = filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Scripts", name); - if (ModPath == null) - filename = stockFilename; - else - filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Mods", ModPath, "Scripts", name); - mod.GameInitScript = PythonScript.Load(filename) ?? PythonScript.Load(stockFilename) ?? new PythonScript(name, ""); - } - { - var name = "EndTurn"; - string filename; - string stockFilename = filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Scripts", name); - if (ModPath == null) - filename = stockFilename; - else - filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Mods", ModPath, "Scripts", name); - mod.EndTurnScript = PythonScript.Load(filename) ?? PythonScript.Load(stockFilename) ?? new PythonScript(name, ""); - } - - yield break; - } +using System.Collections.Generic; +using System.IO; +using System.Reflection; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads the mod's general purpose scripts (not AI scripts). +/// +public class ScriptLoader : ILoader +{ + public ScriptLoader(string modPath) + { + ModPath = modPath; + FileName = "*.py"; + } + + public string FileName + { + get; + set; + } + + public string ModPath + { + get; + set; + } + + public IEnumerable Load(Mod mod) + { + // TODO - should scripts be mod objects? + { + var name = "builtins"; + string filename; + string stockFilename = filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Scripts", name); + if (ModPath == null) + filename = stockFilename; + else + filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Mods", ModPath, "Scripts", name); + mod.GlobalScript = PythonScript.Load(filename) ?? PythonScript.Load(stockFilename) ?? new PythonScript(name, ""); + } + { + var name = "GameInit"; + string filename; + string stockFilename = filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Scripts", name); + if (ModPath == null) + filename = stockFilename; + else + filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Mods", ModPath, "Scripts", name); + mod.GameInitScript = PythonScript.Load(filename) ?? PythonScript.Load(stockFilename) ?? new PythonScript(name, ""); + } + { + var name = "EndTurn"; + string filename; + string stockFilename = filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Scripts", name); + if (ModPath == null) + filename = stockFilename; + else + filename = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Mods", ModPath, "Scripts", name); + mod.EndTurnScript = PythonScript.Load(filename) ?? PythonScript.Load(stockFilename) ?? new PythonScript(name, ""); + } + + yield break; + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/StarSystemLoader.cs b/FrEee.Core/Modding/Loaders/StarSystemLoader.cs similarity index 97% rename from FrEee/Modding/Loaders/StarSystemLoader.cs rename to FrEee.Core/Modding/Loaders/StarSystemLoader.cs index 496246b97..1ee14ceff 100644 --- a/FrEee/Modding/Loaders/StarSystemLoader.cs +++ b/FrEee.Core/Modding/Loaders/StarSystemLoader.cs @@ -1,416 +1,417 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Space; -using FrEee.Modding.StellarObjectLocations; -using FrEee.Modding.Templates; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using Size = FrEee.Objects.Space.StellarSize; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads star system templates from SystemTypes.txt. -/// -[Serializable] -public class StarSystemLoader : DataFileLoader -{ - public StarSystemLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "SystemTypes.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var sst = new StarSystemTemplate(null); - sst.TemplateParameters = rec.Parameters; - string temp; - int index = -1; - - sst.ModID = rec.Get("ID", sst); - rec.TryFindFieldValue("Name", out temp, ref index, Mod.Errors, 0, true); - sst.Name = temp; - mod.StarSystemTemplates.Add(sst); - - rec.TryFindFieldValue("Description", out temp, ref index, Mod.Errors, 0, true); - sst.Description = temp; - - sst.Radius = rec.Get("Radius") ?? 6; - - rec.TryFindFieldValue("Background Bitmap", out temp, ref index, Mod.Errors, 0, true); - sst.BackgroundImagePath = Path.GetFileNameWithoutExtension(temp); // so we can use PNG when SE4 specifies BMP files - - rec.TryFindFieldValue("Empires Can Start In", out temp, ref index, Mod.Errors, 0, true); - sst.EmpiresCanStartIn = bool.Parse(temp); - - rec.TryFindFieldValue("Non-Tiled Center Pic", out temp, ref index, Mod.Errors, 0, true); - sst.NonTiledCenterCombatImage = bool.Parse(temp); - - foreach (var abil in AbilityLoader.Load(Filename, rec, sst)) - sst.Abilities.Add(abil); - - sst.WarpPointAbilities = Mod.Current.StellarAbilityTemplates.FindByName(rec.Get("WP Stellar Abil Type", sst)); - - int count = 0; - int start = 0; - while (true) - { - count++; - string sobjtype; - string pos; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Physical Type", "Obj Physical Type" }, out temp, ref start, null, start, true)) - break; // couldn't load next stellar object template - else - sobjtype = temp; - start++; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Position", "Obj Position" }, out temp, ref start, null, start)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Position\" field.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - pos = temp; - start++; - - ITemplate sobjTemplate; - if (sobjtype == "Star" || sobjtype == "Destroyed Star") - { - var template = new StarTemplate(); - - if (sobjtype == "DestroyedStar") - template.IsDestroyed = true; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Stellar Abil Type", "Obj Stellar Abil Type" }, out temp, ref start, null, start, true)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Stellar Abil Type\" field for star.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - { - template.Abilities = mod.StellarAbilityTemplates.FindByName(temp); - if (template.Abilities == null) - { - template.Abilities = new RandomAbilityTemplate(); - yield return template.Abilities; - Mod.Errors.Add(new DataParsingException("Could not find stellar ability type \"" + temp + "\" in StellarAbilityTypes.txt.", Mod.CurrentFileName, rec)); - } - } - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Size", "Obj Size" }, out temp, ref start, null, start, true)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Size\" field for star.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - { - if (temp == "Any") - template.StellarSize = null; - else - { - try - { - template.StellarSize = temp.ParseEnum(); - } - catch (ArgumentException ex) - { - Mod.Errors.Add(new DataParsingException("Invalid stellar object size \"" + temp + "\". Must be Tiny, Small, Medium, Large, Huge, or Any.", ex, Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - } - } - start++; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Age", "Obj Age" }, out temp, ref start, null, start)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Age\" field for star.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - template.Age = temp == "Any" ? null : temp; - start++; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Color", "Obj Color" }, out temp, ref start, null, start)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Color\" field for star.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - template.Color = temp == "Any" ? null : temp; - start++; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Luminosity", "Obj Luminosity" }, out temp, ref start, null, start)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Luminosity\" field for star.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - template.Brightness = temp == "Any" ? null : temp; - start++; - - sobjTemplate = template; - } - else if (sobjtype == "Planet") - { - var template = new PlanetTemplate(); - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Stellar Abil Type", "Obj Stellar Abil Type" }, out temp, ref start, null, start, true)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Stellar Abil Type\" field for planet.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - { - template.Abilities = mod.StellarAbilityTemplates.FindByName(temp); - if (template.Abilities == null) - { - template.Abilities = new RandomAbilityTemplate(); - yield return template.Abilities; - Mod.Errors.Add(new DataParsingException("Could not find stellar ability type \"" + temp + "\" in StellarAbilityTypes.txt.", Mod.CurrentFileName, rec)); - } - } - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Size", "Obj Size" }, out temp, ref start, null, start, true)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Size\" field for planet.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - { - if (temp == "Any") - template.StellarSize = null; - else - { - try - { - template.StellarSize = temp.ParseEnum(); - } - catch (ArgumentException ex) - { - Mod.Errors.Add(new DataParsingException("Invalid stellar object size \"" + temp + "\". Must be Tiny, Small, Medium, Large, Huge, or Any.", ex, Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - } - } - start++; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Atmosphere", "Obj Atmosphere" }, out temp, ref start, null, start)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Atmosphere\" field for planet.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - template.Atmosphere = temp == "Any" ? null : temp; - start++; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Composition", "Obj Composition" }, out temp, ref start, null, start)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Composition\" field for planet.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - template.Surface = temp == "Any" ? null : temp; - start++; - - sobjTemplate = template; - } - else if (sobjtype == "Asteroids") - { - var template = new AsteroidFieldTemplate(); - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Stellar Abil Type", "Obj Stellar Abil Type" }, out temp, ref start, null, start, true)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Stellar Abil Type\" field for asteroid field.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - { - template.Abilities = mod.StellarAbilityTemplates.FindByName(temp); - if (template.Abilities == null) - { - template.Abilities = new RandomAbilityTemplate(); - yield return template.Abilities; - Mod.Errors.Add(new DataParsingException("Could not find stellar ability type \"" + temp + "\" in StellarAbilityTypes.txt.", Mod.CurrentFileName, rec)); - } - } - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Size", "Obj Size" }, out temp, ref start, null, start, true)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Size\" field for asteroid field.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - { - if (temp == "Any") - template.StellarSize = null; - else - { - try - { - template.StellarSize = (StellarSize)Enum.Parse(typeof(Size), temp); - } - catch (ArgumentException ex) - { - Mod.Errors.Add(new DataParsingException("Invalid stellar object size \"" + temp + "\". Must be Tiny, Small, Medium, Large, Huge, or Any.", ex, Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - } - } - start++; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Atmosphere", "Obj Atmosphere" }, out temp, ref start, null, start)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Atmosphere\" field for asteroid field.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - template.Atmosphere = temp == "Any" ? null : temp; - start++; - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Composition", "Obj Composition" }, out temp, ref start, null, start)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Composition\" field for asteroid field.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - template.Surface = temp == "Any" ? null : temp; - start++; - - sobjTemplate = template; - } - else if (sobjtype == "Storm") - { - var template = new StormTemplate(); - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Stellar Abil Type", "Obj Stellar Abil Type" }, out temp, ref start, null, start, true)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Stellar Abil Type\" field for storm.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - { - template.Abilities = mod.StellarAbilityTemplates.FindByName(temp); - if (template.Abilities == null) - { - template.Abilities = new RandomAbilityTemplate(); - yield return template.Abilities; - Mod.Errors.Add(new DataParsingException("Could not find stellar ability type \"" + temp + "\" in StellarAbilityTypes.txt.", Mod.CurrentFileName, rec)); - } - } - - if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Size", "Obj Size" }, out temp, ref start, null, start, true)) - { - Mod.Errors.Add(new DataParsingException("Could not find \"Obj Size\" field for storm.", Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - else - { - if (temp == "Any") - template.Size = null; - else - { - try - { - template.Size = temp.ParseEnum(); - } - catch (ArgumentException ex) - { - Mod.Errors.Add(new DataParsingException("Invalid stellar object size \"" + temp + "\". Must be Tiny, Small, Medium, Large, Huge, or Any.", ex, Mod.CurrentFileName, rec)); - continue; // skip this stellar object - } - } - } - start++; - - sobjTemplate = template; - } - else - { - Mod.Errors.Add(new DataParsingException("Invalid stellar object type \"" + sobjtype + "\". Must be Star, Planet, Asteroids, or Storm.", Mod.CurrentFileName, rec)); - continue; - } - - if (pos.StartsWith("Ring ")) - { - int ring; - if (!int.TryParse(pos.Substring("Ring ".Length), out ring)) - { - Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected integer after Ring.", Mod.CurrentFileName, rec)); - continue; - } - sst.StellarObjectLocations.Add(new RingStellarObjectLocation { Ring = ring, StellarObjectTemplate = sobjTemplate }); - } - else if (pos.StartsWith("Coord ") || pos.StartsWith("Centered Coord ")) - { - int x, y; - string coordsData; - bool isCentered = pos.StartsWith("Centered Coord "); - if (isCentered) - coordsData = pos.Substring("Centered Coord ".Length); - else - coordsData = pos.Substring("Coord ".Length); - var splitData = coordsData.Split(','); - if (splitData.Length < 2) - { - Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected two comma separated integers after Coord.", Mod.CurrentFileName, rec)); - continue; - } - if (!int.TryParse(splitData[0].Trim(), out x)) - { - Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected two comma separated integers after Coord.", Mod.CurrentFileName, rec)); - continue; - } - if (!int.TryParse(splitData[1].Trim(), out y)) - { - Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected two comma separated integers after Coord.", Mod.CurrentFileName, rec)); - continue; - } - sst.StellarObjectLocations.Add(new CoordStellarObjectLocation { Coordinates = new Point(x, y), UseCenteredCoordinates = isCentered, StellarObjectTemplate = sobjTemplate }); - } - else if (pos.StartsWith("Same As")) - { - int idx; - if (!int.TryParse(pos.Substring("Same As ".Length), out idx)) - { - Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected integer after Same As.", Mod.CurrentFileName, rec)); - continue; - } - if (idx > sst.StellarObjectLocations.Count) - { - Mod.Errors.Add(new DataParsingException("A \"Same As\" stellar object location can reference only previously defined locations.", Mod.CurrentFileName, rec)); - continue; - } - sst.StellarObjectLocations.Add(new SameAsStellarObjectLocation { StarSystemTemplate = sst, TargetIndex = idx, StellarObjectTemplate = sobjTemplate }); - } - else if (pos.StartsWith("Circle Radius ")) - { - int radius; - if (!int.TryParse(pos.Substring("Circle Radius ".Length), out radius)) - { - Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected integer after Circle Radius.", Mod.CurrentFileName, rec)); - continue; - } - sst.StellarObjectLocations.Add(new CircleRadiusStellarObjectLocation { Radius = radius, StellarObjectTemplate = sobjTemplate }); - } - } - - // replace sight obscuration and other abilities that really should belong to sectors but Aaron reused for star systems - // so we don't get them using the same ability and systems inheriting abilities from storms etc. thus affecting the entire system! - sst.Abilities.Where(a => a.Rule.Matches("Sector - Sight Obscuration")).SafeForeach(a => a.Rule = AbilityRule.Find("System - Sight Obscuration")); - sst.Abilities.Where(a => a.Rule.Matches("Sector - Sensor Interference")).SafeForeach(a => a.Rule = AbilityRule.Find("System - Sensor Interference")); - sst.Abilities.Where(a => a.Rule.Matches("Sector - Shield Disruption")).SafeForeach(a => a.Rule = AbilityRule.Find("System - Shield Disruption")); - sst.Abilities.Where(a => a.Rule.Matches("Sector - Damage")).SafeForeach(a => a.Rule = AbilityRule.Find("System - Damage")); - - yield return sst; - } - } +using FrEee.Objects.Space; +using FrEee.Modding.StellarObjectLocations; +using FrEee.Modding.Templates; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using Size = FrEee.Objects.Space.StellarSize; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Modding.Abilities; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads star system templates from SystemTypes.txt. +/// +[Serializable] +public class StarSystemLoader : DataFileLoader +{ + public StarSystemLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "SystemTypes.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var sst = new StarSystemTemplate(null); + sst.TemplateParameters = rec.Parameters; + string temp; + int index = -1; + + sst.ModID = rec.Get("ID", sst); + rec.TryFindFieldValue("Name", out temp, ref index, Mod.Errors, 0, true); + sst.Name = temp; + mod.StarSystemTemplates.Add(sst); + + rec.TryFindFieldValue("Description", out temp, ref index, Mod.Errors, 0, true); + sst.Description = temp; + + sst.Radius = rec.Get("Radius") ?? 6; + + rec.TryFindFieldValue("Background Bitmap", out temp, ref index, Mod.Errors, 0, true); + sst.BackgroundImagePath = Path.GetFileNameWithoutExtension(temp); // so we can use PNG when SE4 specifies BMP files + + rec.TryFindFieldValue("Empires Can Start In", out temp, ref index, Mod.Errors, 0, true); + sst.EmpiresCanStartIn = bool.Parse(temp); + + rec.TryFindFieldValue("Non-Tiled Center Pic", out temp, ref index, Mod.Errors, 0, true); + sst.NonTiledCenterCombatImage = bool.Parse(temp); + + foreach (var abil in AbilityLoader.Load(Filename, rec, sst)) + sst.Abilities.Add(abil); + + sst.WarpPointAbilities = Mod.Current.StellarAbilityTemplates.FindByName(rec.Get("WP Stellar Abil Type", sst)); + + int count = 0; + int start = 0; + while (true) + { + count++; + string sobjtype; + string pos; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Physical Type", "Obj Physical Type" }, out temp, ref start, null, start, true)) + break; // couldn't load next stellar object template + else + sobjtype = temp; + start++; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Position", "Obj Position" }, out temp, ref start, null, start)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Position\" field.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + pos = temp; + start++; + + ITemplate sobjTemplate; + if (sobjtype == "Star" || sobjtype == "Destroyed Star") + { + var template = new StarTemplate(); + + if (sobjtype == "DestroyedStar") + template.IsDestroyed = true; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Stellar Abil Type", "Obj Stellar Abil Type" }, out temp, ref start, null, start, true)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Stellar Abil Type\" field for star.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + { + template.Abilities = mod.StellarAbilityTemplates.FindByName(temp); + if (template.Abilities == null) + { + template.Abilities = new RandomAbilityTemplate(); + yield return template.Abilities; + Mod.Errors.Add(new DataParsingException("Could not find stellar ability type \"" + temp + "\" in StellarAbilityTypes.txt.", Mod.CurrentFileName, rec)); + } + } + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Size", "Obj Size" }, out temp, ref start, null, start, true)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Size\" field for star.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + { + if (temp == "Any") + template.StellarSize = null; + else + { + try + { + template.StellarSize = temp.ParseEnum(); + } + catch (ArgumentException ex) + { + Mod.Errors.Add(new DataParsingException("Invalid stellar object size \"" + temp + "\". Must be Tiny, Small, Medium, Large, Huge, or Any.", ex, Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + } + } + start++; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Age", "Obj Age" }, out temp, ref start, null, start)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Age\" field for star.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + template.Age = temp == "Any" ? null : temp; + start++; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Color", "Obj Color" }, out temp, ref start, null, start)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Color\" field for star.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + template.Color = temp == "Any" ? null : temp; + start++; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Luminosity", "Obj Luminosity" }, out temp, ref start, null, start)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Luminosity\" field for star.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + template.Brightness = temp == "Any" ? null : temp; + start++; + + sobjTemplate = template; + } + else if (sobjtype == "Planet") + { + var template = new PlanetTemplate(); + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Stellar Abil Type", "Obj Stellar Abil Type" }, out temp, ref start, null, start, true)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Stellar Abil Type\" field for planet.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + { + template.Abilities = mod.StellarAbilityTemplates.FindByName(temp); + if (template.Abilities == null) + { + template.Abilities = new RandomAbilityTemplate(); + yield return template.Abilities; + Mod.Errors.Add(new DataParsingException("Could not find stellar ability type \"" + temp + "\" in StellarAbilityTypes.txt.", Mod.CurrentFileName, rec)); + } + } + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Size", "Obj Size" }, out temp, ref start, null, start, true)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Size\" field for planet.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + { + if (temp == "Any") + template.StellarSize = null; + else + { + try + { + template.StellarSize = temp.ParseEnum(); + } + catch (ArgumentException ex) + { + Mod.Errors.Add(new DataParsingException("Invalid stellar object size \"" + temp + "\". Must be Tiny, Small, Medium, Large, Huge, or Any.", ex, Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + } + } + start++; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Atmosphere", "Obj Atmosphere" }, out temp, ref start, null, start)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Atmosphere\" field for planet.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + template.Atmosphere = temp == "Any" ? null : temp; + start++; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Composition", "Obj Composition" }, out temp, ref start, null, start)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Composition\" field for planet.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + template.Surface = temp == "Any" ? null : temp; + start++; + + sobjTemplate = template; + } + else if (sobjtype == "Asteroids") + { + var template = new AsteroidFieldTemplate(); + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Stellar Abil Type", "Obj Stellar Abil Type" }, out temp, ref start, null, start, true)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Stellar Abil Type\" field for asteroid field.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + { + template.Abilities = mod.StellarAbilityTemplates.FindByName(temp); + if (template.Abilities == null) + { + template.Abilities = new RandomAbilityTemplate(); + yield return template.Abilities; + Mod.Errors.Add(new DataParsingException("Could not find stellar ability type \"" + temp + "\" in StellarAbilityTypes.txt.", Mod.CurrentFileName, rec)); + } + } + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Size", "Obj Size" }, out temp, ref start, null, start, true)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Size\" field for asteroid field.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + { + if (temp == "Any") + template.StellarSize = null; + else + { + try + { + template.StellarSize = (StellarSize)Enum.Parse(typeof(Size), temp); + } + catch (ArgumentException ex) + { + Mod.Errors.Add(new DataParsingException("Invalid stellar object size \"" + temp + "\". Must be Tiny, Small, Medium, Large, Huge, or Any.", ex, Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + } + } + start++; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Atmosphere", "Obj Atmosphere" }, out temp, ref start, null, start)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Atmosphere\" field for asteroid field.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + template.Atmosphere = temp == "Any" ? null : temp; + start++; + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Composition", "Obj Composition" }, out temp, ref start, null, start)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Composition\" field for asteroid field.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + template.Surface = temp == "Any" ? null : temp; + start++; + + sobjTemplate = template; + } + else if (sobjtype == "Storm") + { + var template = new StormTemplate(); + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Stellar Abil Type", "Obj Stellar Abil Type" }, out temp, ref start, null, start, true)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Stellar Abil Type\" field for storm.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + { + template.Abilities = mod.StellarAbilityTemplates.FindByName(temp); + if (template.Abilities == null) + { + template.Abilities = new RandomAbilityTemplate(); + yield return template.Abilities; + Mod.Errors.Add(new DataParsingException("Could not find stellar ability type \"" + temp + "\" in StellarAbilityTypes.txt.", Mod.CurrentFileName, rec)); + } + } + + if (!rec.TryFindFieldValue(new string[] { "Obj " + count + " Size", "Obj Size" }, out temp, ref start, null, start, true)) + { + Mod.Errors.Add(new DataParsingException("Could not find \"Obj Size\" field for storm.", Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + else + { + if (temp == "Any") + template.Size = null; + else + { + try + { + template.Size = temp.ParseEnum(); + } + catch (ArgumentException ex) + { + Mod.Errors.Add(new DataParsingException("Invalid stellar object size \"" + temp + "\". Must be Tiny, Small, Medium, Large, Huge, or Any.", ex, Mod.CurrentFileName, rec)); + continue; // skip this stellar object + } + } + } + start++; + + sobjTemplate = template; + } + else + { + Mod.Errors.Add(new DataParsingException("Invalid stellar object type \"" + sobjtype + "\". Must be Star, Planet, Asteroids, or Storm.", Mod.CurrentFileName, rec)); + continue; + } + + if (pos.StartsWith("Ring ")) + { + int ring; + if (!int.TryParse(pos.Substring("Ring ".Length), out ring)) + { + Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected integer after Ring.", Mod.CurrentFileName, rec)); + continue; + } + sst.StellarObjectLocations.Add(new RingStellarObjectLocation { Ring = ring, StellarObjectTemplate = sobjTemplate }); + } + else if (pos.StartsWith("Coord ") || pos.StartsWith("Centered Coord ")) + { + int x, y; + string coordsData; + bool isCentered = pos.StartsWith("Centered Coord "); + if (isCentered) + coordsData = pos.Substring("Centered Coord ".Length); + else + coordsData = pos.Substring("Coord ".Length); + var splitData = coordsData.Split(','); + if (splitData.Length < 2) + { + Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected two comma separated integers after Coord.", Mod.CurrentFileName, rec)); + continue; + } + if (!int.TryParse(splitData[0].Trim(), out x)) + { + Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected two comma separated integers after Coord.", Mod.CurrentFileName, rec)); + continue; + } + if (!int.TryParse(splitData[1].Trim(), out y)) + { + Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected two comma separated integers after Coord.", Mod.CurrentFileName, rec)); + continue; + } + sst.StellarObjectLocations.Add(new CoordStellarObjectLocation { Coordinates = new Point(x, y), UseCenteredCoordinates = isCentered, StellarObjectTemplate = sobjTemplate }); + } + else if (pos.StartsWith("Same As")) + { + int idx; + if (!int.TryParse(pos.Substring("Same As ".Length), out idx)) + { + Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected integer after Same As.", Mod.CurrentFileName, rec)); + continue; + } + if (idx > sst.StellarObjectLocations.Count) + { + Mod.Errors.Add(new DataParsingException("A \"Same As\" stellar object location can reference only previously defined locations.", Mod.CurrentFileName, rec)); + continue; + } + sst.StellarObjectLocations.Add(new SameAsStellarObjectLocation { StarSystemTemplate = sst, TargetIndex = idx, StellarObjectTemplate = sobjTemplate }); + } + else if (pos.StartsWith("Circle Radius ")) + { + int radius; + if (!int.TryParse(pos.Substring("Circle Radius ".Length), out radius)) + { + Mod.Errors.Add(new DataParsingException("Could not parse stellar object location \"" + pos + "\". Expected integer after Circle Radius.", Mod.CurrentFileName, rec)); + continue; + } + sst.StellarObjectLocations.Add(new CircleRadiusStellarObjectLocation { Radius = radius, StellarObjectTemplate = sobjTemplate }); + } + } + + // replace sight obscuration and other abilities that really should belong to sectors but Aaron reused for star systems + // so we don't get them using the same ability and systems inheriting abilities from storms etc. thus affecting the entire system! + sst.Abilities.Where(a => a.Rule.Matches("Sector - Sight Obscuration")).SafeForeach(a => a.Rule = AbilityRule.Find("System - Sight Obscuration")); + sst.Abilities.Where(a => a.Rule.Matches("Sector - Sensor Interference")).SafeForeach(a => a.Rule = AbilityRule.Find("System - Sensor Interference")); + sst.Abilities.Where(a => a.Rule.Matches("Sector - Shield Disruption")).SafeForeach(a => a.Rule = AbilityRule.Find("System - Shield Disruption")); + sst.Abilities.Where(a => a.Rule.Matches("Sector - Damage")).SafeForeach(a => a.Rule = AbilityRule.Find("System - Damage")); + + yield return sst; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/StellarAbilityLoader.cs b/FrEee.Core/Modding/Loaders/StellarAbilityLoader.cs similarity index 95% rename from FrEee/Modding/Loaders/StellarAbilityLoader.cs rename to FrEee.Core/Modding/Loaders/StellarAbilityLoader.cs index 3ffe12efd..b0b2423f4 100644 --- a/FrEee/Modding/Loaders/StellarAbilityLoader.cs +++ b/FrEee.Core/Modding/Loaders/StellarAbilityLoader.cs @@ -1,91 +1,91 @@ -using FrEee.Objects.Abilities; -using FrEee.Modding.Templates; -using System; -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads stellar abilities from StellarAbilityTypes.txt. -/// -[Serializable] -public class StellarAbilityLoader : DataFileLoader -{ - public StellarAbilityLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "StellarAbilityTypes.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var sabil = new RandomAbilityTemplate(); - sabil.TemplateParameters = rec.Parameters; - string temp; - int index = -1; - - sabil.ModID = rec.Get("ID", sabil); - rec.TryFindFieldValue("Name", out temp, ref index, Mod.Errors, 0, true); - sabil.Name = temp; - mod.StellarAbilityTemplates.Add(sabil); - - foreach (var abil in LoadRecord(rec, sabil)) - sabil.AbilityChances.Add(abil); - - yield return sabil; - } - } - - private static IEnumerable LoadRecord(Record rec, RandomAbilityTemplate rat) - { - int count = 0; - int start = 0; - while (true) - { - count++; - var ac = new AbilityChance(); - ac.Ability = new Ability(null); - string temp; - - if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Chance", "Ability Chance" }, out temp, ref start, null, start, true)) - yield break; // couldn't load next ability - else - { - int chance; - if (!int.TryParse(temp, out chance)) - Mod.Errors.Add(new DataParsingException("Ability Chance field value must be an integer.", Mod.CurrentFileName, rec, null)); - ac.Chance = chance; - } - start++; - - if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Type", "Ability Type" }, out temp, ref start, null, start)) - yield break; // couldn't load next ability - else - ac.Ability.Rule = Mod.Current.FindAbilityRule(temp); - start++; - - if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Descr", "Ability Descr" }, out temp, ref start, null, start)) - ac.Ability.Description = ""; // no description for this ability - else - ac.Ability.Description = temp; - start++; - - if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Val 1", "Ability " + count + " Val", "Ability Val 1", "Ability Val" }, out temp, ref start, null, start)) - continue; // leave default values - else - ac.Ability.Values.Add(temp); - start++; - - if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Val 2", "Ability " + count + " Val", "Ability Val 2", "Ability Val" }, out temp, ref start, null, start)) - continue; // leave default value - else - ac.Ability.Values.Add(temp); - start++; - - yield return ac; - } - } +using FrEee.Modding.Abilities; +using FrEee.Modding.Templates; +using System; +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads stellar abilities from StellarAbilityTypes.txt. +/// +[Serializable] +public class StellarAbilityLoader : DataFileLoader +{ + public StellarAbilityLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "StellarAbilityTypes.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var sabil = new RandomAbilityTemplate(); + sabil.TemplateParameters = rec.Parameters; + string temp; + int index = -1; + + sabil.ModID = rec.Get("ID", sabil); + rec.TryFindFieldValue("Name", out temp, ref index, Mod.Errors, 0, true); + sabil.Name = temp; + mod.StellarAbilityTemplates.Add(sabil); + + foreach (var abil in LoadRecord(rec, sabil)) + sabil.AbilityChances.Add(abil); + + yield return sabil; + } + } + + private static IEnumerable LoadRecord(Record rec, RandomAbilityTemplate rat) + { + int count = 0; + int start = 0; + while (true) + { + count++; + var ac = new AbilityChance(); + ac.Ability = new Ability(null); + string temp; + + if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Chance", "Ability Chance" }, out temp, ref start, null, start, true)) + yield break; // couldn't load next ability + else + { + int chance; + if (!int.TryParse(temp, out chance)) + Mod.Errors.Add(new DataParsingException("Ability Chance field value must be an integer.", Mod.CurrentFileName, rec, null)); + ac.Chance = chance; + } + start++; + + if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Type", "Ability Type" }, out temp, ref start, null, start)) + yield break; // couldn't load next ability + else + ac.Ability.Rule = Mod.Current.FindAbilityRule(temp); + start++; + + if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Descr", "Ability Descr" }, out temp, ref start, null, start)) + ac.Ability.Description = ""; // no description for this ability + else + ac.Ability.Description = temp; + start++; + + if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Val 1", "Ability " + count + " Val", "Ability Val 1", "Ability Val" }, out temp, ref start, null, start)) + continue; // leave default values + else + ac.Ability.Values.Add(temp); + start++; + + if (!rec.TryFindFieldValue(new string[] { "Ability " + count + " Val 2", "Ability " + count + " Val", "Ability Val 2", "Ability Val" }, out temp, ref start, null, start)) + continue; // leave default value + else + ac.Ability.Values.Add(temp); + start++; + + yield return ac; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/StellarObjectLoader.cs b/FrEee.Core/Modding/Loaders/StellarObjectLoader.cs similarity index 97% rename from FrEee/Modding/Loaders/StellarObjectLoader.cs rename to FrEee.Core/Modding/Loaders/StellarObjectLoader.cs index 8788374ce..91118bdf9 100644 --- a/FrEee/Modding/Loaders/StellarObjectLoader.cs +++ b/FrEee.Core/Modding/Loaders/StellarObjectLoader.cs @@ -1,261 +1,261 @@ -using FrEee.Objects.Space; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads stellar object templates from SectType.txt. -/// -[Serializable] -public class StellarObjectLoader : DataFileLoader -{ - public StellarObjectLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "SectType.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - StellarObject sobj; - string temp, type; - int index = -1; - - rec.TryFindFieldValue("Physical Type", out type, ref index, Mod.Errors, 0, true); - if (type == "Star" || type == "Destroyed Star") - { - var star = new Star(); - sobj = star; - - rec.TryFindFieldValue(new string[] { "Size", "Star Size" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Size field for star.", Mod.CurrentFileName, rec)); - continue; - } - StellarSize size; - if (Enum.TryParse(temp, out size)) - star.StellarSize = size; - else - Mod.Errors.Add(new DataParsingException("Invalid star size. Must be Tiny, Small, Medium, Large, or Huge.", Mod.CurrentFileName, rec)); - - rec.TryFindFieldValue(new string[] { "Age", "Star Age" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Age field for star.", Mod.CurrentFileName, rec)); - continue; - } - star.Age = temp; - - rec.TryFindFieldValue(new string[] { "Color", "Star Color" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Color field for star.", Mod.CurrentFileName, rec)); - continue; - } - star.Color = temp; - - rec.TryFindFieldValue(new string[] { "Luminosity", "Star Luminosity" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Luminosity field for star.", Mod.CurrentFileName, rec)); - continue; - } - star.Brightness = temp; - - if (type == "Destroyed Star") - star.IsDestroyed = true; - } - else if (type == "Planet") - { - var planet = new Planet(); - sobj = planet; - - rec.TryFindFieldValue(new string[] { "Size", "Planet Size" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Size field for planet.", Mod.CurrentFileName, rec)); - continue; - } - StellarSize ss; - StellarObjectSize sos = Mod.Current.StellarObjectSizes.Where(s => s.StellarObjectType == "Planet" && s.Name == temp).FirstOrDefault(); - if (sos == null) - { - if (!Enum.TryParse(temp, out ss)) - Mod.Errors.Add(new DataParsingException("Invalid planet size. Must be Tiny, Small, Medium, Large, or Huge, or a planet size entry from PlanetSize.txt.", Mod.CurrentFileName, rec)); - } - else - ss = sos.StellarSize; - planet.StellarSize = ss; - planet.Size = sos; - - rec.TryFindFieldValue(new string[] { "Physical Type", "Planet Physical Type" }, out temp, ref index, Mod.Errors, 1, true); // skip the original Physical Type field which just says it's a planet - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Physical Type field for planet.", Mod.CurrentFileName, rec)); - continue; - } - planet.Surface = temp; - - rec.TryFindFieldValue(new string[] { "Atmosphere", "Planet Atmosphere" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Atmosphere field for planet.", Mod.CurrentFileName, rec)); - continue; - } - planet.Atmosphere = temp; - } - else if (type == "Asteroids") - { - var ast = new AsteroidField(); - sobj = ast; - - rec.TryFindFieldValue(new string[] { "Size", "Planet Size" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Size field for asteroids.", Mod.CurrentFileName, rec)); - continue; - } - StellarSize ss; - StellarObjectSize sos = Mod.Current.StellarObjectSizes.Where(s => s.StellarObjectType == "Planet" && s.Name == temp).FirstOrDefault(); - if (sos == null) - { - if (!Enum.TryParse(temp, out ss)) - Mod.Errors.Add(new DataParsingException("Invalid asteroid field size. Must be Tiny, Small, Medium, Large, or Huge, or an asteroids size entry from PlanetSize.txt.", Mod.CurrentFileName, rec)); - } - else - ss = sos.StellarSize; - ast.StellarSize = ss; - ast.Size = sos; - - rec.TryFindFieldValue(new string[] { "Physical Type", "Planet Physical Type" }, out temp, ref index, Mod.Errors, 1, true); // skip the original Physical Type field which just says it's asteroids - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Physical Type field for asteroids.", Mod.CurrentFileName, rec)); - continue; - } - ast.Surface = temp; - - rec.TryFindFieldValue(new string[] { "Atmosphere", "Planet Atmosphere" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Atmosphere field for asteroids.", Mod.CurrentFileName, rec)); - continue; - } - ast.Atmosphere = temp; - - rec.TryFindFieldValue(new string[] { "Combat Tile" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Combat Tile field for asteroids.", Mod.CurrentFileName, rec)); - continue; - } - ast.CombatTile = temp; - } - else if (type == "Storm") - { - var storm = new Storm(); - sobj = storm; - - rec.TryFindFieldValue(new string[] { "Size", "Storm Size" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Size field for storm.", Mod.CurrentFileName, rec)); - continue; - } - StellarSize size; - if (Enum.TryParse(temp, out size)) - storm.StellarSize = size; - else - Mod.Errors.Add(new DataParsingException("Invalid storm size. Must be Tiny, Small, Medium, Large, or Huge.", Mod.CurrentFileName, rec)); - - rec.TryFindFieldValue(new string[] { "Combat Tile" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Combat Tile field for storm.", Mod.CurrentFileName, rec)); - continue; - } - storm.CombatTile = temp; - } - else if (type == "Warp Point") - { - var wp = new WarpPoint(); - sobj = wp; - - rec.TryFindFieldValue(new string[] { "Size", "Warp Point Size" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Size field for warp point.", Mod.CurrentFileName, rec)); - continue; - } - StellarSize size; - if (Enum.TryParse(temp, out size)) - wp.StellarSize = size; - else - Mod.Errors.Add(new DataParsingException("Invalid warp point size. Must be Tiny, Small, Medium, Large, or Huge.", Mod.CurrentFileName, rec)); - - rec.TryFindFieldValue(new string[] { "One-Way", "Warp Point One-Way" }, out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find One-Way field for warp point.", Mod.CurrentFileName, rec)); - continue; - } - bool oneway; - if (bool.TryParse(temp, out oneway)) - wp.IsOneWay = oneway; - else - Mod.Errors.Add(new DataParsingException("Invalid value " + temp + " for warp point One-Way field. Must be true or false.", Mod.CurrentFileName, rec)); - - rec.TryFindFieldValue("Unusual", out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Unusual field for warp point.", Mod.CurrentFileName, rec)); - continue; - } - bool unusual; - if (bool.TryParse(temp, out unusual)) - wp.IsUnusual = unusual; - else - Mod.Errors.Add(new DataParsingException("Invalid value " + temp + " for warp point Unusual field. Must be true or false.", Mod.CurrentFileName, rec)); - } - else - { - Mod.Errors.Add(new DataParsingException("Invalid stellar object type: " + type + ".", Mod.CurrentFileName, rec)); - continue; - } - - rec.TryFindFieldValue("Picture", out temp, ref index, null, 0, true); // ignore error for now, might use Picture Num - if (temp == null) - { - rec.TryFindFieldValue("Picture Num", out temp, ref index, Mod.Errors, 0, true); - if (temp == null) - { - Mod.Errors.Add(new DataParsingException("Could not find Picture field or Picture Num field.", Mod.CurrentFileName, rec)); - continue; - } - int pnum; - if (!int.TryParse(temp, out pnum)) - { - Mod.Errors.Add(new DataParsingException("Picture Num field was not an integer.", Mod.CurrentFileName, rec)); - continue; - } - sobj.PictureName = "p" + (pnum + 1).ToString("0000"); // to match SE4 - } - else - sobj.PictureName = temp; - - rec.TryFindFieldValue("Description", out temp, ref index, Mod.Errors, 0, true); - sobj.TemplateParameters = rec.Parameters; - sobj.Description = temp; - sobj.ModID = rec.Get("ID", sobj); - - mod.StellarObjectTemplates.Add(sobj); - yield return sobj; - } - } +using FrEee.Objects.Space; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads stellar object templates from SectType.txt. +/// +[Serializable] +public class StellarObjectLoader : DataFileLoader +{ + public StellarObjectLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "SectType.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + StellarObject sobj; + string temp, type; + int index = -1; + + rec.TryFindFieldValue("Physical Type", out type, ref index, Mod.Errors, 0, true); + if (type == "Star" || type == "Destroyed Star") + { + var star = new Star(); + sobj = star; + + rec.TryFindFieldValue(new string[] { "Size", "Star Size" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Size field for star.", Mod.CurrentFileName, rec)); + continue; + } + StellarSize size; + if (Enum.TryParse(temp, out size)) + star.StellarSize = size; + else + Mod.Errors.Add(new DataParsingException("Invalid star size. Must be Tiny, Small, Medium, Large, or Huge.", Mod.CurrentFileName, rec)); + + rec.TryFindFieldValue(new string[] { "Age", "Star Age" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Age field for star.", Mod.CurrentFileName, rec)); + continue; + } + star.Age = temp; + + rec.TryFindFieldValue(new string[] { "Color", "Star Color" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Color field for star.", Mod.CurrentFileName, rec)); + continue; + } + star.Color = temp; + + rec.TryFindFieldValue(new string[] { "Luminosity", "Star Luminosity" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Luminosity field for star.", Mod.CurrentFileName, rec)); + continue; + } + star.Brightness = temp; + + if (type == "Destroyed Star") + star.IsDestroyed = true; + } + else if (type == "Planet") + { + var planet = new Planet(); + sobj = planet; + + rec.TryFindFieldValue(new string[] { "Size", "Planet Size" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Size field for planet.", Mod.CurrentFileName, rec)); + continue; + } + StellarSize ss; + StellarObjectSize sos = Mod.Current.StellarObjectSizes.Where(s => s.StellarObjectType == "Planet" && s.Name == temp).FirstOrDefault(); + if (sos == null) + { + if (!Enum.TryParse(temp, out ss)) + Mod.Errors.Add(new DataParsingException("Invalid planet size. Must be Tiny, Small, Medium, Large, or Huge, or a planet size entry from PlanetSize.txt.", Mod.CurrentFileName, rec)); + } + else + ss = sos.StellarSize; + planet.StellarSize = ss; + planet.Size = sos; + + rec.TryFindFieldValue(new string[] { "Physical Type", "Planet Physical Type" }, out temp, ref index, Mod.Errors, 1, true); // skip the original Physical Type field which just says it's a planet + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Physical Type field for planet.", Mod.CurrentFileName, rec)); + continue; + } + planet.Surface = temp; + + rec.TryFindFieldValue(new string[] { "Atmosphere", "Planet Atmosphere" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Atmosphere field for planet.", Mod.CurrentFileName, rec)); + continue; + } + planet.Atmosphere = temp; + } + else if (type == "Asteroids") + { + var ast = new AsteroidField(); + sobj = ast; + + rec.TryFindFieldValue(new string[] { "Size", "Planet Size" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Size field for asteroids.", Mod.CurrentFileName, rec)); + continue; + } + StellarSize ss; + StellarObjectSize sos = Mod.Current.StellarObjectSizes.Where(s => s.StellarObjectType == "Planet" && s.Name == temp).FirstOrDefault(); + if (sos == null) + { + if (!Enum.TryParse(temp, out ss)) + Mod.Errors.Add(new DataParsingException("Invalid asteroid field size. Must be Tiny, Small, Medium, Large, or Huge, or an asteroids size entry from PlanetSize.txt.", Mod.CurrentFileName, rec)); + } + else + ss = sos.StellarSize; + ast.StellarSize = ss; + ast.Size = sos; + + rec.TryFindFieldValue(new string[] { "Physical Type", "Planet Physical Type" }, out temp, ref index, Mod.Errors, 1, true); // skip the original Physical Type field which just says it's asteroids + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Physical Type field for asteroids.", Mod.CurrentFileName, rec)); + continue; + } + ast.Surface = temp; + + rec.TryFindFieldValue(new string[] { "Atmosphere", "Planet Atmosphere" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Atmosphere field for asteroids.", Mod.CurrentFileName, rec)); + continue; + } + ast.Atmosphere = temp; + + rec.TryFindFieldValue(new string[] { "Combat Tile" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Combat Tile field for asteroids.", Mod.CurrentFileName, rec)); + continue; + } + ast.CombatTile = temp; + } + else if (type == "Storm") + { + var storm = new Storm(); + sobj = storm; + + rec.TryFindFieldValue(new string[] { "Size", "Storm Size" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Size field for storm.", Mod.CurrentFileName, rec)); + continue; + } + StellarSize size; + if (Enum.TryParse(temp, out size)) + storm.StellarSize = size; + else + Mod.Errors.Add(new DataParsingException("Invalid storm size. Must be Tiny, Small, Medium, Large, or Huge.", Mod.CurrentFileName, rec)); + + rec.TryFindFieldValue(new string[] { "Combat Tile" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Combat Tile field for storm.", Mod.CurrentFileName, rec)); + continue; + } + storm.CombatTile = temp; + } + else if (type == "Warp Point") + { + var wp = new WarpPoint(); + sobj = wp; + + rec.TryFindFieldValue(new string[] { "Size", "Warp Point Size" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Size field for warp point.", Mod.CurrentFileName, rec)); + continue; + } + StellarSize size; + if (Enum.TryParse(temp, out size)) + wp.StellarSize = size; + else + Mod.Errors.Add(new DataParsingException("Invalid warp point size. Must be Tiny, Small, Medium, Large, or Huge.", Mod.CurrentFileName, rec)); + + rec.TryFindFieldValue(new string[] { "One-Way", "Warp Point One-Way" }, out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find One-Way field for warp point.", Mod.CurrentFileName, rec)); + continue; + } + bool oneway; + if (bool.TryParse(temp, out oneway)) + wp.IsOneWay = oneway; + else + Mod.Errors.Add(new DataParsingException("Invalid value " + temp + " for warp point One-Way field. Must be true or false.", Mod.CurrentFileName, rec)); + + rec.TryFindFieldValue("Unusual", out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Unusual field for warp point.", Mod.CurrentFileName, rec)); + continue; + } + bool unusual; + if (bool.TryParse(temp, out unusual)) + wp.IsUnusual = unusual; + else + Mod.Errors.Add(new DataParsingException("Invalid value " + temp + " for warp point Unusual field. Must be true or false.", Mod.CurrentFileName, rec)); + } + else + { + Mod.Errors.Add(new DataParsingException("Invalid stellar object type: " + type + ".", Mod.CurrentFileName, rec)); + continue; + } + + rec.TryFindFieldValue("Picture", out temp, ref index, null, 0, true); // ignore error for now, might use Picture Num + if (temp == null) + { + rec.TryFindFieldValue("Picture Num", out temp, ref index, Mod.Errors, 0, true); + if (temp == null) + { + Mod.Errors.Add(new DataParsingException("Could not find Picture field or Picture Num field.", Mod.CurrentFileName, rec)); + continue; + } + int pnum; + if (!int.TryParse(temp, out pnum)) + { + Mod.Errors.Add(new DataParsingException("Picture Num field was not an integer.", Mod.CurrentFileName, rec)); + continue; + } + sobj.PictureName = "p" + (pnum + 1).ToString("0000"); // to match SE4 + } + else + sobj.PictureName = temp; + + rec.TryFindFieldValue("Description", out temp, ref index, Mod.Errors, 0, true); + sobj.TemplateParameters = rec.Parameters; + sobj.Description = temp; + sobj.ModID = rec.Get("ID", sobj); + + mod.StellarObjectTemplates.Add(sobj); + yield return sobj; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/StellarObjectSizeLoader.cs b/FrEee.Core/Modding/Loaders/StellarObjectSizeLoader.cs similarity index 97% rename from FrEee/Modding/Loaders/StellarObjectSizeLoader.cs rename to FrEee.Core/Modding/Loaders/StellarObjectSizeLoader.cs index 90aa55b9f..923b3b1b9 100644 --- a/FrEee/Modding/Loaders/StellarObjectSizeLoader.cs +++ b/FrEee.Core/Modding/Loaders/StellarObjectSizeLoader.cs @@ -1,42 +1,42 @@ -using FrEee.Objects.Space; -using System.Collections.Generic; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads stellar object sizes from PlanetSize.txt. -/// -public class StellarObjectSizeLoader : DataFileLoader -{ - public StellarObjectSizeLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "PlanetSize.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var sos = new StellarObjectSize(); - sos.TemplateParameters = rec.Parameters; - mod.StellarObjectSizes.Add(sos); - - sos.ModID = rec.Get("ID", sos); - sos.Name = rec.Get("Name", sos); - sos.StellarObjectType = rec.Get("Physical Type", sos); - sos.StellarSize = rec.Get("Stellar Size", sos); - sos.MaxFacilities = rec.Get("Max Facilities", sos); - sos.MaxPopulation = rec.Get("Max Population", sos).Value * mod.Settings.PopulationFactor; - sos.MaxCargo = rec.Get("Max Cargo Spaces", sos); - sos.MaxFacilitiesDomed = rec.Get("Max Facilities Domed", sos); - sos.MaxPopulationDomed = rec.Get("Max Population Domed", sos).Value * mod.Settings.PopulationFactor; - sos.MaxCargoDomed = rec.Get("Max Cargo Spaces Domed", sos); - sos.IsConstructed = rec.Get("Constructed", sos); - sos.ConstructionAbilityID = rec.Get("Special Ability ID", sos); - - yield return sos; - } - } +using FrEee.Objects.Space; +using System.Collections.Generic; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads stellar object sizes from PlanetSize.txt. +/// +public class StellarObjectSizeLoader : DataFileLoader +{ + public StellarObjectSizeLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "PlanetSize.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var sos = new StellarObjectSize(); + sos.TemplateParameters = rec.Parameters; + mod.StellarObjectSizes.Add(sos); + + sos.ModID = rec.Get("ID", sos); + sos.Name = rec.Get("Name", sos); + sos.StellarObjectType = rec.Get("Physical Type", sos); + sos.StellarSize = rec.Get("Stellar Size", sos); + sos.MaxFacilities = rec.Get("Max Facilities", sos); + sos.MaxPopulation = rec.Get("Max Population", sos).Value * mod.Settings.PopulationFactor; + sos.MaxCargo = rec.Get("Max Cargo Spaces", sos); + sos.MaxFacilitiesDomed = rec.Get("Max Facilities Domed", sos); + sos.MaxPopulationDomed = rec.Get("Max Population Domed", sos).Value * mod.Settings.PopulationFactor; + sos.MaxCargoDomed = rec.Get("Max Cargo Spaces Domed", sos); + sos.IsConstructed = rec.Get("Constructed", sos); + sos.ConstructionAbilityID = rec.Get("Special Ability ID", sos); + + yield return sos; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/TechnologyLoader.cs b/FrEee.Core/Modding/Loaders/TechnologyLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/TechnologyLoader.cs rename to FrEee.Core/Modding/Loaders/TechnologyLoader.cs index d6f2b70d4..c3535fb29 100644 --- a/FrEee/Modding/Loaders/TechnologyLoader.cs +++ b/FrEee.Core/Modding/Loaders/TechnologyLoader.cs @@ -1,63 +1,63 @@ -using FrEee.Objects.Technology; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads technologies from TechArea.txt. -/// -[Serializable] -public class TechnologyLoader : DataFileLoader -{ - public TechnologyLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "TechArea.txt"; - - public override IEnumerable Load(Mod mod) - { - foreach (var rec in DataFile.Records) - { - var tech = new Technology(); - tech.TemplateParameters = rec.Parameters; - string temp; - int index = -1; - - tech.ModID = rec.Get("ID", tech); - rec.TryFindFieldValue("Name", out temp, ref index, Mod.Errors, 0, true); - tech.Name = temp; - mod.Technologies.Add(tech); - - rec.TryFindFieldValue("Group", out temp, ref index, Mod.Errors, 0, true); - tech.Group = temp; - - rec.TryFindFieldValue("Description", out temp, ref index, Mod.Errors, 0, true); - tech.Description = temp; - - tech.MaximumLevel = rec.Get("Maximum Level", tech); - tech.LevelCost = rec.Get("Level Cost", tech); - tech.StartLevel = rec.Get("Start Level", tech); - tech.RaiseLevel = rec.Get("Raise Level", tech); - tech.RacialTechID = rec.Get("Racial Area", tech); - tech.UniqueTechID = rec.Get("Unique Area", tech); - tech.CanBeRemoved = rec.Get("Can Be Removed", tech); - - yield return tech; - } - - foreach (var tech in mod.Technologies) - { - // find this tech's record - var rec = DataFile.Records.First(r => r.Get("Name", null) == tech.Name); - - // load its tech reqs - // couldn't do it before because some early techs can reference later techs - foreach (var tr in RequirementLoader.LoadEmpireRequirements(rec, tech, RequirementType.Unlock)) - tech.UnlockRequirements.Add(tr); - } - } +using FrEee.Objects.Technology; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads technologies from TechArea.txt. +/// +[Serializable] +public class TechnologyLoader : DataFileLoader +{ + public TechnologyLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "TechArea.txt"; + + public override IEnumerable Load(Mod mod) + { + foreach (var rec in DataFile.Records) + { + var tech = new Technology(); + tech.TemplateParameters = rec.Parameters; + string temp; + int index = -1; + + tech.ModID = rec.Get("ID", tech); + rec.TryFindFieldValue("Name", out temp, ref index, Mod.Errors, 0, true); + tech.Name = temp; + mod.Technologies.Add(tech); + + rec.TryFindFieldValue("Group", out temp, ref index, Mod.Errors, 0, true); + tech.Group = temp; + + rec.TryFindFieldValue("Description", out temp, ref index, Mod.Errors, 0, true); + tech.Description = temp; + + tech.MaximumLevel = rec.Get("Maximum Level", tech); + tech.LevelCost = rec.Get("Level Cost", tech); + tech.StartLevel = rec.Get("Start Level", tech); + tech.RaiseLevel = rec.Get("Raise Level", tech); + tech.RacialTechID = rec.Get("Racial Area", tech); + tech.UniqueTechID = rec.Get("Unique Area", tech); + tech.CanBeRemoved = rec.Get("Can Be Removed", tech); + + yield return tech; + } + + foreach (var tech in mod.Technologies) + { + // find this tech's record + var rec = DataFile.Records.First(r => r.Get("Name", null) == tech.Name); + + // load its tech reqs + // couldn't do it before because some early techs can reference later techs + foreach (var tr in RequirementLoader.LoadEmpireRequirements(rec, tech, RequirementType.Unlock)) + tech.UnlockRequirements.Add(tr); + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/TextLoader.cs b/FrEee.Core/Modding/Loaders/TextLoader.cs similarity index 96% rename from FrEee/Modding/Loaders/TextLoader.cs rename to FrEee.Core/Modding/Loaders/TextLoader.cs index 9c337e5b0..3d2acabe3 100644 --- a/FrEee/Modding/Loaders/TextLoader.cs +++ b/FrEee.Core/Modding/Loaders/TextLoader.cs @@ -1,64 +1,64 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads data from plain text. -/// -public class TextLoader : ILoader -{ - public TextLoader(string modPath, string filename, Func> destinationGetter) - { - ModPath = modPath; - FileName = filename; - DestinationGetter = destinationGetter; - } - - /// - /// How Load knows where the text goes in the mod. - /// - public Func> DestinationGetter { get; set; } - - /// - /// The file name to read from. - /// - public string FileName { get; set; } - - /// - /// The mod path, or null to use stock. - /// - public string ModPath { get; set; } - - public IEnumerable Load(Mod mod) - { - var dest = DestinationGetter(mod); - string filepath; - if (ModPath == null) - filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Data", FileName); - else - filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Mods", ModPath, "Data", FileName); - if (File.Exists(filepath)) - { - foreach (var s in File.ReadAllLines(filepath)) - dest.Add(s); - } - else if (ModPath != null) - { - filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Data", FileName); - if (File.Exists(filepath)) - { - foreach (var s in File.ReadAllLines(filepath)) - dest.Add(s); - } - else - throw new FileNotFoundException("Could not find data file: " + FileName + ".", FileName); - } - else - throw new FileNotFoundException("Could not find data file: " + FileName + ".", FileName); - - yield break; - } +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads data from plain text. +/// +public class TextLoader : ILoader +{ + public TextLoader(string modPath, string filename, Func> destinationGetter) + { + ModPath = modPath; + FileName = filename; + DestinationGetter = destinationGetter; + } + + /// + /// How Load knows where the text goes in the mod. + /// + public Func> DestinationGetter { get; set; } + + /// + /// The file name to read from. + /// + public string FileName { get; set; } + + /// + /// The mod path, or null to use stock. + /// + public string ModPath { get; set; } + + public IEnumerable Load(Mod mod) + { + var dest = DestinationGetter(mod); + string filepath; + if (ModPath == null) + filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Data", FileName); + else + filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Mods", ModPath, "Data", FileName); + if (File.Exists(filepath)) + { + foreach (var s in File.ReadAllLines(filepath)) + dest.Add(s); + } + else if (ModPath != null) + { + filepath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Data", FileName); + if (File.Exists(filepath)) + { + foreach (var s in File.ReadAllLines(filepath)) + dest.Add(s); + } + else + throw new FileNotFoundException("Could not find data file: " + FileName + ".", FileName); + } + else + throw new FileNotFoundException("Could not find data file: " + FileName + ".", FileName); + + yield break; + } } \ No newline at end of file diff --git a/FrEee/Modding/Loaders/TraitLoader.cs b/FrEee.Core/Modding/Loaders/TraitLoader.cs similarity index 95% rename from FrEee/Modding/Loaders/TraitLoader.cs rename to FrEee.Core/Modding/Loaders/TraitLoader.cs index 2fe6321f6..976aa7615 100644 --- a/FrEee/Modding/Loaders/TraitLoader.cs +++ b/FrEee.Core/Modding/Loaders/TraitLoader.cs @@ -1,92 +1,92 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding.Loaders; - -/// -/// Loads race/empire traits from RacialTraits.txt. -/// -public class TraitLoader : DataFileLoader -{ - public TraitLoader(string modPath) - : base(modPath, Filename, DataFile.Load(modPath, Filename)) - { - } - - public const string Filename = "RacialTraits.txt"; - - public override IEnumerable Load(Mod mod) - { - Trait t; - int index = -1; - foreach (var rec in DataFile.Records) - { - t = new Trait(); - t.TemplateParameters = rec.Parameters; - mod.Traits.Add(t); - - t.ModID = rec.Get("ID", t); - t.Name = rec.Get("Name", t, ref index); - t.Description = rec.Get("Description", t, ref index); - t.Cost = rec.Get("Cost", t, ref index); - - for (int count = 1; ; count++) - { - var f = rec.FindField(new string[] { "Trait Type", "Trait Type " + count }, ref index, false, index + 1); - if (f == null) - break; - var abil = new Ability(t); - abil.Rule = Mod.Current.FindAbilityRule(f.Value); - for (int vcount = 1; ; vcount++) - { - var vf = rec.FindField(new string[] { "Value", "Value " + vcount }, ref index, false, index + 1); - if (vf == null) - break; - abil.Values.Add(vf.Value); - } - t.Abilities.Add(abil); - } - - if (t.Abilities.Count == 0) - Mod.Errors.Add(new DataParsingException("Trait \"" + t.Name + "\" does not have any abilities.", Mod.CurrentFileName, rec)); - - yield return t; - } - - // second pass for required/restricted traits - var recs = DataFile.Records.ToArray(); - for (var i = 0; i < recs.Length; i++) - { - var rec = recs[i]; - index = -1; - - t = mod.Traits.ElementAt(i); - - for (int count = 1; ; count++) - { - var f = rec.FindField(new string[] { "Required Trait", "Required Trait " + count }, ref index, false, index + 1); - if (f == null || f.Value == "None") - break; - var rts = mod.Traits.Where(t2 => t2.Name == f.Value); - if (!rts.Any()) - Mod.Errors.Add(new DataParsingException("Required trait \"" + f.Value + "\" for trait \"" + t.Name + "\" does not exist in RacialTraits.txt.", Mod.CurrentFileName, rec)); - foreach (var rt in rts) - t.RequiredTraits.Add(rt); - } - - for (int count = 1; ; count++) - { - var f = rec.FindField(new string[] { "Restricted Trait", "Restricted Trait " + count }, ref index, false, index + 1); - if (f == null || f.Value == "None") - break; - var rts = mod.Traits.Where(t2 => t2.Name == f.Value); - if (!rts.Any()) - Mod.Errors.Add(new DataParsingException("Restricted trait \"" + f.Value + "\" for trait \"" + t.Name + "\" does not exist in RacialTraits.txt.", Mod.CurrentFileName, rec)); - foreach (var rt in rts) - t.RestrictedTraits.Add(rt); - } - } - } +using FrEee.Modding.Abilities; +using FrEee.Objects.Civilization; +using System.Collections.Generic; +using System.Linq; + +namespace FrEee.Modding.Loaders; + +/// +/// Loads race/empire traits from RacialTraits.txt. +/// +public class TraitLoader : DataFileLoader +{ + public TraitLoader(string modPath) + : base(modPath, Filename, DataFile.Load(modPath, Filename)) + { + } + + public const string Filename = "RacialTraits.txt"; + + public override IEnumerable Load(Mod mod) + { + Trait t; + int index = -1; + foreach (var rec in DataFile.Records) + { + t = new Trait(); + t.TemplateParameters = rec.Parameters; + mod.Traits.Add(t); + + t.ModID = rec.Get("ID", t); + t.Name = rec.Get("Name", t, ref index); + t.Description = rec.Get("Description", t, ref index); + t.Cost = rec.Get("Cost", t, ref index); + + for (int count = 1; ; count++) + { + var f = rec.FindField(new string[] { "Trait Type", "Trait Type " + count }, ref index, false, index + 1); + if (f == null) + break; + var abil = new Ability(t); + abil.Rule = Mod.Current.FindAbilityRule(f.Value); + for (int vcount = 1; ; vcount++) + { + var vf = rec.FindField(new string[] { "Value", "Value " + vcount }, ref index, false, index + 1); + if (vf == null) + break; + abil.Values.Add(vf.Value); + } + t.Abilities.Add(abil); + } + + if (t.Abilities.Count == 0) + Mod.Errors.Add(new DataParsingException("Trait \"" + t.Name + "\" does not have any abilities.", Mod.CurrentFileName, rec)); + + yield return t; + } + + // second pass for required/restricted traits + var recs = DataFile.Records.ToArray(); + for (var i = 0; i < recs.Length; i++) + { + var rec = recs[i]; + index = -1; + + t = mod.Traits.ElementAt(i); + + for (int count = 1; ; count++) + { + var f = rec.FindField(new string[] { "Required Trait", "Required Trait " + count }, ref index, false, index + 1); + if (f == null || f.Value == "None") + break; + var rts = mod.Traits.Where(t2 => t2.Name == f.Value); + if (!rts.Any()) + Mod.Errors.Add(new DataParsingException("Required trait \"" + f.Value + "\" for trait \"" + t.Name + "\" does not exist in RacialTraits.txt.", Mod.CurrentFileName, rec)); + foreach (var rt in rts) + t.RequiredTraits.Add(rt); + } + + for (int count = 1; ; count++) + { + var f = rec.FindField(new string[] { "Restricted Trait", "Restricted Trait " + count }, ref index, false, index + 1); + if (f == null || f.Value == "None") + break; + var rts = mod.Traits.Where(t2 => t2.Name == f.Value); + if (!rts.Any()) + Mod.Errors.Add(new DataParsingException("Restricted trait \"" + f.Value + "\" for trait \"" + t.Name + "\" does not exist in RacialTraits.txt.", Mod.CurrentFileName, rec)); + foreach (var rt in rts) + t.RestrictedTraits.Add(rt); + } + } + } } \ No newline at end of file diff --git a/FrEee/Modding/MetaRecord.cs b/FrEee.Core/Modding/MetaRecord.cs similarity index 96% rename from FrEee/Modding/MetaRecord.cs rename to FrEee.Core/Modding/MetaRecord.cs index e4ba73acf..1cf704c11 100644 --- a/FrEee/Modding/MetaRecord.cs +++ b/FrEee.Core/Modding/MetaRecord.cs @@ -1,195 +1,195 @@ -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Modding; - -/// -/// A record which takes parameters and is capable of generating multiple records using formulas. -/// -public class MetaRecord : Record, ITemplate> -{ - public MetaRecord() - : base() - { } - - /// - /// Creates a record by parsing some string data. - /// - /// - public MetaRecord(IEnumerable lines) - : base(lines) - { } - - public string Filename { get; set; } - - public new IEnumerable Parameters - { - get - { - string expecting = "Name"; - var p = new MetaRecordParameter(); - foreach (var f in Fields.Where(f => f.Name.StartsWith("Parameter "))) - { - var what = f.Name.Substring("Parameter ".Length); - if (expecting == "Name") - { - if (what == "Name") - { - p.Name = f.Value; - expecting = "Minimum"; - } - else - { - Mod.Errors.Add(new DataParsingException("Expected Parameter Name, found Parameter " + what + ".", Filename, this, f)); - yield break; - } - } - else if (expecting == "Minimum") - { - if (what == "Minimum") - { - p.Minimum = f.CreateFormula(p); - expecting = "Maximum"; - } - else if (what == "Maximum") - { - // it's OK, just set minimum to 1 - p.Minimum = 1; - p.Maximum = f.CreateFormula(p); - expecting = "Name"; - yield return p; - p = new MetaRecordParameter(); - } - else - { - Mod.Errors.Add(new DataParsingException("Expected Parameter Minimum or Parameter Maximum, found Parameter " + what + ".", Filename, this, f)); - yield break; - } - } - else if (expecting == "Maximum") - { - if (what == "Maximum") - { - p.Maximum = f.CreateFormula(p); - expecting = "Name"; - yield return p; - p = new MetaRecordParameter(); - } - else - { - Mod.Errors.Add(new DataParsingException("Expected Parameter Maximum, found Parameter " + what + ".", Filename, this, f)); - yield break; - } - } - } - if (expecting != "Name") - Mod.Errors.Add(new DataParsingException("Expected Parameter Minimum or Parameter Maximum but no more parameter fields were found.", Filename, this)); - } - } - - public IEnumerable Instantiate() - { - var parms = Parameters.ToArray(); - if (!parms.Any()) - { - var rec = new Record(); - foreach (var f in Fields) - rec.Fields.Add(f.Copy()); - yield return rec; - yield break; - } - IList> permutations = null; - foreach (var parm in parms) - permutations = CreatePermutations(parm, permutations); - foreach (var permutation in permutations) - { - var rec = new Record(); - rec.Parameters = new Dictionary(); - foreach (var kvp in permutation) - rec.Parameters.Add(kvp.Key, kvp.Value); - foreach (var f in Fields) - { - if (!f.Name.StartsWith("Parameter ")) - { - if (f.Value.StartsWith("==")) - { - // dynamic formula field will be evaluated later - rec.Fields.Add(f.Copy()); - } - else if (f.Value.StartsWith("=")) - { - // static formula field - rec.Fields.Add(CreateStaticFormulaField(f, permutation)); - } - else if (f.Value.Contains("{") && f.Value.Substring(f.Value.IndexOf("{")).Contains("}")) - { - // string interpolation formula - var isDynamic = f.Value.Contains("{{") && f.Value.Substring(f.Value.IndexOf("{{")).Contains("}}"); - var replacedText = f.Value; - if (isDynamic) - replacedText = "=='" + replacedText + "'"; // make it a string - else - replacedText = "='" + replacedText + "'"; // make it a string - replacedText = replacedText.Replace("{{", "' + str("); - replacedText = replacedText.Replace("}}", ") + '"); - replacedText = replacedText.Replace("{", "' + str("); - replacedText = replacedText.Replace("}", ") + '"); - f.Value = replacedText; - if (isDynamic) - throw new NotImplementedException("Dynamic inline formulas are not yet supported."); - else - rec.Fields.Add(CreateStaticFormulaField(f, permutation)); - } - else - { - // plain old field - rec.Fields.Add(f.Copy()); - } - } - } - yield return rec; - } - } - - private static Field CreateStaticFormulaField(Field f, IDictionary args) - { - var variables = args.ToDictionary(kvp => kvp.Key, kvp => (object)kvp.Value); - var result = PythonScriptEngine.EvaluateExpression(f.Value.TrimStart('='), variables).ToStringInvariant(); - var field = new Field(); - field.Name = f.Name; - field.Value = result; - return field; - } - - private IList> CreatePermutations(MetaRecordParameter parm, IList> previous = null) - { - var cur = new List>(); - if (previous == null || previous.Count == 0) - { - for (int i = parm.Minimum; i <= parm.Maximum; i++) - { - var newdict = new Dictionary(); - newdict.Add(parm.Name, i); - cur.Add(newdict); - } - } - else - { - foreach (var dict in previous) - { - for (int i = parm.Minimum; i <= parm.Maximum; i++) - { - var newdict = new Dictionary(); - foreach (var kvp in dict) - newdict.Add(kvp.Key, kvp.Value); - newdict.Add(parm.Name, i); - cur.Add(newdict); - } - } - } - return cur; - } +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.GameState; + +namespace FrEee.Modding; + +/// +/// A record which takes parameters and is capable of generating multiple records using formulas. +/// +public class MetaRecord : Record, ITemplate> +{ + public MetaRecord() + : base() + { } + + /// + /// Creates a record by parsing some string data. + /// + /// + public MetaRecord(IEnumerable lines) + : base(lines) + { } + + public string Filename { get; set; } + + public new IEnumerable Parameters + { + get + { + string expecting = "Name"; + var p = new MetaRecordParameter(); + foreach (var f in Fields.Where(f => f.Name.StartsWith("Parameter "))) + { + var what = f.Name.Substring("Parameter ".Length); + if (expecting == "Name") + { + if (what == "Name") + { + p.Name = f.Value; + expecting = "Minimum"; + } + else + { + Mod.Errors.Add(new DataParsingException("Expected Parameter Name, found Parameter " + what + ".", Filename, this, f)); + yield break; + } + } + else if (expecting == "Minimum") + { + if (what == "Minimum") + { + p.Minimum = f.CreateFormula(p); + expecting = "Maximum"; + } + else if (what == "Maximum") + { + // it's OK, just set minimum to 1 + p.Minimum = 1; + p.Maximum = f.CreateFormula(p); + expecting = "Name"; + yield return p; + p = new MetaRecordParameter(); + } + else + { + Mod.Errors.Add(new DataParsingException("Expected Parameter Minimum or Parameter Maximum, found Parameter " + what + ".", Filename, this, f)); + yield break; + } + } + else if (expecting == "Maximum") + { + if (what == "Maximum") + { + p.Maximum = f.CreateFormula(p); + expecting = "Name"; + yield return p; + p = new MetaRecordParameter(); + } + else + { + Mod.Errors.Add(new DataParsingException("Expected Parameter Maximum, found Parameter " + what + ".", Filename, this, f)); + yield break; + } + } + } + if (expecting != "Name") + Mod.Errors.Add(new DataParsingException("Expected Parameter Minimum or Parameter Maximum but no more parameter fields were found.", Filename, this)); + } + } + + public IEnumerable Instantiate() + { + var parms = Parameters.ToArray(); + if (!parms.Any()) + { + var rec = new Record(); + foreach (var f in Fields) + rec.Fields.Add(f.Copy()); + yield return rec; + yield break; + } + IList> permutations = null; + foreach (var parm in parms) + permutations = CreatePermutations(parm, permutations); + foreach (var permutation in permutations) + { + var rec = new Record(); + rec.Parameters = new Dictionary(); + foreach (var kvp in permutation) + rec.Parameters.Add(kvp.Key, kvp.Value); + foreach (var f in Fields) + { + if (!f.Name.StartsWith("Parameter ")) + { + if (f.Value.StartsWith("==")) + { + // dynamic formula field will be evaluated later + rec.Fields.Add(f.Copy()); + } + else if (f.Value.StartsWith("=")) + { + // static formula field + rec.Fields.Add(CreateStaticFormulaField(f, permutation)); + } + else if (f.Value.Contains("{") && f.Value.Substring(f.Value.IndexOf("{")).Contains("}")) + { + // string interpolation formula + var isDynamic = f.Value.Contains("{{") && f.Value.Substring(f.Value.IndexOf("{{")).Contains("}}"); + var replacedText = f.Value; + if (isDynamic) + replacedText = "=='" + replacedText + "'"; // make it a string + else + replacedText = "='" + replacedText + "'"; // make it a string + replacedText = replacedText.Replace("{{", "' + str("); + replacedText = replacedText.Replace("}}", ") + '"); + replacedText = replacedText.Replace("{", "' + str("); + replacedText = replacedText.Replace("}", ") + '"); + f.Value = replacedText; + if (isDynamic) + throw new NotImplementedException("Dynamic inline formulas are not yet supported."); + else + rec.Fields.Add(CreateStaticFormulaField(f, permutation)); + } + else + { + // plain old field + rec.Fields.Add(f.Copy()); + } + } + } + yield return rec; + } + } + + private static Field CreateStaticFormulaField(Field f, IDictionary args) + { + var variables = args.ToDictionary(kvp => kvp.Key, kvp => (object)kvp.Value); + var result = PythonScriptEngine.EvaluateExpression(f.Value.TrimStart('='), variables).ToStringInvariant(); + var field = new Field(); + field.Name = f.Name; + field.Value = result; + return field; + } + + private IList> CreatePermutations(MetaRecordParameter parm, IList> previous = null) + { + var cur = new List>(); + if (previous == null || previous.Count == 0) + { + for (int i = parm.Minimum; i <= parm.Maximum; i++) + { + var newdict = new Dictionary(); + newdict.Add(parm.Name, i); + cur.Add(newdict); + } + } + else + { + foreach (var dict in previous) + { + for (int i = parm.Minimum; i <= parm.Maximum; i++) + { + var newdict = new Dictionary(); + foreach (var kvp in dict) + newdict.Add(kvp.Key, kvp.Value); + newdict.Add(parm.Name, i); + cur.Add(newdict); + } + } + } + return cur; + } } \ No newline at end of file diff --git a/FrEee/Modding/MetaRecordParameter.cs b/FrEee.Core/Modding/MetaRecordParameter.cs similarity index 95% rename from FrEee/Modding/MetaRecordParameter.cs rename to FrEee.Core/Modding/MetaRecordParameter.cs index 69f71472b..c1bd85c0e 100644 --- a/FrEee/Modding/MetaRecordParameter.cs +++ b/FrEee.Core/Modding/MetaRecordParameter.cs @@ -1,11 +1,11 @@ -namespace FrEee.Modding; - -/// -/// A parameter for a meta record. -/// -public class MetaRecordParameter -{ - public int Maximum { get; set; } - public int Minimum { get; set; } - public string Name { get; set; } +namespace FrEee.Modding; + +/// +/// A parameter for a meta record. +/// +public class MetaRecordParameter +{ + public int Maximum { get; set; } + public int Minimum { get; set; } + public string Name { get; set; } } \ No newline at end of file diff --git a/FrEee/Modding/Mod.cs b/FrEee.Core/Modding/Mod.cs similarity index 96% rename from FrEee/Modding/Mod.cs rename to FrEee.Core/Modding/Mod.cs index 85534b80e..a2c6c3d75 100644 --- a/FrEee/Modding/Mod.cs +++ b/FrEee.Core/Modding/Mod.cs @@ -1,479 +1,481 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using FrEee.Objects.Abilities; -using FrEee.Objects.AI; -using FrEee.Objects.Civilization; -using FrEee.Objects.Space; -using FrEee.Objects.Technology; -using FrEee.Modding.Loaders; -using FrEee.Modding.Templates; -using FrEee.Utility; -using FrEee.Extensions; -using FrEee.Objects.GameState; - -namespace FrEee.Modding; - -/// -/// A set of data files containing templates for game objects. -/// -[Serializable] -public class Mod : IDisposable -{ - public Mod() - { - Current = this; - - Errors = new List(); - - Info = new ModInfo(); - Settings = new ModSettings(); - AbilityRules = new List(); - StarSystemNames = new List(); - DesignRoles = new List(); - Traits = new List(); - Technologies = new List(); - FacilityTemplates = new List(); - Hulls = new List(); - DamageTypes = new List(); - ComponentTemplates = new List(); - Mounts = new List(); - StellarObjectSizes = new List(); - StarSystemTemplates = new List(); - StellarAbilityTemplates = new List(); - GalaxyTemplates = new List(); - StellarObjectTemplates = new List(); - HappinessModels = new List(); - Cultures = new List(); - EmpireAIs = new List>(); - EventTypes = new List(); - EventTemplates = new List(); - - // for redacted colonies - FacilityTemplates.Add(FacilityTemplate.Unknown); - } - - private object locker = new object(); - - /// - /// The currently loaded mod. - /// - public static Mod Current { get; set; } - - /// - /// The file name being loaded. (For error reporting) - /// - public static string CurrentFileName { get; private set; } - - /// - /// Errors encountered when loading the mod. - /// - public static IList Errors { get; private set; } - - /// - /// Rules for grouping and stacking abilities. - /// - public ICollection AbilityRules { get; private set; } - - /// - /// The components in the mod. - /// - public ICollection ComponentTemplates { get; private set; } - - /// - /// The empire cultures in the game. - /// - public ICollection Cultures { get; private set; } - - /// - /// The damage types in the mod. - /// - public ICollection DamageTypes { get; private set; } - - /// - /// Role names to use for vehicle designs. - /// - public ICollection DesignRoles { get; private set; } - - /// - /// The empire AIs in the game. - /// - public ICollection> EmpireAIs { get; private set; } - - /// - /// The script which runs after each turn. - /// - public PythonScript EndTurnScript { get; set; } - - /// - /// The event templates in the mod. - /// - public ICollection EventTemplates { get; private set; } - - /// - /// The event types in the mod. - /// - public ICollection EventTypes { get; private set; } - - /// - /// The facilities in the mod. - /// - public ICollection FacilityTemplates { get; private set; } - - /// - /// Templates for galaxies. - /// - public ICollection GalaxyTemplates { get; private set; } - - /// - /// The script which runs on game initialization, prior to the first turn. - /// - public PythonScript GameInitScript { get; set; } - - /// - /// The global Python script module which is available to all scripts in the mod. - /// - public PythonScript GlobalScript { get; set; } - - /// - /// The happiness models in the game. - /// - public ICollection HappinessModels { get; private set; } - - /// - /// The vehicle hulls in the mod. - /// - public ICollection Hulls { get; private set; } - - /// - /// General info about the mod. - /// - public ModInfo Info { get; set; } - - /// - /// The component mounts in the mod. - /// - public ICollection Mounts { get; private set; } - - private IList objects = new List() { FacilityTemplate.Unknown }; - - /// - /// All mod objects. - /// - public IEnumerable Objects - => objects; - - /// - /// The path to the mod's root folder, relative to the Mods folder. - /// - public string? RootPath { get; set; } - - /// - /// General mod settings. - /// - public ModSettings Settings { get; set; } - - /// - /// Names to use for star systems. - /// - public ICollection StarSystemNames { get; private set; } - - /// - /// Templates for star systems. - /// - public ICollection StarSystemTemplates { get; private set; } - - /// - /// Templates for stellar abilities. - /// - public ICollection StellarAbilityTemplates { get; private set; } - - /// - /// Planet and asteroid field sizes. - /// - public ICollection StellarObjectSizes { get; private set; } - - /// - /// Templates for stellar objects. - /// - public ICollection StellarObjectTemplates { get; private set; } - - /// - /// The technologies in the game. - /// - public ICollection Technologies { get; private set; } - - /// - /// The race/empire traits in the game. - /// - public ICollection Traits { get; private set; } - - /// - /// Names of files containing lists of design names. - /// e.g. Ravager would be loaded from Mods/CurrentMod/Dsgnname/Ravager.txt and also from Dsgnname/Ravager.txt. - /// - public IEnumerable DesignNamesFiles - { - get - { - var list = new List(); - string path; - if (RootPath != null) - { - try - { - path = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", RootPath, "Dsgnname"); - foreach (var f in Directory.GetFiles(path)) - list.Add(Path.GetFileNameWithoutExtension(f)); - } - catch (IOException) - { - // nothing to do, path probably doesn't exist - } - } - path = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Dsgnname"); - foreach (var f in Directory.GetFiles(path)) - list.Add(Path.GetFileNameWithoutExtension(f)); - return list.OrderBy(q => q).Distinct(); - } - } - - /// - /// Loads a mod. - /// - /// The mod root path, relative to the Mods folder. Or null to load the stock mod. - /// Set the current mod to the new mod? - /// A status object to report status back to the GUI. - /// How much progress should we report back to the GUI when we're done loading the mod? 1.0 means all done with everything that needs to be done. - public static Mod Load(string? path, bool setCurrent = true, Status? status = null, double desiredProgress = 1.0) - { - var mod = new Mod(); - mod.RootPath = path; - - if (setCurrent) - Current = mod; - - if (path != null && !Directory.Exists(Path.Combine("Mods", path))) - throw new DirectoryNotFoundException($"Could not find mod {path} in the Mods folder."); - - var loaders = new Dictionary - { - { new ModInfoLoader(path), 0 }, - { new TextLoader(path, "SystemNames.txt", m => m.StarSystemNames), 0 }, - { new DesignRoleLoader(path), 0 }, - { new ScriptLoader(path), 0 }, - { new AbilityRuleLoader(path), 0 }, - { new ModSettingsLoader(path), 0 }, - { new StellarObjectSizeLoader(path), 1 }, - { new StellarAbilityLoader(path), 2 }, - { new StellarObjectLoader(path), 3 }, - { new TraitLoader(path), 1 }, - { new TechnologyLoader(path), 2 }, - { new FacilityLoader(path), 3 }, - { new HullLoader(path), 3 }, - { new DamageTypeLoader(path), 0 }, - { new ComponentLoader(path), 3 }, - { new MountLoader(path), 3 }, - { new StarSystemLoader(path), 3 }, - { new GalaxyLoader(path), 4 }, - { new HappinessModelLoader(path), 0 }, - { new CultureLoader(path), 0 }, - { new EmpireAILoader(path) , 0 }, - { new EventTypeLoader(path), 0 }, - { new EventLoader(path), 1 }, - }; - - var progressPerFile = (desiredProgress - (status == null ? 0 : status.Progress)) / loaders.Count; - - var used = new HashSet(); - - var minPriority = loaders.Values.Min(); - var maxPriority = loaders.Values.Max(); - - for (var p = minPriority; p <= maxPriority; p++) - { - var files = loaders.Where(q => q.Value == p).Select(q => q.Key.FileName); - CurrentFileName = string.Join(" / ", files); - if (status != null) - status.Message = "Loading " + CurrentFileName; - - loaders.Where(q => q.Value == p).ParallelSafeForeach(loader => - { - foreach (var mo in loader.Key.Load(mod).ToArray()) - { - mod.AssignID(mo, used); - } - if (status != null) - status.Progress += progressPerFile; - }); - } - - CurrentFileName = null; - - var dupes = mod.Objects.GroupBy(o => o.ModID).Where(g => g.Count() > 1); - if (dupes.Any()) - throw new Exception("Multiple objects with mod ID {0} found ({1} total IDs with duplicates)".F(dupes.First().Key, dupes.Count())); - - return mod; - } - - public void AssignID(IModObject mo, ICollection used) - { - if (mo.ModID != null) - return; - lock (locker) - { - var fullname = mo.GetType().Name + " " + mo.Name; - if (mo.Name != null && !used.Contains(fullname)) - { - mo.ModID = fullname; - used.Add(mo.ModID); - } - else - { - // tack a number on - int lastnum; - string name; - if (mo.Name == null) - name = "Generic " + mo.GetType().Name; - else - name = mo.GetType().Name + " " + mo.Name; - var lastword = name.LastWord(); - if (int.TryParse(lastword, out lastnum)) - { - // has a number, count from that number - } - else - { - lastnum = -1; // no number, start from 1 - } - for (var num = lastnum + 1; num <= int.MaxValue; num++) - { - string exceptnum; - if (lastnum < 0 && num == 0) - { - exceptnum = name; - num = 1; - } - else if (lastnum < 0) - exceptnum = name; - else - exceptnum = name.Substring(0, name.Length - lastword.Length - 1); - var withnextnum = exceptnum + " " + num; - if (!used.Contains(withnextnum)) - { - mo.ModID = withnextnum; - used.Add(withnextnum); - break; - } - if (num == int.MaxValue) - throw new Exception("Can't assign mod ID to " + name + "; there's a gazillion other mod objects with that name."); - } - } - - if (mo.ModID == null) - throw new Exception("Failed to assign mod ID to {0}: {1}".F(mo.GetType(), mo)); - - if (!objects.Contains(mo)) - objects.Add(mo); - } - } - - /// - /// Assigns automatic IDs to all objects in the mod that lack IDs. - /// - public void AssignIDs() - { - var used = new HashSet(); - foreach (var mo in Objects) - { - if (mo.ModID == null) - AssignID(mo, used); - var dupes = Objects.Where(q => q.ModID == mo.ModID); // with same mod ID - if (dupes.Count() > 1) - { - foreach (var dupe in dupes) - dupe.ModID = dupe.GetType().Name + " " + dupe.ModID; - } - } - } - - public void Dispose() - { - foreach (var r in AbilityRules.ToArray()) - r.Dispose(); - foreach (var sos in StellarObjectSizes.ToArray()) - sos.Dispose(); - foreach (var x in StellarAbilityTemplates.ToArray()) - x.Dispose(); - foreach (var sot in StellarObjectTemplates.ToArray()) - sot.Dispose(); - foreach (var t in Traits.ToArray()) - t.Dispose(); - foreach (var t in Technologies.ToArray()) - t.Dispose(); - foreach (var f in FacilityTemplates.ToArray()) - f.Dispose(); - foreach (var h in Hulls.ToArray()) - h.Dispose(); - foreach (var c in ComponentTemplates.ToArray()) - c.Dispose(); - foreach (var m in Mounts.ToArray()) - m.Dispose(); - foreach (var sst in StarSystemTemplates.ToArray()) - sst.Dispose(); - foreach (var gt in GalaxyTemplates.ToArray()) - gt.Dispose(); - foreach (var h in HappinessModels.ToArray()) - h.Dispose(); - foreach (var c in Cultures.ToArray()) - c.Dispose(); - foreach (var ai in EmpireAIs.ToArray()) - ai.Dispose(); - if (this == Current) - Current = null; - } - - /// - /// Do these ability names refer to the same ability, using aliases? - /// - /// - /// - /// - public bool DoAbilityNamesMatch(string n1, string n2) - { - if (n1 == n2) - return true; - var r1 = FindAbilityRule(n1); - var r2 = FindAbilityRule(n2); - return r1 != null && r2 != null && r1 == r2; - } - - public T? Find(string modid) - where T : IModObject - { - T? result = default; - lock (locker) - { - result = Objects.OfType().SingleOrDefault(q => q.ModID == modid); - } - return result; - } - - /// - /// Finds an ability rule by name or alias. - /// - /// - /// - public AbilityRule FindAbilityRule(string name) - { - return AbilityRules.SingleOrDefault(r => r.Matches(name)); - } - - public override string ToString() - { - return RootPath ?? ""; - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using FrEee.Objects.Civilization; +using FrEee.Objects.Space; +using FrEee.Objects.Technology; +using FrEee.Modding.Loaders; +using FrEee.Modding.Templates; +using FrEee.Utility; +using FrEee.Extensions; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.AI; +using FrEee.Modding.Abilities; + +namespace FrEee.Modding; + +/// +/// A set of data files containing templates for game objects. +/// +[Serializable] +public class Mod : IDisposable +{ + public Mod() + { + Current = this; + + Errors = new List(); + + Info = new ModInfo(); + Settings = new ModSettings(); + AbilityRules = new List(); + StarSystemNames = new List(); + DesignRoles = new List(); + Traits = new List(); + Technologies = new List(); + FacilityTemplates = new List(); + Hulls = new List(); + DamageTypes = new List(); + ComponentTemplates = new List(); + Mounts = new List(); + StellarObjectSizes = new List(); + StarSystemTemplates = new List(); + StellarAbilityTemplates = new List(); + GalaxyTemplates = new List(); + StellarObjectTemplates = new List(); + HappinessModels = new List(); + Cultures = new List(); + EmpireAIs = new List>(); + EventTypes = new List(); + EventTemplates = new List(); + + // for redacted colonies + FacilityTemplates.Add(FacilityTemplate.Unknown); + } + + private object locker = new object(); + + /// + /// The currently loaded mod. + /// + public static Mod Current { get; set; } + + /// + /// The file name being loaded. (For error reporting) + /// + public static string CurrentFileName { get; private set; } + + /// + /// Errors encountered when loading the mod. + /// + public static IList Errors { get; private set; } + + /// + /// Rules for grouping and stacking abilities. + /// + public ICollection AbilityRules { get; private set; } + + /// + /// The components in the mod. + /// + public ICollection ComponentTemplates { get; private set; } + + /// + /// The empire cultures in the game. + /// + public ICollection Cultures { get; private set; } + + /// + /// The damage types in the mod. + /// + public ICollection DamageTypes { get; private set; } + + /// + /// Role names to use for vehicle designs. + /// + public ICollection DesignRoles { get; private set; } + + /// + /// The empire AIs in the game. + /// + public ICollection> EmpireAIs { get; private set; } + + /// + /// The script which runs after each turn. + /// + public PythonScript EndTurnScript { get; set; } + + /// + /// The event templates in the mod. + /// + public ICollection EventTemplates { get; private set; } + + /// + /// The event types in the mod. + /// + public ICollection EventTypes { get; private set; } + + /// + /// The facilities in the mod. + /// + public ICollection FacilityTemplates { get; private set; } + + /// + /// Templates for galaxies. + /// + public ICollection GalaxyTemplates { get; private set; } + + /// + /// The script which runs on game initialization, prior to the first turn. + /// + public PythonScript GameInitScript { get; set; } + + /// + /// The global Python script module which is available to all scripts in the mod. + /// + public PythonScript GlobalScript { get; set; } + + /// + /// The happiness models in the game. + /// + public ICollection HappinessModels { get; private set; } + + /// + /// The vehicle hulls in the mod. + /// + public ICollection Hulls { get; private set; } + + /// + /// General info about the mod. + /// + public ModInfo Info { get; set; } + + /// + /// The component mounts in the mod. + /// + public ICollection Mounts { get; private set; } + + private IList objects = new List() { FacilityTemplate.Unknown }; + + /// + /// All mod objects. + /// + public IEnumerable Objects + => objects; + + /// + /// The path to the mod's root folder, relative to the Mods folder. + /// + public string? RootPath { get; set; } + + /// + /// General mod settings. + /// + public ModSettings Settings { get; set; } + + /// + /// Names to use for star systems. + /// + public ICollection StarSystemNames { get; private set; } + + /// + /// Templates for star systems. + /// + public ICollection StarSystemTemplates { get; private set; } + + /// + /// Templates for stellar abilities. + /// + public ICollection StellarAbilityTemplates { get; private set; } + + /// + /// Planet and asteroid field sizes. + /// + public ICollection StellarObjectSizes { get; private set; } + + /// + /// Templates for stellar objects. + /// + public ICollection StellarObjectTemplates { get; private set; } + + /// + /// The technologies in the game. + /// + public ICollection Technologies { get; private set; } + + /// + /// The race/empire traits in the game. + /// + public ICollection Traits { get; private set; } + + /// + /// Names of files containing lists of design names. + /// e.g. Ravager would be loaded from Mods/CurrentMod/Dsgnname/Ravager.txt and also from Dsgnname/Ravager.txt. + /// + public IEnumerable DesignNamesFiles + { + get + { + var list = new List(); + string path; + if (RootPath != null) + { + try + { + path = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", RootPath, "Dsgnname"); + foreach (var f in Directory.GetFiles(path)) + list.Add(Path.GetFileNameWithoutExtension(f)); + } + catch (IOException) + { + // nothing to do, path probably doesn't exist + } + } + path = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Dsgnname"); + foreach (var f in Directory.GetFiles(path)) + list.Add(Path.GetFileNameWithoutExtension(f)); + return list.OrderBy(q => q).Distinct(); + } + } + + /// + /// Loads a mod. + /// + /// The mod root path, relative to the Mods folder. Or null to load the stock mod. + /// Set the current mod to the new mod? + /// A status object to report status back to the GUI. + /// How much progress should we report back to the GUI when we're done loading the mod? 1.0 means all done with everything that needs to be done. + public static Mod Load(string? path, bool setCurrent = true, Status? status = null, double desiredProgress = 1.0) + { + var mod = new Mod(); + mod.RootPath = path; + + if (setCurrent) + Current = mod; + + if (path != null && !Directory.Exists(Path.Combine("Mods", path))) + throw new DirectoryNotFoundException($"Could not find mod {path} in the Mods folder."); + + var loaders = new Dictionary + { + { new ModInfoLoader(path), 0 }, + { new TextLoader(path, "SystemNames.txt", m => m.StarSystemNames), 0 }, + { new DesignRoleLoader(path), 0 }, + { new ScriptLoader(path), 0 }, + { new AbilityRuleLoader(path), 0 }, + { new ModSettingsLoader(path), 0 }, + { new StellarObjectSizeLoader(path), 1 }, + { new StellarAbilityLoader(path), 2 }, + { new StellarObjectLoader(path), 3 }, + { new TraitLoader(path), 1 }, + { new TechnologyLoader(path), 2 }, + { new FacilityLoader(path), 3 }, + { new HullLoader(path), 3 }, + { new DamageTypeLoader(path), 0 }, + { new ComponentLoader(path), 3 }, + { new MountLoader(path), 3 }, + { new StarSystemLoader(path), 3 }, + { new GalaxyLoader(path), 4 }, + { new HappinessModelLoader(path), 0 }, + { new CultureLoader(path), 0 }, + { new EmpireAILoader(path) , 0 }, + { new EventTypeLoader(path), 0 }, + { new EventLoader(path), 1 }, + }; + + var progressPerFile = (desiredProgress - (status == null ? 0 : status.Progress)) / loaders.Count; + + var used = new HashSet(); + + var minPriority = loaders.Values.Min(); + var maxPriority = loaders.Values.Max(); + + for (var p = minPriority; p <= maxPriority; p++) + { + var files = loaders.Where(q => q.Value == p).Select(q => q.Key.FileName); + CurrentFileName = string.Join(" / ", files); + if (status != null) + status.Message = "Loading " + CurrentFileName; + + loaders.Where(q => q.Value == p).ParallelSafeForeach(loader => + { + foreach (var mo in loader.Key.Load(mod).ToArray()) + { + mod.AssignID(mo, used); + } + if (status != null) + status.Progress += progressPerFile; + }); + } + + CurrentFileName = null; + + var dupes = mod.Objects.GroupBy(o => o.ModID).Where(g => g.Count() > 1); + if (dupes.Any()) + throw new Exception("Multiple objects with mod ID {0} found ({1} total IDs with duplicates)".F(dupes.First().Key, dupes.Count())); + + return mod; + } + + public void AssignID(IModObject mo, ICollection used) + { + if (mo.ModID != null) + return; + lock (locker) + { + var fullname = mo.GetType().Name + " " + mo.Name; + if (mo.Name != null && !used.Contains(fullname)) + { + mo.ModID = fullname; + used.Add(mo.ModID); + } + else + { + // tack a number on + int lastnum; + string name; + if (mo.Name == null) + name = "Generic " + mo.GetType().Name; + else + name = mo.GetType().Name + " " + mo.Name; + var lastword = name.LastWord(); + if (int.TryParse(lastword, out lastnum)) + { + // has a number, count from that number + } + else + { + lastnum = -1; // no number, start from 1 + } + for (var num = lastnum + 1; num <= int.MaxValue; num++) + { + string exceptnum; + if (lastnum < 0 && num == 0) + { + exceptnum = name; + num = 1; + } + else if (lastnum < 0) + exceptnum = name; + else + exceptnum = name.Substring(0, name.Length - lastword.Length - 1); + var withnextnum = exceptnum + " " + num; + if (!used.Contains(withnextnum)) + { + mo.ModID = withnextnum; + used.Add(withnextnum); + break; + } + if (num == int.MaxValue) + throw new Exception("Can't assign mod ID to " + name + "; there's a gazillion other mod objects with that name."); + } + } + + if (mo.ModID == null) + throw new Exception("Failed to assign mod ID to {0}: {1}".F(mo.GetType(), mo)); + + if (!objects.Contains(mo)) + objects.Add(mo); + } + } + + /// + /// Assigns automatic IDs to all objects in the mod that lack IDs. + /// + public void AssignIDs() + { + var used = new HashSet(); + foreach (var mo in Objects) + { + if (mo.ModID == null) + AssignID(mo, used); + var dupes = Objects.Where(q => q.ModID == mo.ModID); // with same mod ID + if (dupes.Count() > 1) + { + foreach (var dupe in dupes) + dupe.ModID = dupe.GetType().Name + " " + dupe.ModID; + } + } + } + + public void Dispose() + { + foreach (var r in AbilityRules.ToArray()) + r.Dispose(); + foreach (var sos in StellarObjectSizes.ToArray()) + sos.Dispose(); + foreach (var x in StellarAbilityTemplates.ToArray()) + x.Dispose(); + foreach (var sot in StellarObjectTemplates.ToArray()) + sot.Dispose(); + foreach (var t in Traits.ToArray()) + t.Dispose(); + foreach (var t in Technologies.ToArray()) + t.Dispose(); + foreach (var f in FacilityTemplates.ToArray()) + f.Dispose(); + foreach (var h in Hulls.ToArray()) + h.Dispose(); + foreach (var c in ComponentTemplates.ToArray()) + c.Dispose(); + foreach (var m in Mounts.ToArray()) + m.Dispose(); + foreach (var sst in StarSystemTemplates.ToArray()) + sst.Dispose(); + foreach (var gt in GalaxyTemplates.ToArray()) + gt.Dispose(); + foreach (var h in HappinessModels.ToArray()) + h.Dispose(); + foreach (var c in Cultures.ToArray()) + c.Dispose(); + foreach (var ai in EmpireAIs.ToArray()) + ai.Dispose(); + if (this == Current) + Current = null; + } + + /// + /// Do these ability names refer to the same ability, using aliases? + /// + /// + /// + /// + public bool DoAbilityNamesMatch(string n1, string n2) + { + if (n1 == n2) + return true; + var r1 = FindAbilityRule(n1); + var r2 = FindAbilityRule(n2); + return r1 != null && r2 != null && r1 == r2; + } + + public T? Find(string modid) + where T : IModObject + { + T? result = default; + lock (locker) + { + result = Objects.OfType().SingleOrDefault(q => q.ModID == modid); + } + return result; + } + + /// + /// Finds an ability rule by name or alias. + /// + /// + /// + public AbilityRule FindAbilityRule(string name) + { + return AbilityRules.SingleOrDefault(r => r.Matches(name)); + } + + public override string ToString() + { + return RootPath ?? ""; + } +} diff --git a/FrEee/Modding/ModInfo.cs b/FrEee.Core/Modding/ModInfo.cs similarity index 95% rename from FrEee/Modding/ModInfo.cs rename to FrEee.Core/Modding/ModInfo.cs index 4006ea1a7..b75459fff 100644 --- a/FrEee/Modding/ModInfo.cs +++ b/FrEee.Core/Modding/ModInfo.cs @@ -1,54 +1,54 @@ -using FrEee.Objects.GameState; - -namespace FrEee.Modding; - -/// -/// General info about a mod. -/// -public class ModInfo : INamed -{ - /// - /// The mod's author. - /// - public string Author { get; set; } - - /// - /// Description of the mod. - /// - public string Description { get; set; } - - /// - /// The author's email address. - /// - public string Email { get; set; } - - /// - /// The folder that the mod was loaded from (relative to the Mods folder), or null if it's the stock mod. - /// - public string Folder { get; set; } - - /// - /// Is this mod version obsolete? - /// - public bool IsObsolete { get; set; } - - /// - /// The name of this mod. - /// - public string Name { get; set; } - - /// - /// The mod version. - /// - public string Version { get; set; } - - /// - /// The mod's website address. - /// - public string Website { get; set; } - - public override string ToString() - { - return Name + " " + Version; - } +using FrEee.Objects.GameState; + +namespace FrEee.Modding; + +/// +/// General info about a mod. +/// +public class ModInfo : INamed +{ + /// + /// The mod's author. + /// + public string Author { get; set; } + + /// + /// Description of the mod. + /// + public string Description { get; set; } + + /// + /// The author's email address. + /// + public string Email { get; set; } + + /// + /// The folder that the mod was loaded from (relative to the Mods folder), or null if it's the stock mod. + /// + public string Folder { get; set; } + + /// + /// Is this mod version obsolete? + /// + public bool IsObsolete { get; set; } + + /// + /// The name of this mod. + /// + public string Name { get; set; } + + /// + /// The mod version. + /// + public string Version { get; set; } + + /// + /// The mod's website address. + /// + public string Website { get; set; } + + public override string ToString() + { + return Name + " " + Version; + } } \ No newline at end of file diff --git a/FrEee.Core/Modding/ModProgress.cs b/FrEee.Core/Modding/ModProgress.cs new file mode 100644 index 000000000..6cb90cf28 --- /dev/null +++ b/FrEee.Core/Modding/ModProgress.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Utility; + +namespace FrEee.Modding +{ + public class ModProgress : Utility.Progress, T> + where T : IModObject + { + public ModProgress(T item, long value, long maximum, long incrementalProgressBeforeDelay = 0, double? delay = 0, long extraIncrementalProgressAfterDelay = 0) + : base(item, value, maximum, incrementalProgressBeforeDelay, delay, extraIncrementalProgressAfterDelay) + { + } + } +} diff --git a/FrEee/Modding/ModReference.cs b/FrEee.Core/Modding/ModReference.cs similarity index 96% rename from FrEee/Modding/ModReference.cs rename to FrEee.Core/Modding/ModReference.cs index 01b1a9bd9..d7dee1a0a 100644 --- a/FrEee/Modding/ModReference.cs +++ b/FrEee.Core/Modding/ModReference.cs @@ -1,146 +1,147 @@ -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Serialization; -using FrEee.Objects.GameState; - -namespace FrEee.Modding; - -/// -/// A lightweight reference to some object in the current mod. -/// Can be passed around on the network as a surrogate for said object. -/// This class should be used when referencing a mod object from the actual game. -/// It is not necessary to use ModReference when referring to mod objects from other mod objects. -/// Only mod objects can be referenced via mod references. -/// -/// -[Serializable] -public class ModReference : IReference where T : IModObject -{ - public ModReference() - { - cache = new ClientSideCache(() => - { - if (string.IsNullOrWhiteSpace(ID)) - return default(T); - var obj = Mod.Current.Find(ID); - if (obj == null) - obj = Mod.Current.Objects.OfType().FirstOrDefault(q => q.Name == ID); - if (obj == null) - return default(T); - if (obj.IsDisposed) - return default(T); - return obj; - }) - { IsServerSideCacheEnabled = true }; - } - - public ModReference(T t) - : this() - { - var mobj = (IModObject)t; - if (Mod.Current == null) - throw new ReferenceException("Can't create a reference to an IModObject without a mod."); - else if (t == null) - ID = ""; // dictionaries don't like null keys - else if (mobj.ModID != null) - ID = mobj.ModID; - else - throw new ReferenceException("Can't create a reference to {0} because it has no ID in the current mod.".F(mobj)); - if (!HasValue) - throw new ArgumentException("{0} does not exist in the current mod so it cannot be referenced.".F(t)); - } - - public ModReference(string id) - : this() - { - if (Mod.Current == null) - throw new ReferenceException("Can't create a reference to an IModObject without a mod."); - else if (Mod.Current.Find(id) is T) - ID = id; - else - throw new Exception("Object with ID " + id + " is not a " + typeof(T) + "."); - } - - /// - /// Does the reference have a valid value? - /// - public bool HasValue - { - get - { - // blank ID's are null objects, which are perfectly cromulent - return string.IsNullOrWhiteSpace(ID) || Value != null; - } - } - - public string ID { get; private set; } - - /// - /// Resolves the reference. - /// - /// - public T Value - { - get - { - var val = cache.Value; - if (val == null) - return default(T); - return val; - } - } - - private ClientSideCache cache; - - public static implicit operator ModReference(T t) - { - if (t == null) - return null; - if (t.ModID == null) - { - // HACK - why are my items not registered in the mod? does it have something to do with formulas and leveled templates? - Mod.Current.AssignID(t, Mod.Current.Objects.Select(q => q.ModID).ToList()); - } - return new ModReference(t); - } - - public static implicit operator T(ModReference r) - { - if (r == null) - return default(T); - return r.Value; - } - - public override bool Equals(object? obj) - { - var mref = obj as ModReference; - if (mref == null) - return false; - return ID == mref.ID; - } - - public override int GetHashCode() - { - return ID == null || ID == "" ? 0 : ID.GetHashCode(); - } - - public void ReplaceClientIDs(IDictionary idmap, ISet done = null) - { - if (done == null) - done = new HashSet(); - if (!done.Contains(this)) - { - done.Add(this); - if (HasValue && Value is IPromotable) - ((IPromotable)Value).ReplaceClientIDs(idmap, done); - } - } - - public override string ToString() - { - return "Mod ID=" + ID + ", Value=" + Value; - } -} +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Serialization; +using FrEee.Objects.GameState; +using FrEee.Extensions; + +namespace FrEee.Modding; + +/// +/// A lightweight reference to some object in the current mod. +/// Can be passed around on the network as a surrogate for said object. +/// This class should be used when referencing a mod object from the actual game. +/// It is not necessary to use ModReference when referring to mod objects from other mod objects. +/// Only mod objects can be referenced via mod references. +/// +/// +[Serializable] +public class ModReference : IReference where T : IModObject +{ + public ModReference() + { + cache = new ClientSideCache(() => + { + if (string.IsNullOrWhiteSpace(ID)) + return default(T); + var obj = Mod.Current.Find(ID); + if (obj == null) + obj = Mod.Current.Objects.OfType().FirstOrDefault(q => q.Name == ID); + if (obj == null) + return default(T); + if (obj.IsDisposed) + return default(T); + return obj; + }) + { IsServerSideCacheEnabled = true }; + } + + public ModReference(T t) + : this() + { + var mobj = (IModObject)t; + if (Mod.Current == null) + throw new ReferenceException("Can't create a reference to an IModObject without a mod."); + else if (t == null) + ID = ""; // dictionaries don't like null keys + else if (mobj.ModID != null) + ID = mobj.ModID; + else + throw new ReferenceException("Can't create a reference to {0} because it has no ID in the current mod.".F(mobj)); + if (!HasValue) + throw new ArgumentException("{0} does not exist in the current mod so it cannot be referenced.".F(t)); + } + + public ModReference(string id) + : this() + { + if (Mod.Current == null) + throw new ReferenceException("Can't create a reference to an IModObject without a mod."); + else if (Mod.Current.Find(id) is T) + ID = id; + else + throw new Exception("Object with ID " + id + " is not a " + typeof(T) + "."); + } + + /// + /// Does the reference have a valid value? + /// + public bool HasValue + { + get + { + // blank ID's are null objects, which are perfectly cromulent + return string.IsNullOrWhiteSpace(ID) || Value != null; + } + } + + public string ID { get; private set; } + + /// + /// Resolves the reference. + /// + /// + public T Value + { + get + { + var val = cache.Value; + if (val == null) + return default(T); + return val; + } + } + + private ClientSideCache cache; + + public static implicit operator ModReference(T t) + { + if (t == null) + return null; + if (t.ModID == null) + { + // HACK - why are my items not registered in the mod? does it have something to do with formulas and leveled templates? + Mod.Current.AssignID(t, Mod.Current.Objects.Select(q => q.ModID).ToList()); + } + return new ModReference(t); + } + + public static implicit operator T(ModReference r) + { + if (r == null) + return default(T); + return r.Value; + } + + public override bool Equals(object? obj) + { + var mref = obj as ModReference; + if (mref == null) + return false; + return ID == mref.ID; + } + + public override int GetHashCode() + { + return ID == null || ID == "" ? 0 : ID.GetHashCode(); + } + + public void ReplaceClientIDs(IDictionary idmap, ISet done = null) + { + if (done == null) + done = new HashSet(); + if (!done.Contains(this)) + { + done.Add(this); + if (HasValue && Value is IPromotable) + ((IPromotable)Value).ReplaceClientIDs(idmap, done); + } + } + + public override string ToString() + { + return "Mod ID=" + ID + ", Value=" + Value; + } +} diff --git a/FrEee.Core/Modding/ModReferenceKeyedDictionary.cs b/FrEee.Core/Modding/ModReferenceKeyedDictionary.cs new file mode 100644 index 000000000..a9a0733b7 --- /dev/null +++ b/FrEee.Core/Modding/ModReferenceKeyedDictionary.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Extensions; +using FrEee.Serialization; +using FrEee.Utility; + +namespace FrEee.Modding; + +public class ModReferenceKeyedDictionary : ReferenceKeyedDictionary, TKey, TValue> + where TKey : IModObject +{ + private SafeDictionary dict = new(); + + protected override string ExtractID(TKey key) + { + return key.ModID; + } + + protected override TKey LookUp(string id) + { + if (!dict.ContainsKey(id)) + dict[id] = Mod.Current.Find(id); + return dict[id]; + } +} \ No newline at end of file diff --git a/FrEee.Core/Modding/ModReferenceList.cs b/FrEee.Core/Modding/ModReferenceList.cs new file mode 100644 index 000000000..423fd3d63 --- /dev/null +++ b/FrEee.Core/Modding/ModReferenceList.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Modding; +using FrEee.Serialization; +using FrEee.Objects.GameState; + +namespace FrEee.Modding +{ + public class ModReferenceList + : ReferenceList, T> + where T : IModObject + { + } +} diff --git a/FrEee.Core/Modding/ModReferenceSet.cs b/FrEee.Core/Modding/ModReferenceSet.cs new file mode 100644 index 000000000..50aecea2f --- /dev/null +++ b/FrEee.Core/Modding/ModReferenceSet.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Modding; +using FrEee.Serialization; +using FrEee.Objects.GameState; + +namespace FrEee.Modding +{ + [Serializable] + public class ModReferenceSet + : ReferenceSet, T> + where T : IModObject + { + public ModReferenceSet() + : base() + { + } + + public ModReferenceSet(IEnumerable objs) + : base(objs) + { + } + } +} diff --git a/FrEee/Modding/ModSettings.cs b/FrEee.Core/Modding/ModSettings.cs similarity index 96% rename from FrEee/Modding/ModSettings.cs rename to FrEee.Core/Modding/ModSettings.cs index 004f3377b..eab1241c8 100644 --- a/FrEee/Modding/ModSettings.cs +++ b/FrEee.Core/Modding/ModSettings.cs @@ -1,595 +1,596 @@ -using FrEee.Objects.Civilization; -using FrEee.Utility; -using FrEee.Serialization; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.Space; - -namespace FrEee.Modding; - -/// -/// General settings for a mod. -/// -public class ModSettings -{ - public ModSettings() - { - DefaultColonyConstructionRate = new ResourceQuantity(); - // TODO - moddable default colony construction rate - DefaultColonyConstructionRate.Add(Resource.Minerals, 2000); - DefaultColonyConstructionRate.Add(Resource.Organics, 2000); - DefaultColonyConstructionRate.Add(Resource.Radioactives, 2000); - - PopulationModifiers = new SortedDictionary(); - - // TODO - split apart production and construction modifiers as a mod option? - MoodProductivityModifiers = new Dictionary(); - - // TODO - moddable mood reproduction modifiers - MoodReproductionModifiers = new Dictionary(); - MoodReproductionModifiers.Add(Mood.Rioting, -999); - MoodReproductionModifiers.Add(Mood.Angry, -5); - MoodReproductionModifiers.Add(Mood.Unhappy, -2); - MoodReproductionModifiers.Add(Mood.Indifferent, 0); - MoodReproductionModifiers.Add(Mood.Happy, 2); - MoodReproductionModifiers.Add(Mood.Jubilant, 5); - MoodReproductionModifiers.Add(Mood.Emotionless, 2); - - // TODO - moddable mood construction modifiers - MoodConstructionModifiers = new Dictionary(); - MoodConstructionModifiers.Add(Mood.Rioting, 0); - MoodConstructionModifiers.Add(Mood.Angry, 100); - MoodConstructionModifiers.Add(Mood.Unhappy, 100); - MoodConstructionModifiers.Add(Mood.Indifferent, 100); - MoodConstructionModifiers.Add(Mood.Happy, 100); - MoodConstructionModifiers.Add(Mood.Jubilant, 100); - MoodConstructionModifiers.Add(Mood.Emotionless, 100); - - // TODO - moddable mood thresholds - MoodThresholds = new Dictionary(); - MoodThresholds.Add(Mood.Rioting, 750); - MoodThresholds.Add(Mood.Angry, 600); - MoodThresholds.Add(Mood.Unhappy, 450); - MoodThresholds.Add(Mood.Indifferent, 300); - MoodThresholds.Add(Mood.Happy, 150); - MoodThresholds.Add(Mood.Jubilant, 0); - - // TODO - moddable planetary conditions thresholds - ConditionsThresholds = new Dictionary(); - ConditionsThresholds.Add(Conditions.Deadly, 0); - ConditionsThresholds.Add(Conditions.Harsh, 20); - ConditionsThresholds.Add(Conditions.Unpleasant, 35); - ConditionsThresholds.Add(Conditions.Average, 50); - ConditionsThresholds.Add(Conditions.Mild, 65); - ConditionsThresholds.Add(Conditions.Good, 80); - ConditionsThresholds.Add(Conditions.Optimal, 95); - - // TODO - moddable planetary conditions modifiers - ConditionsReproductionModifiers = new Dictionary(); - ConditionsReproductionModifiers.Add(Conditions.Deadly, -20); - ConditionsReproductionModifiers.Add(Conditions.Harsh, -5); - ConditionsReproductionModifiers.Add(Conditions.Unpleasant, -2); - ConditionsReproductionModifiers.Add(Conditions.Average, 0); - ConditionsReproductionModifiers.Add(Conditions.Mild, 2); - ConditionsReproductionModifiers.Add(Conditions.Good, 5); - ConditionsReproductionModifiers.Add(Conditions.Optimal, 8); - - IntroSongs = new List(); - GameplaySongs = new List(); - CombatSongs = new List(); - VictorySongs = new List(); - DefeatSongs = new List(); - - VictoryPictures = new List(); - DefeatPictures = new List(); - - ValueChangeFrequency = 10; - } - - /// - /// Racial aptitudes. - /// - public IEnumerable Aptitudes { get { return Aptitude.All; } } - - /// - /// Population of the colony ship crew's race to spawn on colonization. - /// - public long AutomaticColonizationPopulation { get; set; } - - /// - /// Can bases join fleets? - /// - public bool BasesCanJoinFleets { get; set; } - - /// - /// Can a colonizer component be added via retrofit? - /// - public bool CanAddColonizerViaRetrofit { get; set; } - - /// - /// Can a spaceyard component be added via retrofit? - /// - public bool CanAddSpaceyardViaRetrofit { get; set; } - - /// - /// Additional reload time for weapons on a captured ship. - /// - public int CapturedShipReloadDelay { get; set; } - - /// - /// Music tracks for combat. - /// - public IList CombatSongs { get; private set; } - - /// - /// Percentage of strategic speed that's applied to combat speed. - /// - public int CombatSpeedPercentPerStrategicSpeed { get; set; } - - /// - /// Cooperative research treaty breakthrough chance. - /// - public double CooperativeResearchBreakthroughChance { get; set; } - - /// - /// Maximum sight obscuration level for artificial storms. - /// - public int CreatedStormMaxCloakLevel { get; set; } - - /// - /// Maximum damage for artificial storms. - /// - public int CreatedStormMaxDamage { get; set; } - - /// - /// Maximum shield disruption for artificial storms. - /// - public int CreatedStormMaxShieldDisruption { get; set; } - - /// - /// The construction rate for colonies lacking a spaceyard. - /// - public ResourceQuantity DefaultColonyConstructionRate { get; set; } - - /// - /// Pictures for defeat. - /// - public IList DefeatPictures { get; set; } - - /// - /// Music tracks for defeat. - /// - public IList DefeatSongs { get; private set; } - - /// - /// Automatic supply drain each turn for drones. - /// - public int DroneSupplyDrain { get; set; } - - /// - /// Percentage of normal rate for emergency build. - /// - public int EmergencyBuildRate { get; set; } - - /// - /// High event frequency, chance per 1000 per player for an event each turns - /// - public double EventFrequencyHigh { get; set; } - - /// - /// Low event frequency, chance per 1000 per player for an event each turns - /// - public double EventFrequencyLow { get; set; } - - /// - /// Medium event frequency, chance per 1000 per player for an event each turns - /// - public double EventFrequencyMedium { get; set; } - - /// - /// Standard maintenance cost for facilities (%/turn). - /// - public int FacilityMaintenanceRate { get; set; } - - /// - /// Automatic supply drain each turn for fighters. - /// - public int FighterSupplyDrain { get; set; } - - /// - /// Music tracks for gameplay. - /// - public IList GameplaySongs { get; private set; } - - /// - /// Loss of conditions of glassed planets. - /// - public int GlassedPlanetConditionsLoss { get; set; } - - /// - /// Loss of resource value of glassed planets. - /// - public int GlassedPlanetValueLoss { get; set; } - - /// - /// Percent effectiveness of ground combat weapons. - /// - public int GroundCombatDamagePercent { get; set; } - - /// - /// Number of turns in ground combat. - /// - public int GroundCombatTurns { get; set; } - - /// - /// Home systems can still produce some resources even without a spaceport. - /// - public int HomeSystemValueWithoutSpaceport { get; set; } - - /// - /// Percent effectiveness of intelligence defense. - /// - public int IntelligenceDefensePercent { get; set; } - - /// - /// Music tracks for the title screen. - /// - public IList IntroSongs { get; private set; } - - /// - /// Below this much supply a ship gets a low supply warning. - /// - public int LowSupplyWarningAmount { get; set; } - - /// - /// Below this % supply a ship gets a low supply warning. - /// - public int LowSupplyWarningPercent { get; set; } - - /// - /// Maintenance deficit required to destroy one ship per turn. - /// - public int MaintenanceDeficitToDestroyOneShip { get; set; } - - // TODO - moddable min/max anger values - public int MaxAnger => 1000; - - // TODO - moddable min/max conditions values - public int MaxConditions => 100; - - /// - /// Maximum number of consecutive turns a queue can be on emergency build. - /// - public int MaxEmergencyBuildTurns { get; set; } - - /// - /// Maximum mines per player per sector. - /// - public int MaxPlayerMinesPerSector { get; set; } - - /// - /// Maximum satellites per player per sector. - /// - public int MaxPlayerSatellitesPerSector { get; set; } - - /// - /// Maximum population for which an "abandon colony" order can be given. - /// - public int MaxPopulationToAbandonColony { get; set; } - - /// - /// Maxiumum trade percentage for treaties. - /// - public double MaxTradePercent { get; set; } - - /// - /// Score percent (of second place player) to trigger Mega Evil Empire on an AI player. - /// - public int MegaEvilEmpireAIScorePercent { get; set; } - - /// - /// Does the AI use Mega Evil Empire to gang up on the leading player? - /// - public bool MegaEvilEmpireEnabled { get; set; } - - /// - /// Score percent (of second place player) to trigger Mega Evil Empire on a human player. - /// - public int MegaEvilEmpireHumanScorePercent { get; set; } - - /// - /// Score threshold to trigger Mega Evil Empire. - /// - public int MegaEvilEmpireScoreThreshold { get; set; } - - /// - /// Damage inflicted when a militia unit attacks. - /// - public int MilitiaFirepower { get; set; } - - /// - /// Hitpoints of a militia unit. - /// - public int MilitiaHitpoints { get; set; } - - // TODO - moddable min/max anger values (or place in game setup) - public int MinAnger => 0; - - // TODO - moddable min/max planetary conditions values (or place in game setup) - public int MinConditions => 0; - - // TODO - moddable min/max planetary conditions values (or place in game setup) - public int MinRandomPlanetConditions => 20; - - // TODO - moddable min/max planetary conditions values (or place in game setup) - public int MaxRandomPlanetConditions => 100; - - // TODO - moddable homeworld conditions (or place in game setup) - public int HomeworldConditions => 80; - - /// - /// Can drones be affected by mines? - /// - public bool MinesAffectDrones { get; set; } - - /// - /// Can fighters be affected by mines? - /// - public bool MinesAffectFighters { get; set; } - - /// - /// Minimum income for an empire, even if it doesn't have any normal resource income. - /// - public ResourceQuantity MinimumEmpireIncome { get; set; } - - /// - /// Modifiers to construction rates from population mood. - /// - public IDictionary MoodConstructionModifiers { get; private set; } - - /// - /// Modifiers to production and construction rates from population mood. - /// - public IDictionary MoodProductivityModifiers { get; private set; } - - /// - /// Modifiers to reproduction rates from population mood. - /// - public IDictionary MoodReproductionModifiers { get; private set; } - - /// - /// Minimum anger thresholds for each mood, in tenths of a percent. - /// - public IDictionary MoodThresholds { get; private set; } - - /// - /// Modifiers to reproduction rates from planetary conditions. - /// - public IDictionary ConditionsReproductionModifiers { get; private set; } - - /// - /// Minimum thresholds for each conditions value, in percent. - /// - public IDictionary ConditionsThresholds { get; private set; } - - /// - /// Accuracy rating of planets. - /// - public int PlanetAccuracy { get; set; } - - /// - /// Evasion rating of planets. - /// - public int PlanetEvasion { get; set; } - - /// - /// How many people does 1 population represent in the mod files? - /// - public long PopulationFactor { get; set; } - - /// - /// Damage required to kill 1 person. - /// - public double PopulationHitpoints { get; set; } - - /// - /// Modifiers to production and construction rates from population amounts. - /// - public SortedDictionary PopulationModifiers { get; set; } - - /// - /// Population required to spawn one militia unit. - /// - public long PopulationPerMilitia { get; set; } - - /// - /// Cargo space used to store 1 person. - /// - public double PopulationSize { get; set; } - - /// - /// Tribute percent of income paid by protected empires. - /// - public int ProtectorateTributePercent { get; set; } - - /// - /// How much of the ramming ship's HP gets applied as damage to the target in ramming? - /// - public int RammingSourceHitpointsDamagePercent { get; set; } - - /// - /// How much of the target's HP gets applied as damage to the ramming ship in ramming? - /// - public int RammingTargetHitpointsDamagePercent { get; set; } - - /// - /// Standard reproduction rate for populations (%/year). - /// - public int Reproduction { get; set; } - - // TODO - remove ReproductionDelay once the PBW game is over - [Obsolete("ModSettings.ReproductionDelay is deprecated. Use ReproductionFrequency instead.")] - public int ReproductionDelay - { - get { return ReproductionFrequency; } - set { ReproductionFrequency = value; } - } - - /// - /// Number of turns between population reproduction. - /// - // TODO - remove DoNotSerialize from ReproductionFrequency once the PBW game is over - [DoNotSerialize] - public int ReproductionFrequency { get; set; } - - /// - /// Global reproduction rate multiplier to convert mod values to per-turn values. - /// Defaults to 0.1 since 20%/year reproduction in SE4 really meant 2% per turn. - /// - public double ReproductionMultiplier { get; set; } - - /// - /// Cost to remove a component when retrofitting, as a percentage of the component's cost. - /// - public int RetrofitRemovalCostPercent { get; set; } - - /// - /// Cost to replace a component when retrofitting, as a percentage of the new component's cost. - /// - public int RetrofitReplacementCostPerecnt { get; set; } - - /// - /// Percentage of facility cost returned when scrapping. - /// - public int ScrapFacilityReturnRate { get; set; } - - /// - /// Percentage of ship/base cost returned when scrapping. - /// - public int ScrapShipOrBaseReturnRate { get; set; } - - /// - /// Percentage of unit cost returned when scrapping. - /// - public int ScrapUnitReturnRate { get; set; } - - /// - /// Evasion rating of seekers. - /// - public int SeekerEvasion { get; set; } - - /// - /// Standard maintenance cost for ships and bases (%/turn). - /// - public int ShipBaseMaintenanceRate { get; set; } - - /// - /// Percentage of normal rate for slow build. - /// - public int SlowBuildRate { get; set; } - - /// - /// Number of turns in space combat. - /// - public int SpaceCombatTurns { get; set; } - - // TODO - moddable starting population anger - public int StartPopulationAnger => 400; - - /// - /// Starting trade percentage for treaties. - /// - public double StartTradePercent { get; set; } - - /// - /// Tribute percent of income paid by subjugated empires. - /// - public int SubjugationTributePercent { get; set; } - - /// - /// Trade percentage increase per turn for treaties. - /// - public double TradePercentPerTurn { get; set; } - - /// - /// Standard maintenance cost for units (%/turn). - /// - public int UnitMaintenanceRate { get; set; } - - /// - /// Percentage of ship/base cost to unmothball. - /// - public int UnmothballPercentCost { get; set; } - - /// - /// Percentage cost (of the new facility) to upgrade a facility. - /// - public int UpgradeFacilityPercentCost { get; set; } - - /// - /// How often (in turns) should planetary value change abilities take effect? - /// - public int ValueChangeFrequency { get; set; } - - /// - /// Pictures for victory. - /// - public IList VictoryPictures { get; set; } - - /// - /// Music tracks for victory. - /// - public IList VictorySongs { get; private set; } - - /// - /// Weapon accuracy loss per square of distance to the target. - /// - public int WeaponAccuracyLossPerSquare { get; set; } - - /// - /// Weapon accuracy at 0 squares distance. - /// - public int WeaponAccuracyPointBlank { get; set; } - - public double GetMoodFactor(int anger) - { - Mood mood = Mood.Emotionless; - foreach (var mt in MoodThresholds.OrderBy(mt => mt.Value)) - { - if (mt.Value < anger) - mood = mt.Key; - else - break; - } - if (MoodProductivityModifiers.ContainsKey(mood)) - return MoodProductivityModifiers[mood] / 100d; - return 1d; - } - - public double GetPopulationConstructionFactor(long population) - { - if (population == 0) - return 0; - double result = 1d; - foreach (var pm in PopulationModifiers.OrderBy(pm => pm.Key)) - { - result = pm.Value.ConstructionRate / 100d; - if (pm.Key > population) - break; - } - return result; - } - - public double GetPopulationProductionFactor(long population) - { - double result = 1d; - foreach (var pm in PopulationModifiers.OrderBy(pm => pm.Key)) - { - result = pm.Value.ConstructionRate / 100d; - if (pm.Key > population) - break; - } - return result; - } +using FrEee.Objects.Civilization; +using FrEee.Utility; +using FrEee.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.Space; +using FrEee.Serialization; + +namespace FrEee.Modding; + +/// +/// General settings for a mod. +/// +public class ModSettings +{ + public ModSettings() + { + DefaultColonyConstructionRate = new ResourceQuantity(); + // TODO - moddable default colony construction rate + DefaultColonyConstructionRate.Add(Resource.Minerals, 2000); + DefaultColonyConstructionRate.Add(Resource.Organics, 2000); + DefaultColonyConstructionRate.Add(Resource.Radioactives, 2000); + + PopulationModifiers = new SortedDictionary(); + + // TODO - split apart production and construction modifiers as a mod option? + MoodProductivityModifiers = new Dictionary(); + + // TODO - moddable mood reproduction modifiers + MoodReproductionModifiers = new Dictionary(); + MoodReproductionModifiers.Add(Mood.Rioting, -999); + MoodReproductionModifiers.Add(Mood.Angry, -5); + MoodReproductionModifiers.Add(Mood.Unhappy, -2); + MoodReproductionModifiers.Add(Mood.Indifferent, 0); + MoodReproductionModifiers.Add(Mood.Happy, 2); + MoodReproductionModifiers.Add(Mood.Jubilant, 5); + MoodReproductionModifiers.Add(Mood.Emotionless, 2); + + // TODO - moddable mood construction modifiers + MoodConstructionModifiers = new Dictionary(); + MoodConstructionModifiers.Add(Mood.Rioting, 0); + MoodConstructionModifiers.Add(Mood.Angry, 100); + MoodConstructionModifiers.Add(Mood.Unhappy, 100); + MoodConstructionModifiers.Add(Mood.Indifferent, 100); + MoodConstructionModifiers.Add(Mood.Happy, 100); + MoodConstructionModifiers.Add(Mood.Jubilant, 100); + MoodConstructionModifiers.Add(Mood.Emotionless, 100); + + // TODO - moddable mood thresholds + MoodThresholds = new Dictionary(); + MoodThresholds.Add(Mood.Rioting, 750); + MoodThresholds.Add(Mood.Angry, 600); + MoodThresholds.Add(Mood.Unhappy, 450); + MoodThresholds.Add(Mood.Indifferent, 300); + MoodThresholds.Add(Mood.Happy, 150); + MoodThresholds.Add(Mood.Jubilant, 0); + + // TODO - moddable planetary conditions thresholds + ConditionsThresholds = new Dictionary(); + ConditionsThresholds.Add(Conditions.Deadly, 0); + ConditionsThresholds.Add(Conditions.Harsh, 20); + ConditionsThresholds.Add(Conditions.Unpleasant, 35); + ConditionsThresholds.Add(Conditions.Average, 50); + ConditionsThresholds.Add(Conditions.Mild, 65); + ConditionsThresholds.Add(Conditions.Good, 80); + ConditionsThresholds.Add(Conditions.Optimal, 95); + + // TODO - moddable planetary conditions modifiers + ConditionsReproductionModifiers = new Dictionary(); + ConditionsReproductionModifiers.Add(Conditions.Deadly, -20); + ConditionsReproductionModifiers.Add(Conditions.Harsh, -5); + ConditionsReproductionModifiers.Add(Conditions.Unpleasant, -2); + ConditionsReproductionModifiers.Add(Conditions.Average, 0); + ConditionsReproductionModifiers.Add(Conditions.Mild, 2); + ConditionsReproductionModifiers.Add(Conditions.Good, 5); + ConditionsReproductionModifiers.Add(Conditions.Optimal, 8); + + IntroSongs = new List(); + GameplaySongs = new List(); + CombatSongs = new List(); + VictorySongs = new List(); + DefeatSongs = new List(); + + VictoryPictures = new List(); + DefeatPictures = new List(); + + ValueChangeFrequency = 10; + } + + /// + /// Racial aptitudes. + /// + public IEnumerable Aptitudes { get { return Aptitude.All; } } + + /// + /// Population of the colony ship crew's race to spawn on colonization. + /// + public long AutomaticColonizationPopulation { get; set; } + + /// + /// Can bases join fleets? + /// + public bool BasesCanJoinFleets { get; set; } + + /// + /// Can a colonizer component be added via retrofit? + /// + public bool CanAddColonizerViaRetrofit { get; set; } + + /// + /// Can a spaceyard component be added via retrofit? + /// + public bool CanAddSpaceyardViaRetrofit { get; set; } + + /// + /// Additional reload time for weapons on a captured ship. + /// + public int CapturedShipReloadDelay { get; set; } + + /// + /// Music tracks for combat. + /// + public IList CombatSongs { get; private set; } + + /// + /// Percentage of strategic speed that's applied to combat speed. + /// + public int CombatSpeedPercentPerStrategicSpeed { get; set; } + + /// + /// Cooperative research treaty breakthrough chance. + /// + public double CooperativeResearchBreakthroughChance { get; set; } + + /// + /// Maximum sight obscuration level for artificial storms. + /// + public int CreatedStormMaxCloakLevel { get; set; } + + /// + /// Maximum damage for artificial storms. + /// + public int CreatedStormMaxDamage { get; set; } + + /// + /// Maximum shield disruption for artificial storms. + /// + public int CreatedStormMaxShieldDisruption { get; set; } + + /// + /// The construction rate for colonies lacking a spaceyard. + /// + public ResourceQuantity DefaultColonyConstructionRate { get; set; } + + /// + /// Pictures for defeat. + /// + public IList DefeatPictures { get; set; } + + /// + /// Music tracks for defeat. + /// + public IList DefeatSongs { get; private set; } + + /// + /// Automatic supply drain each turn for drones. + /// + public int DroneSupplyDrain { get; set; } + + /// + /// Percentage of normal rate for emergency build. + /// + public int EmergencyBuildRate { get; set; } + + /// + /// High event frequency, chance per 1000 per player for an event each turns + /// + public double EventFrequencyHigh { get; set; } + + /// + /// Low event frequency, chance per 1000 per player for an event each turns + /// + public double EventFrequencyLow { get; set; } + + /// + /// Medium event frequency, chance per 1000 per player for an event each turns + /// + public double EventFrequencyMedium { get; set; } + + /// + /// Standard maintenance cost for facilities (%/turn). + /// + public int FacilityMaintenanceRate { get; set; } + + /// + /// Automatic supply drain each turn for fighters. + /// + public int FighterSupplyDrain { get; set; } + + /// + /// Music tracks for gameplay. + /// + public IList GameplaySongs { get; private set; } + + /// + /// Loss of conditions of glassed planets. + /// + public int GlassedPlanetConditionsLoss { get; set; } + + /// + /// Loss of resource value of glassed planets. + /// + public int GlassedPlanetValueLoss { get; set; } + + /// + /// Percent effectiveness of ground combat weapons. + /// + public int GroundCombatDamagePercent { get; set; } + + /// + /// Number of turns in ground combat. + /// + public int GroundCombatTurns { get; set; } + + /// + /// Home systems can still produce some resources even without a spaceport. + /// + public int HomeSystemValueWithoutSpaceport { get; set; } + + /// + /// Percent effectiveness of intelligence defense. + /// + public int IntelligenceDefensePercent { get; set; } + + /// + /// Music tracks for the title screen. + /// + public IList IntroSongs { get; private set; } + + /// + /// Below this much supply a ship gets a low supply warning. + /// + public int LowSupplyWarningAmount { get; set; } + + /// + /// Below this % supply a ship gets a low supply warning. + /// + public int LowSupplyWarningPercent { get; set; } + + /// + /// Maintenance deficit required to destroy one ship per turn. + /// + public int MaintenanceDeficitToDestroyOneShip { get; set; } + + // TODO - moddable min/max anger values + public int MaxAnger => 1000; + + // TODO - moddable min/max conditions values + public int MaxConditions => 100; + + /// + /// Maximum number of consecutive turns a queue can be on emergency build. + /// + public int MaxEmergencyBuildTurns { get; set; } + + /// + /// Maximum mines per player per sector. + /// + public int MaxPlayerMinesPerSector { get; set; } + + /// + /// Maximum satellites per player per sector. + /// + public int MaxPlayerSatellitesPerSector { get; set; } + + /// + /// Maximum population for which an "abandon colony" order can be given. + /// + public int MaxPopulationToAbandonColony { get; set; } + + /// + /// Maxiumum trade percentage for treaties. + /// + public double MaxTradePercent { get; set; } + + /// + /// Score percent (of second place player) to trigger Mega Evil Empire on an AI player. + /// + public int MegaEvilEmpireAIScorePercent { get; set; } + + /// + /// Does the AI use Mega Evil Empire to gang up on the leading player? + /// + public bool MegaEvilEmpireEnabled { get; set; } + + /// + /// Score percent (of second place player) to trigger Mega Evil Empire on a human player. + /// + public int MegaEvilEmpireHumanScorePercent { get; set; } + + /// + /// Score threshold to trigger Mega Evil Empire. + /// + public int MegaEvilEmpireScoreThreshold { get; set; } + + /// + /// Damage inflicted when a militia unit attacks. + /// + public int MilitiaFirepower { get; set; } + + /// + /// Hitpoints of a militia unit. + /// + public int MilitiaHitpoints { get; set; } + + // TODO - moddable min/max anger values (or place in game setup) + public int MinAnger => 0; + + // TODO - moddable min/max planetary conditions values (or place in game setup) + public int MinConditions => 0; + + // TODO - moddable min/max planetary conditions values (or place in game setup) + public int MinRandomPlanetConditions => 20; + + // TODO - moddable min/max planetary conditions values (or place in game setup) + public int MaxRandomPlanetConditions => 100; + + // TODO - moddable homeworld conditions (or place in game setup) + public int HomeworldConditions => 80; + + /// + /// Can drones be affected by mines? + /// + public bool MinesAffectDrones { get; set; } + + /// + /// Can fighters be affected by mines? + /// + public bool MinesAffectFighters { get; set; } + + /// + /// Minimum income for an empire, even if it doesn't have any normal resource income. + /// + public ResourceQuantity MinimumEmpireIncome { get; set; } + + /// + /// Modifiers to construction rates from population mood. + /// + public IDictionary MoodConstructionModifiers { get; private set; } + + /// + /// Modifiers to production and construction rates from population mood. + /// + public IDictionary MoodProductivityModifiers { get; private set; } + + /// + /// Modifiers to reproduction rates from population mood. + /// + public IDictionary MoodReproductionModifiers { get; private set; } + + /// + /// Minimum anger thresholds for each mood, in tenths of a percent. + /// + public IDictionary MoodThresholds { get; private set; } + + /// + /// Modifiers to reproduction rates from planetary conditions. + /// + public IDictionary ConditionsReproductionModifiers { get; private set; } + + /// + /// Minimum thresholds for each conditions value, in percent. + /// + public IDictionary ConditionsThresholds { get; private set; } + + /// + /// Accuracy rating of planets. + /// + public int PlanetAccuracy { get; set; } + + /// + /// Evasion rating of planets. + /// + public int PlanetEvasion { get; set; } + + /// + /// How many people does 1 population represent in the mod files? + /// + public long PopulationFactor { get; set; } + + /// + /// Damage required to kill 1 person. + /// + public double PopulationHitpoints { get; set; } + + /// + /// Modifiers to production and construction rates from population amounts. + /// + public SortedDictionary PopulationModifiers { get; set; } + + /// + /// Population required to spawn one militia unit. + /// + public long PopulationPerMilitia { get; set; } + + /// + /// Cargo space used to store 1 person. + /// + public double PopulationSize { get; set; } + + /// + /// Tribute percent of income paid by protected empires. + /// + public int ProtectorateTributePercent { get; set; } + + /// + /// How much of the ramming ship's HP gets applied as damage to the target in ramming? + /// + public int RammingSourceHitpointsDamagePercent { get; set; } + + /// + /// How much of the target's HP gets applied as damage to the ramming ship in ramming? + /// + public int RammingTargetHitpointsDamagePercent { get; set; } + + /// + /// Standard reproduction rate for populations (%/year). + /// + public int Reproduction { get; set; } + + // TODO - remove ReproductionDelay once the PBW game is over + [Obsolete("ModSettings.ReproductionDelay is deprecated. Use ReproductionFrequency instead.")] + public int ReproductionDelay + { + get { return ReproductionFrequency; } + set { ReproductionFrequency = value; } + } + + /// + /// Number of turns between population reproduction. + /// + // TODO - remove DoNotSerialize from ReproductionFrequency once the PBW game is over + [DoNotSerialize] + public int ReproductionFrequency { get; set; } + + /// + /// Global reproduction rate multiplier to convert mod values to per-turn values. + /// Defaults to 0.1 since 20%/year reproduction in SE4 really meant 2% per turn. + /// + public double ReproductionMultiplier { get; set; } + + /// + /// Cost to remove a component when retrofitting, as a percentage of the component's cost. + /// + public int RetrofitRemovalCostPercent { get; set; } + + /// + /// Cost to replace a component when retrofitting, as a percentage of the new component's cost. + /// + public int RetrofitReplacementCostPerecnt { get; set; } + + /// + /// Percentage of facility cost returned when scrapping. + /// + public int ScrapFacilityReturnRate { get; set; } + + /// + /// Percentage of ship/base cost returned when scrapping. + /// + public int ScrapShipOrBaseReturnRate { get; set; } + + /// + /// Percentage of unit cost returned when scrapping. + /// + public int ScrapUnitReturnRate { get; set; } + + /// + /// Evasion rating of seekers. + /// + public int SeekerEvasion { get; set; } + + /// + /// Standard maintenance cost for ships and bases (%/turn). + /// + public int ShipBaseMaintenanceRate { get; set; } + + /// + /// Percentage of normal rate for slow build. + /// + public int SlowBuildRate { get; set; } + + /// + /// Number of turns in space combat. + /// + public int SpaceCombatTurns { get; set; } + + // TODO - moddable starting population anger + public int StartPopulationAnger => 400; + + /// + /// Starting trade percentage for treaties. + /// + public double StartTradePercent { get; set; } + + /// + /// Tribute percent of income paid by subjugated empires. + /// + public int SubjugationTributePercent { get; set; } + + /// + /// Trade percentage increase per turn for treaties. + /// + public double TradePercentPerTurn { get; set; } + + /// + /// Standard maintenance cost for units (%/turn). + /// + public int UnitMaintenanceRate { get; set; } + + /// + /// Percentage of ship/base cost to unmothball. + /// + public int UnmothballPercentCost { get; set; } + + /// + /// Percentage cost (of the new facility) to upgrade a facility. + /// + public int UpgradeFacilityPercentCost { get; set; } + + /// + /// How often (in turns) should planetary value change abilities take effect? + /// + public int ValueChangeFrequency { get; set; } + + /// + /// Pictures for victory. + /// + public IList VictoryPictures { get; set; } + + /// + /// Music tracks for victory. + /// + public IList VictorySongs { get; private set; } + + /// + /// Weapon accuracy loss per square of distance to the target. + /// + public int WeaponAccuracyLossPerSquare { get; set; } + + /// + /// Weapon accuracy at 0 squares distance. + /// + public int WeaponAccuracyPointBlank { get; set; } + + public double GetMoodFactor(int anger) + { + Mood mood = Mood.Emotionless; + foreach (var mt in MoodThresholds.OrderBy(mt => mt.Value)) + { + if (mt.Value < anger) + mood = mt.Key; + else + break; + } + if (MoodProductivityModifiers.ContainsKey(mood)) + return MoodProductivityModifiers[mood] / 100d; + return 1d; + } + + public double GetPopulationConstructionFactor(long population) + { + if (population == 0) + return 0; + double result = 1d; + foreach (var pm in PopulationModifiers.OrderBy(pm => pm.Key)) + { + result = pm.Value.ConstructionRate / 100d; + if (pm.Key > population) + break; + } + return result; + } + + public double GetPopulationProductionFactor(long population) + { + double result = 1d; + foreach (var pm in PopulationModifiers.OrderBy(pm => pm.Key)) + { + result = pm.Value.ConstructionRate / 100d; + if (pm.Key > population) + break; + } + return result; + } } \ No newline at end of file diff --git a/FrEee/Modding/ObjectFormula.cs b/FrEee.Core/Modding/ObjectFormula.cs similarity index 95% rename from FrEee/Modding/ObjectFormula.cs rename to FrEee.Core/Modding/ObjectFormula.cs index 4f78bc68f..4930c0899 100644 --- a/FrEee/Modding/ObjectFormula.cs +++ b/FrEee.Core/Modding/ObjectFormula.cs @@ -1,168 +1,169 @@ -using FrEee.Utility; -using FrEee.Serialization; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; - -namespace FrEee.Modding; - -/// -/// A formula which returns a generic object rather than a comparable scalar. -/// -/// The type of object to return. -public class ObjectFormula : IFormula -{ - public ObjectFormula(string text, object context, bool isDynamic) - { - Text = text; - this.context = context; - this.isDynamic = isDynamic; - } - - /// - /// For serialization. - /// - protected ObjectFormula() - : base() - { - } - - public object Context { get { return context; } } - - /// - /// Object formulas are always dynamic. - /// - public bool IsDynamic - { - get - { - return true; - } - } - - /// - /// Is this ObjectFormula{T} literal? - /// - public bool IsLiteral - { - get - { - return false; - } - } - - /// - /// The formula text. - /// - public string Text { get; set; } - - object IFormula.Value { get { return Value; } } - - public T Value - { - get - { - if (IsDynamic) - return Evaluate(Context, null); - else - { - if (value == null) - value = new Lazy(ComputeValue); // HACK - why is it not being set when we load? - return value.Value; - } - } - } - - protected Lazy value; - - [DoNotCopy] - private object context { get; set; } - - private bool isDynamic; - - public static implicit operator T(ObjectFormula f) - { - return f.Value; - } - - public override bool Equals(object? obj) - { - var x = obj as ObjectFormula; - if (x == null) - return false; - return Equals(x); - } - - public bool Equals(ObjectFormula other) - { - return IsDynamic == other.IsDynamic && Text == other.Text && Context == other.Context; - } - - public T Evaluate(object host, IDictionary variables = null) - { - var vars = new Dictionary(variables ?? new Dictionary()); - vars.Add("self", Context); - vars.Add("host", host); - if (host is IFormulaHost) - { - foreach (var kvp in ((IFormulaHost)host).Variables) - vars.Add(kvp.Key, kvp.Value); - } - if (host is IModObject mo) - { - if (mo.TemplateParameters != null) - { - foreach (var kvp in mo.TemplateParameters) - vars.Add(kvp.Key, kvp.Value); - } - } - string fulltext; - if (ExternalScripts == null) - fulltext = Text; - else - fulltext = string.Join("\n", ExternalScripts.Select(q => q.Text)) + "\n" + Text; - return PythonScriptEngine.EvaluateExpression(fulltext, vars); - } - - object IFormula.Evaluate(object host, IDictionary variables) - { - return Evaluate(host, variables); - } - - public override int GetHashCode() - { - return HashCodeMasher.Mash(IsDynamic, Text, Context); - } - - public Formula ToStringFormula(CultureInfo c = null) - { - // HACK - could lead to desyncs for static formulas with their stringified counterparts if the values change - return new ComputedFormula("str(" + Text + ")", Context, IsDynamic); - } - - protected T ComputeValue() - { - return Evaluate(Context, null); - } - - public int CompareTo(object? obj) - { - throw new NotSupportedException(); - } - - public int CompareTo(T ?other) - { - throw new NotSupportedException(); - } - - public int CompareTo(ObjectFormula? other) - { - throw new NotSupportedException(); - } - - /// - /// The external scripts required to execute this formula. - /// - public PythonScript[] ExternalScripts { get; set; } +using FrEee.Utility; +using FrEee.Serialization; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using FrEee.Utility; + +namespace FrEee.Modding; + +/// +/// A formula which returns a generic object rather than a comparable scalar. +/// +/// The type of object to return. +public class ObjectFormula : IFormula +{ + public ObjectFormula(string text, object context, bool isDynamic) + { + Text = text; + this.context = context; + this.isDynamic = isDynamic; + } + + /// + /// For serialization. + /// + protected ObjectFormula() + : base() + { + } + + public object Context { get { return context; } } + + /// + /// Object formulas are always dynamic. + /// + public bool IsDynamic + { + get + { + return true; + } + } + + /// + /// Is this ObjectFormula{T} literal? + /// + public bool IsLiteral + { + get + { + return false; + } + } + + /// + /// The formula text. + /// + public string Text { get; set; } + + object IFormula.Value { get { return Value; } } + + public T Value + { + get + { + if (IsDynamic) + return Evaluate(Context, null); + else + { + if (value == null) + value = new Lazy(ComputeValue); // HACK - why is it not being set when we load? + return value.Value; + } + } + } + + protected Lazy value; + + [DoNotCopy] + private object context { get; set; } + + private bool isDynamic; + + public static implicit operator T(ObjectFormula f) + { + return f.Value; + } + + public override bool Equals(object? obj) + { + var x = obj as ObjectFormula; + if (x == null) + return false; + return Equals(x); + } + + public bool Equals(ObjectFormula other) + { + return IsDynamic == other.IsDynamic && Text == other.Text && Context == other.Context; + } + + public T Evaluate(object host, IDictionary variables = null) + { + var vars = new Dictionary(variables ?? new Dictionary()); + vars.Add("self", Context); + vars.Add("host", host); + if (host is IFormulaHost) + { + foreach (var kvp in ((IFormulaHost)host).Variables) + vars.Add(kvp.Key, kvp.Value); + } + if (host is IModObject mo) + { + if (mo.TemplateParameters != null) + { + foreach (var kvp in mo.TemplateParameters) + vars.Add(kvp.Key, kvp.Value); + } + } + string fulltext; + if (ExternalScripts == null) + fulltext = Text; + else + fulltext = string.Join("\n", ExternalScripts.Select(q => q.Text)) + "\n" + Text; + return PythonScriptEngine.EvaluateExpression(fulltext, vars); + } + + object IFormula.Evaluate(object host, IDictionary variables) + { + return Evaluate(host, variables); + } + + public override int GetHashCode() + { + return HashCodeMasher.Mash(IsDynamic, Text, Context); + } + + public Formula ToStringFormula(CultureInfo c = null) + { + // HACK - could lead to desyncs for static formulas with their stringified counterparts if the values change + return new ComputedFormula("str(" + Text + ")", Context, IsDynamic); + } + + protected T ComputeValue() + { + return Evaluate(Context, null); + } + + public int CompareTo(object? obj) + { + throw new NotSupportedException(); + } + + public int CompareTo(T ?other) + { + throw new NotSupportedException(); + } + + public int CompareTo(ObjectFormula? other) + { + throw new NotSupportedException(); + } + + /// + /// The external scripts required to execute this formula. + /// + public PythonScript[] ExternalScripts { get; set; } } \ No newline at end of file diff --git a/FrEee/Modding/PopulationModifier.cs b/FrEee.Core/Modding/PopulationModifier.cs similarity index 97% rename from FrEee/Modding/PopulationModifier.cs rename to FrEee.Core/Modding/PopulationModifier.cs index e67a89173..64aef342b 100644 --- a/FrEee/Modding/PopulationModifier.cs +++ b/FrEee.Core/Modding/PopulationModifier.cs @@ -1,23 +1,23 @@ -namespace FrEee.Modding; - -/// -/// Modifiers to production/construction rate from population. -/// TODO - let population modifiers take a formula parameter so we don't need to list a gazillion of them! -/// -public class PopulationModifier -{ - /// - /// Rate of construction as percentage of normal rate. - /// - public int ConstructionRate { get; set; } - - /// - /// Maximum amount of population for this modifier; if more population is present, the next better modifier (if present) will be used instead. - /// - public long PopulationAmount { get; set; } - - /// - /// Rate of resource/research/intel production as percentage of normal rate. - /// - public int ProductionRate { get; set; } +namespace FrEee.Modding; + +/// +/// Modifiers to production/construction rate from population. +/// TODO - let population modifiers take a formula parameter so we don't need to list a gazillion of them! +/// +public class PopulationModifier +{ + /// + /// Rate of construction as percentage of normal rate. + /// + public int ConstructionRate { get; set; } + + /// + /// Maximum amount of population for this modifier; if more population is present, the next better modifier (if present) will be used instead. + /// + public long PopulationAmount { get; set; } + + /// + /// Rate of resource/research/intel production as percentage of normal rate. + /// + public int ProductionRate { get; set; } } \ No newline at end of file diff --git a/FrEee/Modding/Record.cs b/FrEee.Core/Modding/Record.cs similarity index 97% rename from FrEee/Modding/Record.cs rename to FrEee.Core/Modding/Record.cs index 20cc8d524..f142b75d8 100644 --- a/FrEee/Modding/Record.cs +++ b/FrEee.Core/Modding/Record.cs @@ -1,319 +1,320 @@ -using FrEee.Serialization; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Modding; - -/// -/// A record in a data file. -/// -[Serializable] -public class Record -{ - /// - /// Creates a record with no fields. - /// - public Record() - { - Fields = new List(); - } - - /// - /// Creates a record by parsing some string data. - /// - /// - public Record(IEnumerable lines) - : this() - { - foreach (var line in lines.Where(l => l.Contains(":="))) - Fields.Add(new Field(line, this)); - } - - /// - /// The fields in this record. - /// - public IList Fields { get; private set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary Parameters { get; set; } - - public Field FindField(string fieldName, ref int index, bool logErrors = false, int startIndex = 0, bool allowSkip = true) - { - return FindField(new string[] { fieldName }, ref index, logErrors, startIndex, allowSkip); - } - - /// - /// Finds a field in the record. - /// - /// - /// - /// - /// - /// - /// - public Field FindField(IEnumerable fieldNames, ref int index, bool logErrors = false, int startIndex = 0, bool allowSkip = true) - { - for (var i = startIndex; i < Fields.Count; i++) - { - if (fieldNames.Contains(Fields[i].Name)) - { - index = i; - return Fields[i]; - } - if (!allowSkip) - break; - } - if (logErrors) - Mod.Errors.Add(new DataParsingException("Could not find field: " + string.Join(", ", fieldNames.ToArray()) + ".", Mod.CurrentFileName, this)); - return null; - } - - public Formula Get(string fieldName, object context = null, bool allowNulls = true) - where T : IConvertible, IComparable - { - int index = 0; - return Get(fieldName, context, ref index, allowNulls); - } - - public Formula Get(IEnumerable fieldNames, object context = null, bool allowNulls = true) - where T : IConvertible, IComparable - { - int index = 0; - return Get(fieldNames, context, ref index, allowNulls); - } - - public Formula Get(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - where T : IConvertible, IComparable - { - return Get(new string[] { fieldName }, context, ref index, allowNulls, startIndex = 0, allowSkip = true); - } - - public Formula Get(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - where T : IConvertible, IComparable - { - var f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); - if (f == null) - { - if (allowNulls) - return null; - else - { - Mod.Errors.Add(new DataParsingException("Cannot find field \"" + fieldNames.First() + "\".", Mod.CurrentFileName, this, null)); - return default(T); - } - } - return f.CreateFormula(context); - } - - public ObjectFormula GetObject(string fieldName, object context = null, bool allowNulls = true) - { - int index = 0; - return GetObject(fieldName, context, ref index, allowNulls); - } - - public ObjectFormula GetObject(IEnumerable fieldNames, object context = null, bool allowNulls = true) - { - int index = 0; - return GetObject(fieldNames, context, ref index, allowNulls); - } - - public ObjectFormula GetObject(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - { - return GetObject(new string[] { fieldName }, context, ref index, allowNulls, startIndex = 0, allowSkip = true); - } - - public ObjectFormula GetObject(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - { - var f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); - if (f == null) - { - if (allowNulls) - return null; - else - { - Mod.Errors.Add(new DataParsingException("Cannot find field \"" + fieldNames.First() + "\".", Mod.CurrentFileName, this, null)); - return new ObjectFormula("None", context, false); - } - } - return f.CreateObjectFormula(context); - } - - public ObjectFormula GetReferenceEnumerable(IEnumerable fieldNames, object context = null, bool allowNulls = true) - where T : IReferenceEnumerable - { - int index = 0; - return GetReferenceEnumerable(fieldNames, context, ref index, allowNulls); - } - - public ObjectFormula GetReferenceEnumerable(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - where T : IReferenceEnumerable - { - return GetReferenceEnumerable(new string[] { fieldName }, context, ref index, allowNulls); - } - - public ObjectFormula GetReferenceEnumerable(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - where T : IReferenceEnumerable - { - var f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); - if (f == null) - { - if (allowNulls) - return null; - else - { - Mod.Errors.Add(new DataParsingException("Cannot find field \"" + fieldNames.First() + "\".", Mod.CurrentFileName, this, null)); - return new ObjectFormula("None", context, false); - } - } - return f.CreateReferenceEnumerableFormula(context); - } - - public IEnumerable> GetMany(string fieldName, object context, bool allowNulls = true) - where T : IConvertible, IComparable - { - int index = 0; - return GetMany(fieldName, context, ref index, allowNulls); - } - - public IEnumerable> GetMany(IEnumerable fieldNames, object context, bool allowNulls = true) - where T : IConvertible, IComparable - { - int index = 0; - return GetMany(fieldNames, context, ref index, allowNulls); - } - - public IEnumerable> GetMany(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - where T : IConvertible, IComparable - { - return GetMany(new string[] { fieldName }, context, ref index, allowNulls, startIndex = 0, allowSkip = true); - } - - public IEnumerable> GetMany(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - where T : IConvertible, IComparable - { - Field f; - var result = new List>(); - do - { - f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); - startIndex = index + 1; - if (f != null) - result.Add(f.CreateFormula(context)); - } while (f != null); - return result; - } - - public PythonScript GetScript(string fieldName, object context = null, bool allowNulls = true) - { - int index = 0; - return GetScript(fieldName, context, ref index, allowNulls); - } - - public PythonScript GetScript(IEnumerable fieldNames, object context = null, bool allowNulls = true) - { - int index = 0; - return GetScript(fieldNames, context, ref index, allowNulls); - } - - public PythonScript GetScript(string fieldName, object context, ref int index, bool allowNulls = true, bool allowSkip = true) - { - return GetScript(new string[] { fieldName }, context, ref index, allowNulls, allowSkip); - } - - public PythonScript GetScript(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, bool allowSkip = true) - { - Field f; - List fs = new List(); - do - { - f = FindField(fieldNames, ref index, !allowNulls, index, allowSkip); - if (f != null) - fs.Add(f); - index++; - } while (f != null); - return new PythonScript("Script", string.Join("\n", fs.Select(f2 => f2.Value))); - } - - public IEnumerable GetScripts(string fieldName, object context, bool allowNulls = true) - { - int index = 0; - return GetScripts(fieldName, context, ref index, allowNulls); - } - - public IEnumerable GetScripts(IEnumerable fieldNames, object context, bool allowNulls = true) - { - int index = 0; - return GetScripts(fieldNames, context, ref index, allowNulls); - } - - public IEnumerable GetScripts(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - { - return GetScripts(new string[] { fieldName }, context, ref index, allowNulls, startIndex = 0, allowSkip = true); - } - - public IEnumerable GetScripts(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) - { - Field f; - var result = new List(); - do - { - f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); - startIndex = index + 1; - if (f != null) - result.Add(f.CreateScript(context)); - } while (f != null); - return result; - } - - public override string ToString() - { - if (Fields.Count > 0) - return Fields.First().ToString() + " (" + Fields.Count + " fields)"; - return "(0 fields)"; - } - - /// - /// Tries to find a field value. - /// - /// The name to search for. - /// If an exception needs to be logged, pass it here. - /// The field value. - /// The field index. - /// Where to start in the field list. - /// Allow skipping fields to find the one we want? - /// true on success, false on failure - public bool TryFindFieldValue(string fieldName, out string value, ref int index, ICollection log = null, int startIndex = 0, bool allowSkip = true) - { - return TryFindFieldValue(new string[] { fieldName }, out value, ref index, log, startIndex, allowSkip); - } - - /// - /// Tries to find a field value from the first of any of a number of fields. - /// - /// The name to search for. - /// If an exception needs to be logged, pass it here. Note that now all errors are logged to Mod.Errors. - /// The field value. - /// The field index. - /// Where to start in the field list. - /// Allow skipping fields to find the one we want? - /// true on success, false on failure - // TODO - change method signature to take a bool instead of a collection of errors - [Obsolete("Use the various Get methods instead (e.g. GetString).")] - public bool TryFindFieldValue(IEnumerable fieldNames, out string value, ref int index, ICollection log = null, int startIndex = 0, bool allowSkip = true) - { - var field = FindField(fieldNames, ref index, log != null, startIndex, allowSkip); - if (field == null) - { - value = null; - return false; - } - else - { - value = field.Value; - return true; - } - } +using FrEee.Serialization; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Serialization; + +namespace FrEee.Modding; + +/// +/// A record in a data file. +/// +[Serializable] +public class Record +{ + /// + /// Creates a record with no fields. + /// + public Record() + { + Fields = new List(); + } + + /// + /// Creates a record by parsing some string data. + /// + /// + public Record(IEnumerable lines) + : this() + { + foreach (var line in lines.Where(l => l.Contains(":="))) + Fields.Add(new Field(line, this)); + } + + /// + /// The fields in this record. + /// + public IList Fields { get; private set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary Parameters { get; set; } + + public Field FindField(string fieldName, ref int index, bool logErrors = false, int startIndex = 0, bool allowSkip = true) + { + return FindField(new string[] { fieldName }, ref index, logErrors, startIndex, allowSkip); + } + + /// + /// Finds a field in the record. + /// + /// + /// + /// + /// + /// + /// + public Field FindField(IEnumerable fieldNames, ref int index, bool logErrors = false, int startIndex = 0, bool allowSkip = true) + { + for (var i = startIndex; i < Fields.Count; i++) + { + if (fieldNames.Contains(Fields[i].Name)) + { + index = i; + return Fields[i]; + } + if (!allowSkip) + break; + } + if (logErrors) + Mod.Errors.Add(new DataParsingException("Could not find field: " + string.Join(", ", fieldNames.ToArray()) + ".", Mod.CurrentFileName, this)); + return null; + } + + public Formula Get(string fieldName, object context = null, bool allowNulls = true) + where T : IConvertible, IComparable + { + int index = 0; + return Get(fieldName, context, ref index, allowNulls); + } + + public Formula Get(IEnumerable fieldNames, object context = null, bool allowNulls = true) + where T : IConvertible, IComparable + { + int index = 0; + return Get(fieldNames, context, ref index, allowNulls); + } + + public Formula Get(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + where T : IConvertible, IComparable + { + return Get(new string[] { fieldName }, context, ref index, allowNulls, startIndex = 0, allowSkip = true); + } + + public Formula Get(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + where T : IConvertible, IComparable + { + var f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); + if (f == null) + { + if (allowNulls) + return null; + else + { + Mod.Errors.Add(new DataParsingException("Cannot find field \"" + fieldNames.First() + "\".", Mod.CurrentFileName, this, null)); + return default(T); + } + } + return f.CreateFormula(context); + } + + public ObjectFormula GetObject(string fieldName, object context = null, bool allowNulls = true) + { + int index = 0; + return GetObject(fieldName, context, ref index, allowNulls); + } + + public ObjectFormula GetObject(IEnumerable fieldNames, object context = null, bool allowNulls = true) + { + int index = 0; + return GetObject(fieldNames, context, ref index, allowNulls); + } + + public ObjectFormula GetObject(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + { + return GetObject(new string[] { fieldName }, context, ref index, allowNulls, startIndex = 0, allowSkip = true); + } + + public ObjectFormula GetObject(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + { + var f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); + if (f == null) + { + if (allowNulls) + return null; + else + { + Mod.Errors.Add(new DataParsingException("Cannot find field \"" + fieldNames.First() + "\".", Mod.CurrentFileName, this, null)); + return new ObjectFormula("None", context, false); + } + } + return f.CreateObjectFormula(context); + } + + public ObjectFormula GetReferenceEnumerable(IEnumerable fieldNames, object context = null, bool allowNulls = true) + where T : IReferenceEnumerable + { + int index = 0; + return GetReferenceEnumerable(fieldNames, context, ref index, allowNulls); + } + + public ObjectFormula GetReferenceEnumerable(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + where T : IReferenceEnumerable + { + return GetReferenceEnumerable(new string[] { fieldName }, context, ref index, allowNulls); + } + + public ObjectFormula GetReferenceEnumerable(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + where T : IReferenceEnumerable + { + var f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); + if (f == null) + { + if (allowNulls) + return null; + else + { + Mod.Errors.Add(new DataParsingException("Cannot find field \"" + fieldNames.First() + "\".", Mod.CurrentFileName, this, null)); + return new ObjectFormula("None", context, false); + } + } + return f.CreateReferenceEnumerableFormula(context); + } + + public IEnumerable> GetMany(string fieldName, object context, bool allowNulls = true) + where T : IConvertible, IComparable + { + int index = 0; + return GetMany(fieldName, context, ref index, allowNulls); + } + + public IEnumerable> GetMany(IEnumerable fieldNames, object context, bool allowNulls = true) + where T : IConvertible, IComparable + { + int index = 0; + return GetMany(fieldNames, context, ref index, allowNulls); + } + + public IEnumerable> GetMany(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + where T : IConvertible, IComparable + { + return GetMany(new string[] { fieldName }, context, ref index, allowNulls, startIndex = 0, allowSkip = true); + } + + public IEnumerable> GetMany(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + where T : IConvertible, IComparable + { + Field f; + var result = new List>(); + do + { + f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); + startIndex = index + 1; + if (f != null) + result.Add(f.CreateFormula(context)); + } while (f != null); + return result; + } + + public PythonScript GetScript(string fieldName, object context = null, bool allowNulls = true) + { + int index = 0; + return GetScript(fieldName, context, ref index, allowNulls); + } + + public PythonScript GetScript(IEnumerable fieldNames, object context = null, bool allowNulls = true) + { + int index = 0; + return GetScript(fieldNames, context, ref index, allowNulls); + } + + public PythonScript GetScript(string fieldName, object context, ref int index, bool allowNulls = true, bool allowSkip = true) + { + return GetScript(new string[] { fieldName }, context, ref index, allowNulls, allowSkip); + } + + public PythonScript GetScript(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, bool allowSkip = true) + { + Field f; + List fs = new List(); + do + { + f = FindField(fieldNames, ref index, !allowNulls, index, allowSkip); + if (f != null) + fs.Add(f); + index++; + } while (f != null); + return new PythonScript("Script", string.Join("\n", fs.Select(f2 => f2.Value))); + } + + public IEnumerable GetScripts(string fieldName, object context, bool allowNulls = true) + { + int index = 0; + return GetScripts(fieldName, context, ref index, allowNulls); + } + + public IEnumerable GetScripts(IEnumerable fieldNames, object context, bool allowNulls = true) + { + int index = 0; + return GetScripts(fieldNames, context, ref index, allowNulls); + } + + public IEnumerable GetScripts(string fieldName, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + { + return GetScripts(new string[] { fieldName }, context, ref index, allowNulls, startIndex = 0, allowSkip = true); + } + + public IEnumerable GetScripts(IEnumerable fieldNames, object context, ref int index, bool allowNulls = true, int startIndex = 0, bool allowSkip = true) + { + Field f; + var result = new List(); + do + { + f = FindField(fieldNames, ref index, !allowNulls, startIndex, allowSkip); + startIndex = index + 1; + if (f != null) + result.Add(f.CreateScript(context)); + } while (f != null); + return result; + } + + public override string ToString() + { + if (Fields.Count > 0) + return Fields.First().ToString() + " (" + Fields.Count + " fields)"; + return "(0 fields)"; + } + + /// + /// Tries to find a field value. + /// + /// The name to search for. + /// If an exception needs to be logged, pass it here. + /// The field value. + /// The field index. + /// Where to start in the field list. + /// Allow skipping fields to find the one we want? + /// true on success, false on failure + public bool TryFindFieldValue(string fieldName, out string value, ref int index, ICollection log = null, int startIndex = 0, bool allowSkip = true) + { + return TryFindFieldValue(new string[] { fieldName }, out value, ref index, log, startIndex, allowSkip); + } + + /// + /// Tries to find a field value from the first of any of a number of fields. + /// + /// The name to search for. + /// If an exception needs to be logged, pass it here. Note that now all errors are logged to Mod.Errors. + /// The field value. + /// The field index. + /// Where to start in the field list. + /// Allow skipping fields to find the one we want? + /// true on success, false on failure + // TODO - change method signature to take a bool instead of a collection of errors + [Obsolete("Use the various Get methods instead (e.g. GetString).")] + public bool TryFindFieldValue(IEnumerable fieldNames, out string value, ref int index, ICollection log = null, int startIndex = 0, bool allowSkip = true) + { + var field = FindField(fieldNames, ref index, log != null, startIndex, allowSkip); + if (field == null) + { + value = null; + return false; + } + else + { + value = field.Value; + return true; + } + } } \ No newline at end of file diff --git a/FrEee/Modding/Requirement.cs b/FrEee.Core/Modding/Requirement.cs similarity index 96% rename from FrEee/Modding/Requirement.cs rename to FrEee.Core/Modding/Requirement.cs index a7c629454..9a9119839 100644 --- a/FrEee/Modding/Requirement.cs +++ b/FrEee.Core/Modding/Requirement.cs @@ -1,23 +1,23 @@ -namespace FrEee.Modding; - -/// -/// A requirement for some condition. -/// -/// The object which needs to meet the requirement. -public abstract class Requirement -{ - public Requirement(Formula description) - { - Description = description; - } - - public Formula Description { get; set; } - - /// - /// Is this a "strict" requirement? - /// Non-strict requirements are not counted as prerequisites for purposes of finding the "root" items of the tech tree. - /// - public abstract bool IsStrict { get; } - - public abstract bool IsMetBy(T obj); +namespace FrEee.Modding; + +/// +/// A requirement for some condition. +/// +/// The object which needs to meet the requirement. +public abstract class Requirement +{ + public Requirement(Formula description) + { + Description = description; + } + + public Formula Description { get; set; } + + /// + /// Is this a "strict" requirement? + /// Non-strict requirements are not counted as prerequisites for purposes of finding the "root" items of the tech tree. + /// + public abstract bool IsStrict { get; } + + public abstract bool IsMetBy(T obj); } \ No newline at end of file diff --git a/FrEee/Modding/RequirementType.cs b/FrEee.Core/Modding/RequirementType.cs similarity index 100% rename from FrEee/Modding/RequirementType.cs rename to FrEee.Core/Modding/RequirementType.cs diff --git a/FrEee/Modding/ResourceFormula.cs b/FrEee.Core/Modding/ResourceFormula.cs similarity index 95% rename from FrEee/Modding/ResourceFormula.cs rename to FrEee.Core/Modding/ResourceFormula.cs index ddc4c3ce3..e50e070fc 100644 --- a/FrEee/Modding/ResourceFormula.cs +++ b/FrEee.Core/Modding/ResourceFormula.cs @@ -1,87 +1,88 @@ -using FrEee.Utility; using FrEee.Serialization; -using System.Linq; - -namespace FrEee.Modding; - -// TODO - split ResourceFormula into LiteralResourceFormula and ComputedResourceFormula? -// TODO - equals method and IEquatable -public class ResourceFormula : SafeDictionary> -{ - public ResourceFormula(object context) - { - Context = context; - } - - /// - /// For serialization - /// - private ResourceFormula() - { - } - - /// - /// The object which owns this quantity. - /// - [DoNotCopy] - public object Context - { - get; - private set; - } - - public ResourceQuantity Value - { - get - { - var q = new ResourceQuantity(); - foreach (var kvp in this) - q.Add(kvp.Key, kvp.Value); - return q; - } - } - - public static implicit operator ResourceQuantity(ResourceFormula f) - { - return f.Value; - } - - public static ResourceFormula operator -(ResourceFormula r1, ResourceFormula r2) - { - var result = new ResourceFormula(r1.Context ?? r2.Context); - foreach (var key in r1.Keys.Union(r2.Keys)) - result.Add(key, r1[key] - r2[key]); - return result; - } - - public static ResourceFormula operator *(ResourceFormula r, double scalar) - { - var result = new ResourceFormula(r.Context); - foreach (var key in r.Keys) - result.Add(key, r[key] * scalar); - return result; - } - - public static ResourceFormula operator /(ResourceFormula r, double scalar) - { - var result = new ResourceFormula(r.Context); - foreach (var key in r.Keys) - result.Add(key, r[key] / scalar); - return result; - } - - public static ResourceFormula operator +(ResourceFormula r1, ResourceFormula r2) - { - var result = new ResourceFormula(r1.Context ?? r2.Context); - foreach (var key in r1.Keys.Union(r2.Keys)) - result.Add(key, r1[key] + r2[key]); - return result; - } - - public ResourceQuantity Evaluate(object host) - { - var q = new ResourceQuantity(); - foreach (var kvp in this) - q.Add(kvp.Key, kvp.Value.Evaluate(host)); - return q; - } -} +using FrEee.Utility; using FrEee.Serialization; +using System.Linq; +using FrEee.Utility; + +namespace FrEee.Modding; + +// TODO - split ResourceFormula into LiteralResourceFormula and ComputedResourceFormula? +// TODO - equals method and IEquatable +public class ResourceFormula : SafeDictionary> +{ + public ResourceFormula(object context) + { + Context = context; + } + + /// + /// For serialization + /// + private ResourceFormula() + { + } + + /// + /// The object which owns this quantity. + /// + [DoNotCopy] + public object Context + { + get; + private set; + } + + public ResourceQuantity Value + { + get + { + var q = new ResourceQuantity(); + foreach (var kvp in this) + q.Add(kvp.Key, kvp.Value); + return q; + } + } + + public static implicit operator ResourceQuantity(ResourceFormula f) + { + return f.Value; + } + + public static ResourceFormula operator -(ResourceFormula r1, ResourceFormula r2) + { + var result = new ResourceFormula(r1.Context ?? r2.Context); + foreach (var key in r1.Keys.Union(r2.Keys)) + result.Add(key, r1[key] - r2[key]); + return result; + } + + public static ResourceFormula operator *(ResourceFormula r, double scalar) + { + var result = new ResourceFormula(r.Context); + foreach (var key in r.Keys) + result.Add(key, r[key] * scalar); + return result; + } + + public static ResourceFormula operator /(ResourceFormula r, double scalar) + { + var result = new ResourceFormula(r.Context); + foreach (var key in r.Keys) + result.Add(key, r[key] / scalar); + return result; + } + + public static ResourceFormula operator +(ResourceFormula r1, ResourceFormula r2) + { + var result = new ResourceFormula(r1.Context ?? r2.Context); + foreach (var key in r1.Keys.Union(r2.Keys)) + result.Add(key, r1[key] + r2[key]); + return result; + } + + public ResourceQuantity Evaluate(object host) + { + var q = new ResourceQuantity(); + foreach (var kvp in this) + q.Add(kvp.Key, kvp.Value.Evaluate(host)); + return q; + } +} diff --git a/FrEee/Modding/Scripts/CSScript.cs b/FrEee.Core/Modding/Scripts/CSScript.cs similarity index 99% rename from FrEee/Modding/Scripts/CSScript.cs rename to FrEee.Core/Modding/Scripts/CSScript.cs index b527e6d66..e43a0769e 100644 --- a/FrEee/Modding/Scripts/CSScript.cs +++ b/FrEee.Core/Modding/Scripts/CSScript.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Immutable; using System.IO; +using FrEee.Utility; namespace FrEee.Modding; diff --git a/FrEee/Modding/Scripts/IScript.cs b/FrEee.Core/Modding/Scripts/IScript.cs similarity index 100% rename from FrEee/Modding/Scripts/IScript.cs rename to FrEee.Core/Modding/Scripts/IScript.cs diff --git a/FrEee/Modding/Scripts/PythonScript.cs b/FrEee.Core/Modding/Scripts/PythonScript.cs similarity index 99% rename from FrEee/Modding/Scripts/PythonScript.cs rename to FrEee.Core/Modding/Scripts/PythonScript.cs index 5e0b153bd..dbf92379e 100644 --- a/FrEee/Modding/Scripts/PythonScript.cs +++ b/FrEee.Core/Modding/Scripts/PythonScript.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.IO; using FrEee.Modding.Scripts; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.Modding; diff --git a/FrEee/Modding/Scripts/PythonScriptEngine.cs b/FrEee.Core/Modding/Scripts/PythonScriptEngine.cs similarity index 98% rename from FrEee/Modding/Scripts/PythonScriptEngine.cs rename to FrEee.Core/Modding/Scripts/PythonScriptEngine.cs index d5c046d8a..78d975ff0 100644 --- a/FrEee/Modding/Scripts/PythonScriptEngine.cs +++ b/FrEee.Core/Modding/Scripts/PythonScriptEngine.cs @@ -9,6 +9,8 @@ using System.Linq; using System.Reflection; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.Modding; @@ -192,6 +194,7 @@ public static T RunScript(PythonScript script, IDictionary va preCommands.Add("import System"); preCommands.Add("clr.ImportExtensions(System.Linq)"); preCommands.Add("clr.AddReference('FrEee.Core')"); + preCommands.Add("clr.AddReference('FrEee.Core.Utility')"); preCommands.Add("import FrEee"); preCommands.Add("import FrEee.Utility"); preCommands.Add("clr.ImportExtensions(FrEee.Extensions)"); @@ -274,6 +277,7 @@ public static void RunScript(PythonScript script, IDictionary va preCommands.Add("import System"); preCommands.Add("clr.ImportExtensions(System.Linq)"); preCommands.Add("clr.AddReference('FrEee.Core')"); + preCommands.Add("clr.AddReference('FrEee.Core.Utility')"); preCommands.Add("import FrEee"); preCommands.Add("import FrEee.Utility"); preCommands.Add("clr.ImportExtensions(FrEee.Extensions)"); diff --git a/FrEee/Modding/Scripts/ScriptRequirement.cs b/FrEee.Core/Modding/Scripts/ScriptRequirement.cs similarity index 100% rename from FrEee/Modding/Scripts/ScriptRequirement.cs rename to FrEee.Core/Modding/Scripts/ScriptRequirement.cs diff --git a/FrEee/Modding/StellarObjectLocations/CircleRadiusStellarObjectLocation.cs b/FrEee.Core/Modding/StellarObjectLocations/CircleRadiusStellarObjectLocation.cs similarity index 96% rename from FrEee/Modding/StellarObjectLocations/CircleRadiusStellarObjectLocation.cs rename to FrEee.Core/Modding/StellarObjectLocations/CircleRadiusStellarObjectLocation.cs index 094551c1a..58f036ed7 100644 --- a/FrEee/Modding/StellarObjectLocations/CircleRadiusStellarObjectLocation.cs +++ b/FrEee.Core/Modding/StellarObjectLocations/CircleRadiusStellarObjectLocation.cs @@ -1,41 +1,43 @@ -using FrEee.Objects.Space; -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.StellarObjectLocations; - -/// -/// Places a stellar object on a "true" circle at a specified distance from the center. -/// -[Serializable] -public class CircleRadiusStellarObjectLocation : IStellarObjectLocation -{ - public Point? LastResult { get; private set; } - public int Radius { get; set; } - public ITemplate StellarObjectTemplate { get; set; } - - public Point Resolve(StarSystem sys, PRNG dice) - { - if (Radius < 0) - throw new Exception("Invalid location \"Circle Radius " + Radius + "\" specified."); - var pts = new List(); - for (int x = -Math.Min(Radius, sys.Radius); x <= Math.Min(Radius, sys.Radius); x++) - { - for (int y = -Math.Min(Radius, sys.Radius); y <= Math.Min(Radius, sys.Radius); y++) - { - // Don't let stellar objects overlap - if (Math.Round(Math.Sqrt(x * x + y * y)) == Radius && sys.GetSector(x, y).SpaceObjects.Count() == 0) - pts.Add(new Point(x, y)); - } - } - if (!pts.Any()) - throw new Exception("Cannot place stellar object - no empty sectors are available at radius " + Radius + "."); - LastResult = pts.PickRandom(dice); - return LastResult.Value; - } +using FrEee.Objects.Space; +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Modding.StellarObjectLocations; + +/// +/// Places a stellar object on a "true" circle at a specified distance from the center. +/// +[Serializable] +public class CircleRadiusStellarObjectLocation : IStellarObjectLocation +{ + public Point? LastResult { get; private set; } + public int Radius { get; set; } + public ITemplate StellarObjectTemplate { get; set; } + + public Point Resolve(StarSystem sys, PRNG dice) + { + if (Radius < 0) + throw new Exception("Invalid location \"Circle Radius " + Radius + "\" specified."); + var pts = new List(); + for (int x = -Math.Min(Radius, sys.Radius); x <= Math.Min(Radius, sys.Radius); x++) + { + for (int y = -Math.Min(Radius, sys.Radius); y <= Math.Min(Radius, sys.Radius); y++) + { + // Don't let stellar objects overlap + if (Math.Round(Math.Sqrt(x * x + y * y)) == Radius && sys.GetSector(x, y).SpaceObjects.Count() == 0) + pts.Add(new Point(x, y)); + } + } + if (!pts.Any()) + throw new Exception("Cannot place stellar object - no empty sectors are available at radius " + Radius + "."); + LastResult = pts.PickRandom(dice); + return LastResult.Value; + } } \ No newline at end of file diff --git a/FrEee/Modding/StellarObjectLocations/CoordStellarObjectLocation.cs b/FrEee.Core/Modding/StellarObjectLocations/CoordStellarObjectLocation.cs similarity index 97% rename from FrEee/Modding/StellarObjectLocations/CoordStellarObjectLocation.cs rename to FrEee.Core/Modding/StellarObjectLocations/CoordStellarObjectLocation.cs index b45ddd688..4dff71bc4 100644 --- a/FrEee/Modding/StellarObjectLocations/CoordStellarObjectLocation.cs +++ b/FrEee.Core/Modding/StellarObjectLocations/CoordStellarObjectLocation.cs @@ -1,42 +1,43 @@ -using FrEee.Objects.Space; -using FrEee.Utility; -using System; -using System.Drawing; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.StellarObjectLocations; - -/// -/// Chooses a specific sector of a system. -/// -[Serializable] -public class CoordStellarObjectLocation : IStellarObjectLocation -{ - public Point Coordinates { get; set; } - public Point? LastResult { get; private set; } - public ITemplate StellarObjectTemplate { get; set; } - - /// - /// If true, (0,0) is the center of the system. - /// Otherwise, (6,6) is the center of the system (as in SE4). - /// - public bool UseCenteredCoordinates { get; set; } - - public Point Resolve(StarSystem sys, PRNG dice) - { - int realx = Coordinates.X - (UseCenteredCoordinates ? 0 : 6); - int realy = Coordinates.Y - (UseCenteredCoordinates ? 0 : 6); - if (UseCenteredCoordinates) - { - if (realx < -sys.Radius || realx > sys.Radius || realy < -sys.Radius || realy > sys.Radius) - throw new Exception("Invalid location \"Centered Coord " + Coordinates.X + ", " + Coordinates.Y + "\" specified for system of radius " + sys.Radius + "."); - } - else - { - if (realx < -sys.Radius || realx > sys.Radius || realy < -sys.Radius || realy > sys.Radius) - throw new Exception("Invalid location \"Coord " + Coordinates.X + ", " + Coordinates.Y + "\" specified for system of radius " + sys.Radius + "."); - } - LastResult = new Point(realx, realy); - return LastResult.Value; - } +using FrEee.Objects.Space; +using FrEee.Utility; +using System; +using System.Drawing; +using FrEee.Objects.GameState; +using FrEee.Utility; + +namespace FrEee.Modding.StellarObjectLocations; + +/// +/// Chooses a specific sector of a system. +/// +[Serializable] +public class CoordStellarObjectLocation : IStellarObjectLocation +{ + public Point Coordinates { get; set; } + public Point? LastResult { get; private set; } + public ITemplate StellarObjectTemplate { get; set; } + + /// + /// If true, (0,0) is the center of the system. + /// Otherwise, (6,6) is the center of the system (as in SE4). + /// + public bool UseCenteredCoordinates { get; set; } + + public Point Resolve(StarSystem sys, PRNG dice) + { + int realx = Coordinates.X - (UseCenteredCoordinates ? 0 : 6); + int realy = Coordinates.Y - (UseCenteredCoordinates ? 0 : 6); + if (UseCenteredCoordinates) + { + if (realx < -sys.Radius || realx > sys.Radius || realy < -sys.Radius || realy > sys.Radius) + throw new Exception("Invalid location \"Centered Coord " + Coordinates.X + ", " + Coordinates.Y + "\" specified for system of radius " + sys.Radius + "."); + } + else + { + if (realx < -sys.Radius || realx > sys.Radius || realy < -sys.Radius || realy > sys.Radius) + throw new Exception("Invalid location \"Coord " + Coordinates.X + ", " + Coordinates.Y + "\" specified for system of radius " + sys.Radius + "."); + } + LastResult = new Point(realx, realy); + return LastResult.Value; + } } \ No newline at end of file diff --git a/FrEee/Modding/StellarObjectLocations/IStellarObjectLocation.cs b/FrEee.Core/Modding/StellarObjectLocations/IStellarObjectLocation.cs similarity index 97% rename from FrEee/Modding/StellarObjectLocations/IStellarObjectLocation.cs rename to FrEee.Core/Modding/StellarObjectLocations/IStellarObjectLocation.cs index 10e36cb63..50ff488ce 100644 --- a/FrEee/Modding/StellarObjectLocations/IStellarObjectLocation.cs +++ b/FrEee.Core/Modding/StellarObjectLocations/IStellarObjectLocation.cs @@ -2,6 +2,7 @@ using FrEee.Objects.Space; using FrEee.Utility; using System.Drawing; +using FrEee.Utility; namespace FrEee.Modding.StellarObjectLocations; diff --git a/FrEee/Modding/StellarObjectLocations/RingStellarObjectLocation.cs b/FrEee.Core/Modding/StellarObjectLocations/RingStellarObjectLocation.cs similarity index 96% rename from FrEee/Modding/StellarObjectLocations/RingStellarObjectLocation.cs rename to FrEee.Core/Modding/StellarObjectLocations/RingStellarObjectLocation.cs index 3f609792c..01182d141 100644 --- a/FrEee/Modding/StellarObjectLocations/RingStellarObjectLocation.cs +++ b/FrEee.Core/Modding/StellarObjectLocations/RingStellarObjectLocation.cs @@ -1,43 +1,45 @@ -using FrEee.Objects.Space; -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.StellarObjectLocations; - -/// -/// Chooses a sector at a particular distance from the center of the system. -/// Ring 1 is the center, ring 2 is one sector from the center, etc. -/// -[Serializable] -public class RingStellarObjectLocation : IStellarObjectLocation -{ - public Point? LastResult { get; private set; } - public int Ring { get; set; } - public ITemplate StellarObjectTemplate { get; set; } - - public Point Resolve(StarSystem sys, PRNG dice) - { - if (Ring < 1 || Ring > sys.Radius + 1) - throw new Exception("Invalid location \"Ring " + Ring + "\" specified for system of radius " + sys.Radius + "."); - var pts = new List(); - var dist = Ring - 1; - for (int x = -dist; x <= dist; x++) - { - for (int y = -dist; y <= dist; y++) - { - // Don't let stellar objects overlap - if ((Math.Abs(x) == dist || Math.Abs(y) == dist) && !sys.GetSector(x, y).SpaceObjects.Any()) - pts.Add(new Point(x, y)); - } - } - if (!pts.Any()) - throw new Exception("Cannot place stellar object - no empty sectors are available in ring " + Ring + "."); - LastResult = pts.PickRandom(dice); - return LastResult.Value; - } +using FrEee.Objects.Space; +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Modding.StellarObjectLocations; + +/// +/// Chooses a sector at a particular distance from the center of the system. +/// Ring 1 is the center, ring 2 is one sector from the center, etc. +/// +[Serializable] +public class RingStellarObjectLocation : IStellarObjectLocation +{ + public Point? LastResult { get; private set; } + public int Ring { get; set; } + public ITemplate StellarObjectTemplate { get; set; } + + public Point Resolve(StarSystem sys, PRNG dice) + { + if (Ring < 1 || Ring > sys.Radius + 1) + throw new Exception("Invalid location \"Ring " + Ring + "\" specified for system of radius " + sys.Radius + "."); + var pts = new List(); + var dist = Ring - 1; + for (int x = -dist; x <= dist; x++) + { + for (int y = -dist; y <= dist; y++) + { + // Don't let stellar objects overlap + if ((Math.Abs(x) == dist || Math.Abs(y) == dist) && !sys.GetSector(x, y).SpaceObjects.Any()) + pts.Add(new Point(x, y)); + } + } + if (!pts.Any()) + throw new Exception("Cannot place stellar object - no empty sectors are available in ring " + Ring + "."); + LastResult = pts.PickRandom(dice); + return LastResult.Value; + } } \ No newline at end of file diff --git a/FrEee/Modding/StellarObjectLocations/SameAsStellarObjectLocation.cs b/FrEee.Core/Modding/StellarObjectLocations/SameAsStellarObjectLocation.cs similarity index 97% rename from FrEee/Modding/StellarObjectLocations/SameAsStellarObjectLocation.cs rename to FrEee.Core/Modding/StellarObjectLocations/SameAsStellarObjectLocation.cs index 2d5a2ce73..59a00608f 100644 --- a/FrEee/Modding/StellarObjectLocations/SameAsStellarObjectLocation.cs +++ b/FrEee.Core/Modding/StellarObjectLocations/SameAsStellarObjectLocation.cs @@ -1,31 +1,32 @@ -using FrEee.Objects.Space; -using FrEee.Modding.Templates; -using FrEee.Utility; -using System; -using System.Drawing; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.StellarObjectLocations; - -/// -/// Places one stellar object at the same location as another. -/// -[Serializable] -public class SameAsStellarObjectLocation : IStellarObjectLocation -{ - public Point? LastResult { get; private set; } - public StarSystemTemplate StarSystemTemplate { get; set; } - public ITemplate StellarObjectTemplate { get; set; } - public int TargetIndex { get; set; } - - public Point Resolve(StarSystem sys, PRNG dice) - { - if (TargetIndex < 1 || TargetIndex > StarSystemTemplate.StellarObjectLocations.Count) - throw new Exception("Invalid location \"Same As " + TargetIndex + "\" specified for system with " + StarSystemTemplate.StellarObjectLocations.Count + " stellar objects."); - var target = StarSystemTemplate.StellarObjectLocations[TargetIndex - 1]; - if (target is SameAsStellarObjectLocation) - throw new Exception("A \"Same As\" stellar object location cannot target another \"Same As\" location."); - LastResult = target.LastResult; - return LastResult.Value; - } +using FrEee.Objects.Space; +using FrEee.Modding.Templates; +using FrEee.Utility; +using System; +using System.Drawing; +using FrEee.Objects.GameState; +using FrEee.Utility; + +namespace FrEee.Modding.StellarObjectLocations; + +/// +/// Places one stellar object at the same location as another. +/// +[Serializable] +public class SameAsStellarObjectLocation : IStellarObjectLocation +{ + public Point? LastResult { get; private set; } + public StarSystemTemplate StarSystemTemplate { get; set; } + public ITemplate StellarObjectTemplate { get; set; } + public int TargetIndex { get; set; } + + public Point Resolve(StarSystem sys, PRNG dice) + { + if (TargetIndex < 1 || TargetIndex > StarSystemTemplate.StellarObjectLocations.Count) + throw new Exception("Invalid location \"Same As " + TargetIndex + "\" specified for system with " + StarSystemTemplate.StellarObjectLocations.Count + " stellar objects."); + var target = StarSystemTemplate.StellarObjectLocations[TargetIndex - 1]; + if (target is SameAsStellarObjectLocation) + throw new Exception("A \"Same As\" stellar object location cannot target another \"Same As\" location."); + LastResult = target.LastResult; + return LastResult.Value; + } } \ No newline at end of file diff --git a/FrEee/Modding/StellarObjectSize.cs b/FrEee.Core/Modding/StellarObjectSize.cs similarity index 96% rename from FrEee/Modding/StellarObjectSize.cs rename to FrEee.Core/Modding/StellarObjectSize.cs index 5db4a9497..a762b48c3 100644 --- a/FrEee/Modding/StellarObjectSize.cs +++ b/FrEee.Core/Modding/StellarObjectSize.cs @@ -1,125 +1,125 @@ -using FrEee.Objects.Space; -using System; -using System.Collections.Generic; - -namespace FrEee.Modding; - -/// -/// A size of stellar objects from PlanetSize.txt. -/// -/// -[Serializable] -public class StellarObjectSize : IModObject, IComparable, IComparable -{ - /// - /// ID value for the ability on the component used to construct this world around a star. - /// - public string ConstructionAbilityID { get; set; } - - /// - /// Is this a constructed world? - /// Constructed worlds should not appear in galaxy generation. - /// - public bool IsConstructed { get; set; } - - public bool IsDisposed - { - get; private set; - } - - /// - /// Maximum kT cargo for a colony. - /// - public int MaxCargo { get; set; } - - /// - /// Maximum kT cargo for a domed colony. - /// - public int MaxCargoDomed { get; set; } - - /// - /// Maximum facilities for a colony. - /// - public int MaxFacilities { get; set; } - - /// - /// Maximum facilities for a domed colony. - /// - public int MaxFacilitiesDomed { get; set; } - - /// - /// Maximum population for a colony. - /// - public long MaxPopulation { get; set; } - - /// - /// Maximum population in millions for a domed colony. - /// - public long MaxPopulationDomed { get; set; } - - public string ModID - { - get; - set; - } - - /// - /// The name of this size. - /// - public string Name { get; set; } - - /// - /// Should be "Planet" or "Asteroids". - /// - public string StellarObjectType { get; set; } - - /// - /// Stellar size of this size. - /// - public StellarSize StellarSize { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public int CompareTo(object? obj) - { - if (obj is StellarSize) - return StellarSize.CompareTo(obj); - else if (obj is StellarObjectSize) - return this.CompareTo((StellarObjectSize)obj); - return StellarSize.CompareTo(obj); - } - - public int CompareTo(StellarObjectSize? obj) - { - return StellarSize.CompareTo(obj.StellarSize); - } - - public void Dispose() - { - Mod.Current.StellarObjectSizes.Remove(this); - IsDisposed = true; - } - - public override string ToString() - { - return Name; - } - - public static bool operator ==(StellarObjectSize s1, StellarObjectSize s2) - { - if (s1 is null && s2 is null) - return true; - if (s1 is null || s2 is null) - return false; - // TODO - compare template parameters somehow? - return s1.IsConstructed == s2.IsConstructed && s1.IsDisposed == s2.IsDisposed && s1.MaxCargo == s2.MaxCargo && s1.MaxCargoDomed == s2.MaxCargoDomed && s1.MaxFacilities == s2.MaxFacilities && s1.MaxFacilitiesDomed == s2.MaxFacilitiesDomed && s1.MaxPopulation == s2.MaxPopulation && s1.MaxPopulationDomed == s2.MaxPopulationDomed && s1.ModID == s2.ModID && s1.Name == s2.Name && s1.StellarObjectType == s2.StellarObjectType && s1.StellarSize == s2.StellarSize; - } - - public static bool operator !=(StellarObjectSize s1, StellarObjectSize s2) - { - return !(s1 == s2); - } +using FrEee.Objects.Space; +using System; +using System.Collections.Generic; + +namespace FrEee.Modding; + +/// +/// A size of stellar objects from PlanetSize.txt. +/// +/// +[Serializable] +public class StellarObjectSize : IModObject, IComparable, IComparable +{ + /// + /// ID value for the ability on the component used to construct this world around a star. + /// + public string ConstructionAbilityID { get; set; } + + /// + /// Is this a constructed world? + /// Constructed worlds should not appear in galaxy generation. + /// + public bool IsConstructed { get; set; } + + public bool IsDisposed + { + get; private set; + } + + /// + /// Maximum kT cargo for a colony. + /// + public int MaxCargo { get; set; } + + /// + /// Maximum kT cargo for a domed colony. + /// + public int MaxCargoDomed { get; set; } + + /// + /// Maximum facilities for a colony. + /// + public int MaxFacilities { get; set; } + + /// + /// Maximum facilities for a domed colony. + /// + public int MaxFacilitiesDomed { get; set; } + + /// + /// Maximum population for a colony. + /// + public long MaxPopulation { get; set; } + + /// + /// Maximum population in millions for a domed colony. + /// + public long MaxPopulationDomed { get; set; } + + public string ModID + { + get; + set; + } + + /// + /// The name of this size. + /// + public string Name { get; set; } + + /// + /// Should be "Planet" or "Asteroids". + /// + public string StellarObjectType { get; set; } + + /// + /// Stellar size of this size. + /// + public StellarSize StellarSize { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public int CompareTo(object? obj) + { + if (obj is StellarSize) + return StellarSize.CompareTo(obj); + else if (obj is StellarObjectSize) + return this.CompareTo((StellarObjectSize)obj); + return StellarSize.CompareTo(obj); + } + + public int CompareTo(StellarObjectSize? obj) + { + return StellarSize.CompareTo(obj.StellarSize); + } + + public void Dispose() + { + Mod.Current.StellarObjectSizes.Remove(this); + IsDisposed = true; + } + + public override string ToString() + { + return Name; + } + + public static bool operator ==(StellarObjectSize s1, StellarObjectSize s2) + { + if (s1 is null && s2 is null) + return true; + if (s1 is null || s2 is null) + return false; + // TODO - compare template parameters somehow? + return s1.IsConstructed == s2.IsConstructed && s1.IsDisposed == s2.IsDisposed && s1.MaxCargo == s2.MaxCargo && s1.MaxCargoDomed == s2.MaxCargoDomed && s1.MaxFacilities == s2.MaxFacilities && s1.MaxFacilitiesDomed == s2.MaxFacilitiesDomed && s1.MaxPopulation == s2.MaxPopulation && s1.MaxPopulationDomed == s2.MaxPopulationDomed && s1.ModID == s2.ModID && s1.Name == s2.Name && s1.StellarObjectType == s2.StellarObjectType && s1.StellarSize == s2.StellarSize; + } + + public static bool operator !=(StellarObjectSize s1, StellarObjectSize s2) + { + return !(s1 == s2); + } } \ No newline at end of file diff --git a/FrEee/Modding/Templates/AsteroidFieldTemplate.cs b/FrEee.Core/Modding/Templates/AsteroidFieldTemplate.cs similarity index 96% rename from FrEee/Modding/Templates/AsteroidFieldTemplate.cs rename to FrEee.Core/Modding/Templates/AsteroidFieldTemplate.cs index b28da4886..4a509a4a1 100644 --- a/FrEee/Modding/Templates/AsteroidFieldTemplate.cs +++ b/FrEee.Core/Modding/Templates/AsteroidFieldTemplate.cs @@ -1,92 +1,94 @@ -using FrEee.Objects.Space; -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.Templates; - -/// -/// A template for generating asteroid fields. -/// -[Serializable] -public class AsteroidFieldTemplate : ITemplate, IModObject -{ - /// - /// Abilities to assign to the asteroid field. - /// - public RandomAbilityTemplate Abilities { get; set; } - - /// - /// The atmosphere of the asteroid field, or null to choose a planet randomly. - /// - public string Atmosphere { get; set; } - - public bool IsDisposed - { - get; private set; - } - - public string ModID - { - get; - set; - } - - public string Name { get; set; } - - /// - /// The size of the asteroid field, or null to choose a size randomly. - /// - public StellarSize? StellarSize { get; set; } - - /// - /// The surface compositiion of the asteroid field, or null to choose a surface randomly. - /// - public string Surface { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public void Dispose() - { - // TODO - remove it from somewhere? - IsDisposed = true; - } - - public AsteroidField Instantiate() - { - var candidates = Mod.Current.StellarObjectTemplates.OfType(); - if (Atmosphere != null) - candidates = candidates.Where(ast => ast.Atmosphere == Atmosphere); - if (Surface != null) - candidates = candidates.Where(ast => ast.Surface == Surface); - if (StellarSize != null) - candidates = candidates.Where(ast => ast.StellarSize == StellarSize); - - if (!candidates.Any()) - throw new Exception("No asteroid fields in SectType.txt match the criteria:\n\tAtmosphere: " + (Atmosphere ?? "Any") + "\n\tSurface: " + (Surface ?? "Any") + "\n\tStellar Size: " + (StellarSize == null ? "Any" : StellarSize.ToString())); - - var asteroids = candidates.PickRandom().Instantiate(); - - if (asteroids.Size == null) - { - var sizes = Mod.Current.StellarObjectSizes.Where(sos => sos.StellarObjectType == "Asteroids" && !sos.IsConstructed && (StellarSize == null || sos.StellarSize == StellarSize.Value)); - asteroids.Size = sizes.PickRandom(); - } - - var abil = Abilities.Instantiate(); - if (abil != null) - asteroids.IntrinsicAbilities.Add(abil); - - asteroids.ResourceValue[Resource.Minerals] = RandomHelper.Range(Galaxy.Current.MinSpawnedAsteroidValue, Galaxy.Current.MaxSpawnedAsteroidValue); - asteroids.ResourceValue[Resource.Organics] = RandomHelper.Range(Galaxy.Current.MinSpawnedAsteroidValue, Galaxy.Current.MaxSpawnedAsteroidValue); - asteroids.ResourceValue[Resource.Radioactives] = RandomHelper.Range(Galaxy.Current.MinSpawnedAsteroidValue, Galaxy.Current.MaxSpawnedAsteroidValue); - - return asteroids; - } +using FrEee.Objects.Space; +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Modding.Templates; + +/// +/// A template for generating asteroid fields. +/// +[Serializable] +public class AsteroidFieldTemplate : ITemplate, IModObject +{ + /// + /// Abilities to assign to the asteroid field. + /// + public RandomAbilityTemplate Abilities { get; set; } + + /// + /// The atmosphere of the asteroid field, or null to choose a planet randomly. + /// + public string Atmosphere { get; set; } + + public bool IsDisposed + { + get; private set; + } + + public string ModID + { + get; + set; + } + + public string Name { get; set; } + + /// + /// The size of the asteroid field, or null to choose a size randomly. + /// + public StellarSize? StellarSize { get; set; } + + /// + /// The surface compositiion of the asteroid field, or null to choose a surface randomly. + /// + public string Surface { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public void Dispose() + { + // TODO - remove it from somewhere? + IsDisposed = true; + } + + public AsteroidField Instantiate() + { + var candidates = Mod.Current.StellarObjectTemplates.OfType(); + if (Atmosphere != null) + candidates = candidates.Where(ast => ast.Atmosphere == Atmosphere); + if (Surface != null) + candidates = candidates.Where(ast => ast.Surface == Surface); + if (StellarSize != null) + candidates = candidates.Where(ast => ast.StellarSize == StellarSize); + + if (!candidates.Any()) + throw new Exception("No asteroid fields in SectType.txt match the criteria:\n\tAtmosphere: " + (Atmosphere ?? "Any") + "\n\tSurface: " + (Surface ?? "Any") + "\n\tStellar Size: " + (StellarSize == null ? "Any" : StellarSize.ToString())); + + var asteroids = candidates.PickRandom().Instantiate(); + + if (asteroids.Size == null) + { + var sizes = Mod.Current.StellarObjectSizes.Where(sos => sos.StellarObjectType == "Asteroids" && !sos.IsConstructed && (StellarSize == null || sos.StellarSize == StellarSize.Value)); + asteroids.Size = sizes.PickRandom(); + } + + var abil = Abilities.Instantiate(); + if (abil != null) + asteroids.IntrinsicAbilities.Add(abil); + + asteroids.ResourceValue[Resource.Minerals] = RandomHelper.Range(Galaxy.Current.MinSpawnedAsteroidValue, Galaxy.Current.MaxSpawnedAsteroidValue); + asteroids.ResourceValue[Resource.Organics] = RandomHelper.Range(Galaxy.Current.MinSpawnedAsteroidValue, Galaxy.Current.MaxSpawnedAsteroidValue); + asteroids.ResourceValue[Resource.Radioactives] = RandomHelper.Range(Galaxy.Current.MinSpawnedAsteroidValue, Galaxy.Current.MaxSpawnedAsteroidValue); + + return asteroids; + } } \ No newline at end of file diff --git a/FrEee/Modding/Templates/ComponentTemplate.cs b/FrEee.Core/Modding/Templates/ComponentTemplate.cs similarity index 94% rename from FrEee/Modding/Templates/ComponentTemplate.cs rename to FrEee.Core/Modding/Templates/ComponentTemplate.cs index 71efcbb47..ca8160a09 100644 --- a/FrEee/Modding/Templates/ComponentTemplate.cs +++ b/FrEee.Core/Modding/Templates/ComponentTemplate.cs @@ -1,347 +1,349 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; -using FrEee.Objects.Technology; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using FrEee.Objects.GameState; -using FrEee.Objects.Vehicles; -using FrEee.Objects.Combat; - -namespace FrEee.Modding.Templates; - -/// -/// A template for a vehicle component. -/// -[Serializable] -public class ComponentTemplate : IModObject, IResearchable, IAbilityContainer, ITemplate, IUpgradeable -{ - public ComponentTemplate() - { - Abilities = new List(); - UnlockRequirements = new List>(); - Cost = new ResourceFormula(this); - } - - /// - /// Abilities possessed by this component. - /// - public IList Abilities { get; private set; } - - public AbilityTargets AbilityTarget - { - get { return AbilityTargets.Component; } - } - - public IEnumerable Children - { - get { yield break; } - } - - /// - /// The cost to build the component. - /// - public ResourceFormula Cost { get; set; } - - /// - /// A description of the component. - /// - public Formula Description { get; set; } - - /// - /// The durability of the component, in kilotons. (Yes, kilotons.) - /// - public Formula Durability { get; set; } - - /// - /// The family that the component belongs to. Used for "Only Latest" on the design screen. - /// - public Formula Family { get; set; } - - /// - /// The group that the component belongs to. Used for grouping on the design screen. - /// - public Formula Group { get; set; } - - [DoNotSerialize] - public Image Icon - { - get { return Pictures.GetIcon(this); } - } - - public Image Icon32 => Icon.Resize(32); - - public IEnumerable IconPaths - { - get - { - return PortraitPaths; - } - } - - public long ID { get; set; } - - public IEnumerable IntrinsicAbilities - { - get { return Abilities; } - } - - public bool IsDisposed { get; set; } - - public bool IsMemory - { - get; - set; - } - - public bool IsObsolescent - { - get { return this != LatestVersion; } - } - - /// - /// Is this component template obsolete for the current empire? - /// - /// - /// Components are obsolete if and only if they are obsolescent; they cannot currently be "marked" obsolete by the player. - /// - public bool IsObsolete - { - get - { - return this.IsObsolescent; - } - } - - /// - /// The latest upgraded version of this component template. - /// - public ComponentTemplate LatestVersion - { - get - { - var latest = OlderVersions.UnionSingle(this).Union(NewerVersions).Where(t => Empire.Current.HasUnlocked(t)).LastOrDefault(); - if (latest != null) - { - System.Diagnostics.Debug.WriteLine($"{this} is obsoleted by {latest}"); - return latest; - } - return this; - } - } - - /// - /// The maximum number of this component family that can be installed on a vehicle, or null for no limit. - /// - public Formula MaxPerVehicle { get; set; } - - public string ModID - { - get; - set; - } - - /// - /// The name of the component. - /// - public Formula Name { get; set; } - - string INamed.Name - { - get { return Name; } - } - - public IEnumerable NewerVersions - { - get - { - return Mod.Current.ComponentTemplates.NewerVersions(this, ct => ct.Family); - } - } - - public IEnumerable OlderVersions - { - get - { - return Mod.Current.ComponentTemplates.OlderVersions(this, ct => ct.Family); - } - } - - /// - /// No one owns component templates; they are shared. - /// - public Empire Owner { get { return null; } } - - public IEnumerable Parents - { - get - { - yield break; - } - } - - /// - /// Name of the picture used to represent this component, excluding the file extension. - /// PNG files will be searched first, then BMP. - /// - public Formula PictureName { get; set; } - - [DoNotSerialize] - public Image Portrait - { - get { return Pictures.GetPortrait(this); } - } - - public IEnumerable PortraitPaths - { - get - { - if (Mod.Current.RootPath != null) - yield return Path.Combine("Mods", Mod.Current.RootPath, "Pictures", "Components", PictureName); - yield return Path.Combine("Pictures", "Components", PictureName); - } - } - - public string ResearchGroup - { - get { return "Component"; } - } - - /// - /// The value of the Roman numeral that should be displayed on the component's icon. - /// - public Formula RomanNumeral { get; set; } - - /// - /// The size of the component, in kilotons. - /// - public Formula Size { get; set; } - - /// - /// Used by artificial world construction abilities. - /// - public Formula StellarConstructionGroup { get; set; } - - /// - /// Amount of supply consumed when this component is "used". (What "usage" means depends on the component's abilities.) - /// - public Formula SupplyUsage { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public double Timestamp - { - get; - set; - } - - /// - /// The requirements to unlock this component. - /// - public IList> UnlockRequirements { get; private set; } - - /// - /// The vehicle types on which this component can be installed. - /// - public VehicleTypes VehicleTypes { get; set; } - - /// - /// If this component is a weapon, info about it will be stored here. - /// - public WeaponInfo WeaponInfo { get; set; } - - public WeaponTypes WeaponType - { - get { return WeaponInfo == null ? WeaponTypes.NotAWeapon : WeaponInfo.WeaponType; } - } - - /// - /// Can this component use a mount? - /// - /// - /// - public bool CanUseMount(Mount m) - { - return m == null || ( - (m.RequiredComponentFamily == null || m.RequiredComponentFamily.Value.Split(',').Select(q => q.Trim()).Contains(Family.Value)) && - m.WeaponTypes.Value.HasFlag(WeaponType) - ); - } - - /// - /// Mod objects are fully known to everyone. - /// - /// - /// - public Visibility CheckVisibility(Empire emp) - { - return Visibility.Scanned; - } - - public void Dispose() - { - if (IsDisposed) - return; - if (Mod.Current != null) - Mod.Current.ComponentTemplates.Remove(this); - } - - /// - /// Creates a component from this template. - /// - /// - public Component Instantiate() - { - return new Component(null, new MountedComponentTemplate(null, this, null)); - } - - public bool IsObsoleteMemory(Empire emp) - { - return false; - } - - public void Redact(Empire emp) - { - // TODO - tech items that aren't visible until some requirements are met - } - - public override string ToString() - { - return Name; - } - - public override bool Equals(object? obj) - { - return obj is ComponentTemplate t && t == this; - } - - public override int GetHashCode() - { - if (ModID is null) - return base.GetHashCode(); - return ModID.GetHashCode(); - } - - public static bool operator ==(ComponentTemplate? t1, ComponentTemplate? t2) - { - if (t1 is null && t2 is null) - return true; - if (t1 is null || t2 is null) - return false; - // treat component templates with the same mod ID as duplicates - return t1.ModID == t2.ModID; - } - - public static bool operator !=(ComponentTemplate t1, ComponentTemplate t2) - { - return !(t1 == t2); - } +using FrEee.Objects.Civilization; +using FrEee.Objects.Technology; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Objects.Vehicles; +using FrEee.Extensions; +using FrEee.Serialization; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; + +namespace FrEee.Modding.Templates; + +/// +/// A template for a vehicle component. +/// +[Serializable] +public class ComponentTemplate : IModObject, IResearchable, IAbilityContainer, ITemplate, IUpgradeable +{ + public ComponentTemplate() + { + Abilities = new List(); + UnlockRequirements = new List>(); + Cost = new ResourceFormula(this); + } + + /// + /// Abilities possessed by this component. + /// + public IList Abilities { get; private set; } + + public AbilityTargets AbilityTarget + { + get { return AbilityTargets.Component; } + } + + public IEnumerable Children + { + get { yield break; } + } + + /// + /// The cost to build the component. + /// + public ResourceFormula Cost { get; set; } + + /// + /// A description of the component. + /// + public Formula Description { get; set; } + + /// + /// The durability of the component, in kilotons. (Yes, kilotons.) + /// + public Formula Durability { get; set; } + + /// + /// The family that the component belongs to. Used for "Only Latest" on the design screen. + /// + public Formula Family { get; set; } + + /// + /// The group that the component belongs to. Used for grouping on the design screen. + /// + public Formula Group { get; set; } + + [DoNotSerialize] + public Image Icon + { + get { return Pictures.GetIcon(this); } + } + + public Image Icon32 => Icon.Resize(32); + + public IEnumerable IconPaths + { + get + { + return PortraitPaths; + } + } + + public long ID { get; set; } + + public IEnumerable IntrinsicAbilities + { + get { return Abilities; } + } + + public bool IsDisposed { get; set; } + + public bool IsMemory + { + get; + set; + } + + public bool IsObsolescent + { + get { return this != LatestVersion; } + } + + /// + /// Is this component template obsolete for the current empire? + /// + /// + /// Components are obsolete if and only if they are obsolescent; they cannot currently be "marked" obsolete by the player. + /// + public bool IsObsolete + { + get + { + return this.IsObsolescent; + } + } + + /// + /// The latest upgraded version of this component template. + /// + public ComponentTemplate LatestVersion + { + get + { + var latest = OlderVersions.UnionSingle(this).Union(NewerVersions).Where(t => Empire.Current.HasUnlocked(t)).LastOrDefault(); + if (latest != null) + { + System.Diagnostics.Debug.WriteLine($"{this} is obsoleted by {latest}"); + return latest; + } + return this; + } + } + + /// + /// The maximum number of this component family that can be installed on a vehicle, or null for no limit. + /// + public Formula MaxPerVehicle { get; set; } + + public string ModID + { + get; + set; + } + + /// + /// The name of the component. + /// + public Formula Name { get; set; } + + string INamed.Name + { + get { return Name; } + } + + public IEnumerable NewerVersions + { + get + { + return Mod.Current.ComponentTemplates.NewerVersions(this, ct => ct.Family); + } + } + + public IEnumerable OlderVersions + { + get + { + return Mod.Current.ComponentTemplates.OlderVersions(this, ct => ct.Family); + } + } + + /// + /// No one owns component templates; they are shared. + /// + public Empire Owner { get { return null; } } + + public IEnumerable Parents + { + get + { + yield break; + } + } + + /// + /// Name of the picture used to represent this component, excluding the file extension. + /// PNG files will be searched first, then BMP. + /// + public Formula PictureName { get; set; } + + [DoNotSerialize] + public Image Portrait + { + get { return Pictures.GetPortrait(this); } + } + + public IEnumerable PortraitPaths + { + get + { + if (Mod.Current.RootPath != null) + yield return Path.Combine("Mods", Mod.Current.RootPath, "Pictures", "Components", PictureName); + yield return Path.Combine("Pictures", "Components", PictureName); + } + } + + public string ResearchGroup + { + get { return "Component"; } + } + + /// + /// The value of the Roman numeral that should be displayed on the component's icon. + /// + public Formula RomanNumeral { get; set; } + + /// + /// The size of the component, in kilotons. + /// + public Formula Size { get; set; } + + /// + /// Used by artificial world construction abilities. + /// + public Formula StellarConstructionGroup { get; set; } + + /// + /// Amount of supply consumed when this component is "used". (What "usage" means depends on the component's abilities.) + /// + public Formula SupplyUsage { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public double Timestamp + { + get; + set; + } + + /// + /// The requirements to unlock this component. + /// + public IList> UnlockRequirements { get; private set; } + + /// + /// The vehicle types on which this component can be installed. + /// + public VehicleTypes VehicleTypes { get; set; } + + /// + /// If this component is a weapon, info about it will be stored here. + /// + public WeaponInfo WeaponInfo { get; set; } + + public WeaponTypes WeaponType + { + get { return WeaponInfo == null ? WeaponTypes.NotAWeapon : WeaponInfo.WeaponType; } + } + + /// + /// Can this component use a mount? + /// + /// + /// + public bool CanUseMount(Mount m) + { + return m == null || ( + (m.RequiredComponentFamily == null || m.RequiredComponentFamily.Value.Split(',').Select(q => q.Trim()).Contains(Family.Value)) && + m.WeaponTypes.Value.HasFlag(WeaponType) + ); + } + + /// + /// Mod objects are fully known to everyone. + /// + /// + /// + public Visibility CheckVisibility(Empire emp) + { + return Visibility.Scanned; + } + + public void Dispose() + { + if (IsDisposed) + return; + if (Mod.Current != null) + Mod.Current.ComponentTemplates.Remove(this); + } + + /// + /// Creates a component from this template. + /// + /// + public Component Instantiate() + { + return new Component(null, new MountedComponentTemplate(null, this, null)); + } + + public bool IsObsoleteMemory(Empire emp) + { + return false; + } + + public void Redact(Empire emp) + { + // TODO - tech items that aren't visible until some requirements are met + } + + public override string ToString() + { + return Name; + } + + public override bool Equals(object? obj) + { + return obj is ComponentTemplate t && t == this; + } + + public override int GetHashCode() + { + if (ModID is null) + return base.GetHashCode(); + return ModID.GetHashCode(); + } + + public static bool operator ==(ComponentTemplate? t1, ComponentTemplate? t2) + { + if (t1 is null && t2 is null) + return true; + if (t1 is null || t2 is null) + return false; + // treat component templates with the same mod ID as duplicates + return t1.ModID == t2.ModID; + } + + public static bool operator !=(ComponentTemplate t1, ComponentTemplate t2) + { + return !(t1 == t2); + } } \ No newline at end of file diff --git a/FrEee/Modding/Templates/FacilityTemplate.cs b/FrEee.Core/Modding/Templates/FacilityTemplate.cs similarity index 94% rename from FrEee/Modding/Templates/FacilityTemplate.cs rename to FrEee.Core/Modding/Templates/FacilityTemplate.cs index c51e4ff81..8f28796a9 100644 --- a/FrEee/Modding/Templates/FacilityTemplate.cs +++ b/FrEee.Core/Modding/Templates/FacilityTemplate.cs @@ -1,293 +1,294 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using FrEee.Objects.Civilization.Construction; -using FrEee.Objects.GameState; - -namespace FrEee.Objects.Technology; - -/// -/// A template for a facility. -/// -[Serializable] -public class FacilityTemplate : IModObject, IResearchable, IAbilityContainer, ITemplate, IConstructionTemplate, IUpgradeable -{ - public FacilityTemplate() - { - Abilities = new List(); - UnlockRequirements = new List>(); - Cost = new ResourceFormula(this); - } - - /// - /// Abilities possessed by this facility. - /// - public IList Abilities { get; private set; } - - public AbilityTargets AbilityTarget - { - get { return AbilityTargets.Facility; } - } - - public IEnumerable Children - { - get { yield break; } - } - - /// - /// The cost to build the facility. - /// - public ResourceFormula Cost { get; set; } - - ResourceQuantity IConstructionTemplate.Cost - { - get - { - return Cost; - } - } - - /// - /// A description of the facility. - /// - public Formula Description { get; set; } - - /// - /// The family that the facility belongs to. Used for "Only Latest" on the construction queue screen. - /// - public Formula Family { get; set; } - - /// - /// The group that the facility belongs to. Used for grouping on the construction queue screen. - /// - public Formula Group { get; set; } - - [DoNotSerialize] - public Image Icon - { - get { return Pictures.GetIcon(this); } - } - - public Image Icon32 => Icon.Resize(32); - - public IEnumerable IconPaths - { - get - { - return PortraitPaths; - } - } - - public long ID - { - get; - set; - } - - public IEnumerable IntrinsicAbilities - { - get { return Abilities; } - } - - public bool IsDisposed { get; set; } - - public bool IsMemory - { - get; - set; - } - - public bool IsObsolescent - { - get - { - return this != LatestVersion; - } - } - - /// - /// Facility templates cannot be manually obsoleted; they are obsoleted automatically when new ones are unlocked. - /// - public bool IsObsolete - { - get { return this.IsObsolescent; } - } - - /// - /// The latest upgraded version of this component template. - /// - public FacilityTemplate LatestVersion - { - get - { - return NewerVersions.Where(t => Empire.Current.HasUnlocked(t)).LastOrDefault() ?? this; - } - } - - public string ModID - { - get; - set; - } - - /// - /// The name of the facility. - /// - public Formula Name { get; set; } - - string INamed.Name - { - get { return Name; } - } - - public IEnumerable NewerVersions - { - get - { - return Mod.Current.FacilityTemplates.NewerVersions(this, t => t.Family); - } - } - - public IEnumerable OlderVersions - { - get - { - return Mod.Current.FacilityTemplates.OlderVersions(this, t => t.Family); - } - } - - public Empire Owner - { - get { return null; } - } - - public IEnumerable Parents - { - get - { - yield break; - } - } - - /// - /// Name of the picture used to represent this facility, excluding the file extension. - /// PNG files will be searched first, then BMP. - /// - public Formula PictureName { get; set; } - - [DoNotSerialize] - public Image Portrait - { - get { return Pictures.GetPortrait(this); } - } - - public IEnumerable PortraitPaths - { - get - { - if (Mod.Current.RootPath != null) - yield return Path.Combine("Mods", Mod.Current.RootPath, "Pictures", "Facilities", PictureName); - yield return Path.Combine("Pictures", "Facilities", PictureName); - } - } - - /// - /// Facilities must be built on a colony. - /// - public bool RequiresColonyQueue - { - get { return true; } - } - - /// - /// Facilities do not require a space yard. - /// - public bool RequiresSpaceYardQueue - { - get { return false; } - } - - public string ResearchGroup - { - get { return "Facility"; } - } - - /// - /// The value of the Roman numeral that should be displayed on the facility's icon. - /// - public Formula RomanNumeral { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public double Timestamp - { - get; - set; - } - - /// - /// The technology requirements for this facility. - /// - public IList> UnlockRequirements { get; private set; } - - public static readonly FacilityTemplate Unknown = new FacilityTemplate { Name = "Unknown", ModID = "*UNKNOWN*" }; - - /// - /// Mod objects are fully known to everyone. - /// - /// - /// - public Visibility CheckVisibility(Empire emp) - { - return Visibility.Scanned; - } - - public void Dispose() - { - if (IsDisposed) - return; - Galaxy.Current.UnassignID(this); - if (Mod.Current != null) - Mod.Current.FacilityTemplates.Remove(this); - } - - public bool HasBeenUnlockedBy(Empire emp) - { - return emp.HasUnlocked(this); - } - - /// - /// Creates a facility from the template. - /// - /// - public Facility Instantiate() - { - return new Facility(this); - } - - public bool IsObsoleteMemory(Empire emp) - { - return false; - } - - public void Redact(Empire emp) - { - // TODO - tech items that aren't visible until some requirements are met - } - - public override string ToString() - { - return Name; - } +using FrEee.Objects.Civilization; +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using FrEee.Objects.Civilization.Construction; +using FrEee.Objects.GameState; +using FrEee.Serialization; +using FrEee.Modding.Abilities; + +namespace FrEee.Objects.Technology; + +/// +/// A template for a facility. +/// +[Serializable] +public class FacilityTemplate : IModObject, IResearchable, IAbilityContainer, ITemplate, IConstructionTemplate, IUpgradeable +{ + public FacilityTemplate() + { + Abilities = new List(); + UnlockRequirements = new List>(); + Cost = new ResourceFormula(this); + } + + /// + /// Abilities possessed by this facility. + /// + public IList Abilities { get; private set; } + + public AbilityTargets AbilityTarget + { + get { return AbilityTargets.Facility; } + } + + public IEnumerable Children + { + get { yield break; } + } + + /// + /// The cost to build the facility. + /// + public ResourceFormula Cost { get; set; } + + ResourceQuantity IConstructionTemplate.Cost + { + get + { + return Cost; + } + } + + /// + /// A description of the facility. + /// + public Formula Description { get; set; } + + /// + /// The family that the facility belongs to. Used for "Only Latest" on the construction queue screen. + /// + public Formula Family { get; set; } + + /// + /// The group that the facility belongs to. Used for grouping on the construction queue screen. + /// + public Formula Group { get; set; } + + [DoNotSerialize] + public Image Icon + { + get { return Pictures.GetIcon(this); } + } + + public Image Icon32 => Icon.Resize(32); + + public IEnumerable IconPaths + { + get + { + return PortraitPaths; + } + } + + public long ID + { + get; + set; + } + + public IEnumerable IntrinsicAbilities + { + get { return Abilities; } + } + + public bool IsDisposed { get; set; } + + public bool IsMemory + { + get; + set; + } + + public bool IsObsolescent + { + get + { + return this != LatestVersion; + } + } + + /// + /// Facility templates cannot be manually obsoleted; they are obsoleted automatically when new ones are unlocked. + /// + public bool IsObsolete + { + get { return this.IsObsolescent; } + } + + /// + /// The latest upgraded version of this component template. + /// + public FacilityTemplate LatestVersion + { + get + { + return NewerVersions.Where(t => Empire.Current.HasUnlocked(t)).LastOrDefault() ?? this; + } + } + + public string ModID + { + get; + set; + } + + /// + /// The name of the facility. + /// + public Formula Name { get; set; } + + string INamed.Name + { + get { return Name; } + } + + public IEnumerable NewerVersions + { + get + { + return Mod.Current.FacilityTemplates.NewerVersions(this, t => t.Family); + } + } + + public IEnumerable OlderVersions + { + get + { + return Mod.Current.FacilityTemplates.OlderVersions(this, t => t.Family); + } + } + + public Empire Owner + { + get { return null; } + } + + public IEnumerable Parents + { + get + { + yield break; + } + } + + /// + /// Name of the picture used to represent this facility, excluding the file extension. + /// PNG files will be searched first, then BMP. + /// + public Formula PictureName { get; set; } + + [DoNotSerialize] + public Image Portrait + { + get { return Pictures.GetPortrait(this); } + } + + public IEnumerable PortraitPaths + { + get + { + if (Mod.Current.RootPath != null) + yield return Path.Combine("Mods", Mod.Current.RootPath, "Pictures", "Facilities", PictureName); + yield return Path.Combine("Pictures", "Facilities", PictureName); + } + } + + /// + /// Facilities must be built on a colony. + /// + public bool RequiresColonyQueue + { + get { return true; } + } + + /// + /// Facilities do not require a space yard. + /// + public bool RequiresSpaceYardQueue + { + get { return false; } + } + + public string ResearchGroup + { + get { return "Facility"; } + } + + /// + /// The value of the Roman numeral that should be displayed on the facility's icon. + /// + public Formula RomanNumeral { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public double Timestamp + { + get; + set; + } + + /// + /// The technology requirements for this facility. + /// + public IList> UnlockRequirements { get; private set; } + + public static readonly FacilityTemplate Unknown = new FacilityTemplate { Name = "Unknown", ModID = "*UNKNOWN*" }; + + /// + /// Mod objects are fully known to everyone. + /// + /// + /// + public Visibility CheckVisibility(Empire emp) + { + return Visibility.Scanned; + } + + public void Dispose() + { + if (IsDisposed) + return; + Galaxy.Current.UnassignID(this); + if (Mod.Current != null) + Mod.Current.FacilityTemplates.Remove(this); + } + + public bool HasBeenUnlockedBy(Empire emp) + { + return emp.HasUnlocked(this); + } + + /// + /// Creates a facility from the template. + /// + /// + public Facility Instantiate() + { + return new Facility(this); + } + + public bool IsObsoleteMemory(Empire emp) + { + return false; + } + + public void Redact(Empire emp) + { + // TODO - tech items that aren't visible until some requirements are met + } + + public override string ToString() + { + return Name; + } } \ No newline at end of file diff --git a/FrEee/Modding/Templates/GalaxyTemplate.cs b/FrEee.Core/Modding/Templates/GalaxyTemplate.cs similarity index 96% rename from FrEee/Modding/Templates/GalaxyTemplate.cs rename to FrEee.Core/Modding/Templates/GalaxyTemplate.cs index 817a31a84..314a43129 100644 --- a/FrEee/Modding/Templates/GalaxyTemplate.cs +++ b/FrEee.Core/Modding/Templates/GalaxyTemplate.cs @@ -1,474 +1,476 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using FrEee.Objects.Space; -using FrEee.Setup; -using FrEee.Utility; -using FrEee.Extensions; -using FrEee.Setup.StarSystemPlacementStrategies; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.Templates; - -/// -/// A template for creating galaxies -/// Maps to a record in QuadrantTypes.txt. -/// -[Serializable] -public class GalaxyTemplate : ITemplate, IModObject -{ - public GalaxyTemplate() - { - StarSystemTemplateChances = new Dictionary(); - } - - /// - /// A description of this galaxy template. - /// - public string Description { get; set; } - - /// - /// Setup parameters for the game. - /// - public GameSetup GameSetup { get; set; } - - public bool IsDisposed - { - get; private set; - } - - /// - /// Preferred maximum warp points per system. May be overridden for connectivity purposes. - /// - public int MaxWarpPointsPerSystem { get; set; } - - /// - /// Minimum number of empty squares between star systems. - /// (Zero, not one, means systems can be adjacent.) - /// - public int MinimumStarSystemDistance { get; set; } - - /// - /// Preferred minimum angle between warp points in a system. May be overridden for connectivity purposes. - /// - public int MinWarpPointAngle { get; set; } - - public string ModID - { - get; - set; - } - - /// - /// The name of this galaxy template. - /// - public string Name { get; set; } - - /// - /// Algorithm for placing stars on the galaxy map. - /// - public IStarSystemPlacementStrategy StarSystemPlacementStrategy { get; set; } - - /// - /// Chances for each type of star system to appear. - /// - public IDictionary StarSystemTemplateChances { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public void Dispose() - { - // TODO - remove it from somewhere? - IsDisposed = true; - } - - public Galaxy Instantiate() - { - return Instantiate(null, 1.0, new PRNG(RandomSeed)); - } - - public int RandomSeed { get; set; } = DateTime.Now.Millisecond + 1000 * DateTime.Now.Second + 60000 * DateTime.Now.Minute; - - /// A status object to report status back to the GUI. - /// How much progress should we report back to the GUI when we're done initializing the galaxy? 1.0 means all done with everything that needs to be done. - public Galaxy Instantiate(Status status, double desiredProgress, PRNG dice) - { - var gal = new Galaxy(); - gal.Width = GameSetup.GalaxySize.Width; - gal.Height = GameSetup.GalaxySize.Height; - gal.MinPlanetValue = GameSetup.MinPlanetValue; - gal.MinSpawnedPlanetValue = GameSetup.MinSpawnedPlanetValue; - gal.MaxSpawnedPlanetValue = GameSetup.MaxSpawnedPlanetValue; - gal.MaxPlanetValue = GameSetup.MaxPlanetValue; - gal.MinAsteroidValue = GameSetup.MinAsteroidValue; - gal.MinSpawnedAsteroidValue = GameSetup.MinSpawnedAsteroidValue; - gal.MaxSpawnedAsteroidValue = GameSetup.MaxSpawnedAsteroidValue; - gal.EventFrequency = GameSetup.EventFrequency; - gal.MaximumEventSeverity = GameSetup.MaximumEventSeverity; - var bounds = new Rectangle(-GameSetup.GalaxySize.Width / 2, -GameSetup.GalaxySize.Height / 2, GameSetup.GalaxySize.Width, GameSetup.GalaxySize.Height); - - var unusedNames = new List(Mod.Current.StarSystemNames); - - // create star systems - if (status != null) - status.Message = "Creating star systems"; - var progressPerStarSystem = (desiredProgress - (status == null ? 0 : status.Progress)) / GameSetup.StarSystemCount / 2d; - for (int i = 0; i < GameSetup.StarSystemCount; i++) - { - if (status != null) - status.Message = "Creating star system " + (i + 1) + " of " + GameSetup.StarSystemCount; - var p = StarSystemPlacementStrategy.PlaceStarSystem(gal, MinimumStarSystemDistance, bounds, GameSetup.StarSystemCount - i, dice); - if (p == null) - break; // no more locations available - - var sst = StarSystemTemplateChances.PickWeighted(dice); - sst.Dice = dice; - var sys = sst.Instantiate(); - sys.Name = unusedNames.PickRandom(dice); - unusedNames.Remove(sys.Name); - NameStellarObjects(sys); - gal.StarSystemLocations.Add(new(sys, p.Value)); - if (status != null) - status.Progress += progressPerStarSystem; - } - - var progressPerWarp = (desiredProgress - (status == null ? 0 : status.Progress)) / (gal.StarSystemLocations.Count * 2); - - // create warp points - if (status != null) - status.Message = "Creating warp points"; - var graph = new ConnectivityGraph>(); - foreach (var ssl in gal.StarSystemLocations) - graph.Add(ssl); - int wpsGenerated = 0; - while (wpsGenerated < gal.StarSystemLocations.Count * 2) - { - // pick 2 systems - ObjectLocation startLocation = null, endLocation = null; - (startLocation, endLocation) = MinDistanceDisconnectedSystemPair(graph); - - // create the warp points - if (startLocation != null && endLocation != null) - { - GameSetup.WarpPointPlacementStrategy.PlaceWarpPoints(startLocation, endLocation); - - // mark systems connected - graph.Connect(startLocation, endLocation, true); - - wpsGenerated++; - } - else - break; - if (status != null) - status.Progress += progressPerWarp; - } - - // TODO - delete excess warp points if system groups count is >1 - - if (status != null) - status.Progress = desiredProgress; - - return gal; - } - - private (ObjectLocation, ObjectLocation) MinDistanceDisconnectedSystemPair(ConnectivityGraph> graph) - { - if (graph.Subgraphs.Count() == 0) - return (null, null); - - (ObjectLocation, ObjectLocation) best = (null, null); - int bestDistance = int.MaxValue; - - if (graph.Subgraphs.Count() == 1) - { - foreach (var l1 in graph) - { - foreach (var l2 in graph) - { - if (graph.AreDirectlyConnected(l1, l2)) - continue; - if (IntersectsExceptAtEnds(l1.Location, l2.Location, graph)) - continue; - var dist = l1.Location.ManhattanDistance(l2.Location); - if (dist < bestDistance && AreWarpPointAnglesOk(l1, l2, Galaxy.Current, MinWarpPointAngle)) - { - bestDistance = dist; - best = (l1, l2); - } - } - } - return best; - } - - foreach (var g1 in graph.Subgraphs) - { - foreach (var g2 in graph.Subgraphs.ExceptSingle(g1)) - { - foreach (var l1 in g1) - { - foreach (var l2 in g2) - { - if (graph.AreDirectlyConnected(l1, l2)) - continue; - var dist = l1.Location.ManhattanDistance(l2.Location); - if (dist < bestDistance && AreWarpPointAnglesOk(l1, l2, Galaxy.Current, MinWarpPointAngle)) - { - bestDistance = dist; - best = (l1, l2); - } - } - } - } - } - return best; - } - - /// - /// Determines if a number is between two bounds (inclusive). - /// - /// - /// - /// - /// - private static bool IsBetween(double num, double bound1, double bound2) - { - return num >= bound1 && num <= bound2 || num >= bound2 && num <= bound1; - } - - private static bool IntersectsExceptAtEnds(Point p1, Point p2, ConnectivityGraph> graph) - { - foreach (var kvp in graph.Connections) - { - var q1 = kvp.Key.Location; - foreach (var q2 in kvp.Value.Select(l => l.Location)) - { - if (IntersectsExceptAtEnds(p1, p2, q1, q2)) - return true; - // else no intersection - } - } - return false; - } - - /// - /// Public for unit tests. - /// - /// - /// - /// - /// - /// - public static bool IntersectsExceptAtEnds(Point p1, Point p2, Point q1, Point q2) - { - if (p1 == q1 && p2 == q2) - return true; - if (p1 == q2 && p2 == q1) - return true; - if (p1 == q1 || p1 == q2 || p2 == q1 || p2 == q2) - return false; // intersects only on endpoints - var slope1 = (double)(p2.Y - p1.Y) / (double)(p2.X - p1.X); - var slope2 = (double)(q2.Y - q1.Y) / (double)(q2.X - q1.X); - if (slope1 != slope2) - { - // intersect in infinite space! but do the line segments actually intersect? - double intercept1, intercept2, intersectX, intersectY; - if ((slope1 == double.PositiveInfinity || slope1 == double.NegativeInfinity) && (slope2 == double.PositiveInfinity || slope2 == double.NegativeInfinity)) - { - if (IsBetween(q1.Y, p1.Y, p2.Y) || IsBetween(q2.Y, p1.Y, p2.Y)) - return true; - } - else if (slope1 == double.PositiveInfinity || slope1 == double.NegativeInfinity) - { - // x is a constant for a vertical line - intersectX = p1.X; - - // y = m*x+b - intercept2 = q1.Y - slope2 * q1.X; - intersectY = slope2 * intersectX + intercept2; - - if (IsBetween(intersectY, p1.Y, p2.Y)) - return true; - } - else if (slope2 == double.PositiveInfinity || slope2 == double.NegativeInfinity) - { - // x is a constant for a vertical line - intersectX = q1.X; - - // y = m*x+b - intercept1 = p1.Y - slope1 * p1.X; - intersectY = slope1 * intersectX + intercept1; - - if (IsBetween(intersectY, p1.Y, p2.Y)) - return true; - } - else - { - // y = m*x+b - // b = y - m*x - intercept1 = p1.Y - slope1 * p1.X; - intercept2 = q1.Y - slope2 * q1.X; - // m1*x+b1 = m2*x+b2 - // m1*x-m2*x = b2-b1 - // x*(m1-m2) = b2-b1 - // x = (b2-b1)/(m1-m2) - intersectX = (intercept2 - intercept1) / (slope1 - slope2); - intersectY = slope1 * intersectX + intercept1; - - if (IsBetween(intersectX, p1.X, p2.X) && IsBetween(intersectX, q1.X, q2.X)) - return true; - } - } - else - { - if (IsBetween(p1.X, q1.X, q2.X) || IsBetween(p2.X, q1.X, q2.X) - || IsBetween(q1.X, p1.X, p2.X) || IsBetween(q2.X, p1.X, p2.X) - || IsBetween(p1.Y, q1.Y, q2.Y) || IsBetween(p2.Y, q1.Y, q2.Y) - || IsBetween(q1.Y, p1.Y, p2.Y) || IsBetween(q2.Y, p1.Y, p2.Y)) - return true; - } - return false; - } - - private bool AreWarpPointAnglesOk(ObjectLocation start, ObjectLocation end, Galaxy gal, int minAngle) - { - var angleOut = NormalizeAngle(start.Location.AngleTo(end.Location)); - var angleBack = NormalizeAngle(angleOut + 180d); - - // test warp points going out - foreach (var angle in GetWarpPointAngles(start, gal)) - { - if (AngleIsInRangeExclusive(angleOut, angle, minAngle)) - return false; - } - - // test warp points coming back - foreach (var angle in GetWarpPointAngles(end, gal)) - { - if (AngleIsInRangeExclusive(angleBack, angle, minAngle)) - return false; - } - - return true; - } - - private IEnumerable GetWarpPointAngles(ObjectLocation ssl, Galaxy gal) - { - foreach (var wp in ssl.Item.FindSpaceObjects()) - { - var target = wp.TargetStarSystemLocation; - var offset = ssl.Location.AngleTo(target.Location); - yield return offset; - } - } - - private int GetWarpPointCount(StarSystem sys) - { - return sys.FindSpaceObjects().Count(); - } - - /// - /// Public for unit tests. - /// - /// - /// - /// - /// - public static bool AngleIsInRangeExclusive(double d, double middle, double range) - { - return Math.Abs(NormalizeAngle(d - middle)) < range; - } - - internal static void NameStellarObjects(StarSystem sys) - { - int index; - - index = 1; - var stars = sys.FindSpaceObjects().ToArray(); - foreach (var star in stars) - { - if (stars.Count() == 1) - star.Name = sys.Name; // just name star after system - else - { - try - { - star.Name = sys.Name + " " + index.ToLetter(); - } - catch (ArgumentException) - { - // seriously, 27 stars? fine, just name it after system again! - star.Name = sys.Name; - } - } - index++; - } - - index = 1; - var planets = sys.FindSpaceObjects().ToArray(); - foreach (var planet in planets.Where(p => p.MoonOf == null)) - { - planet.Name = sys.Name + " " + index.ToRomanNumeral(); - index++; - } - var moonIndices = new Dictionary(); - foreach (var moon in planets.Where(p => p.MoonOf != null)) - { - if (moonIndices.ContainsKey(moon.MoonOf)) - moonIndices[moon.MoonOf]++; - else - moonIndices.Add(moon.MoonOf, 1); - try - { - moon.Name = moon.MoonOf.Name + " " + moonIndices[moon.MoonOf].ToLetter(); - } - catch (ArgumentException) - { - // seriously, 27 moons? just call it a moon - moon.Name = moon.MoonOf.Name + " Moon"; - } - } - - index = 1; - var asteroids = sys.FindSpaceObjects().ToArray(); - foreach (var asteroid in asteroids) - { - asteroid.Name = sys.Name + " Asteroid Field " + index.ToRomanNumeral(); - index++; - } - - index = 1; - var storms = sys.FindSpaceObjects().ToArray(); - foreach (var storm in storms) - { - if (storms.Count() == 1) - storm.Name = sys.Name + " Storm"; - else - { - try - { - storm.Name = sys.Name + " Storm " + index.ToLetter(); - } - catch (ArgumentException) - { - // seriously, 27 storms? fine, just call it a storm! - storm.Name = sys.Name + " Storm"; - } - } - index++; - } - } - - private static double NormalizeAngle(double angle) - { - angle %= 360d; - if (angle < -180d) - angle += 360d; - else if (angle > 180d) - angle -= 360d; - return angle; - } +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using FrEee.Objects.Space; +using FrEee.Utility; +using FrEee.Extensions; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Setup; +using FrEee.Processes.Setup.StarSystemPlacementStrategies; + +namespace FrEee.Modding.Templates; + +/// +/// A template for creating galaxies +/// Maps to a record in QuadrantTypes.txt. +/// +[Serializable] +public class GalaxyTemplate : ITemplate, IModObject +{ + public GalaxyTemplate() + { + StarSystemTemplateChances = new Dictionary(); + } + + /// + /// A description of this galaxy template. + /// + public string Description { get; set; } + + /// + /// Setup parameters for the game. + /// + public GameSetup GameSetup { get; set; } + + public bool IsDisposed + { + get; private set; + } + + /// + /// Preferred maximum warp points per system. May be overridden for connectivity purposes. + /// + public int MaxWarpPointsPerSystem { get; set; } + + /// + /// Minimum number of empty squares between star systems. + /// (Zero, not one, means systems can be adjacent.) + /// + public int MinimumStarSystemDistance { get; set; } + + /// + /// Preferred minimum angle between warp points in a system. May be overridden for connectivity purposes. + /// + public int MinWarpPointAngle { get; set; } + + public string ModID + { + get; + set; + } + + /// + /// The name of this galaxy template. + /// + public string Name { get; set; } + + /// + /// Algorithm for placing stars on the galaxy map. + /// + public IStarSystemPlacementStrategy StarSystemPlacementStrategy { get; set; } + + /// + /// Chances for each type of star system to appear. + /// + public IDictionary StarSystemTemplateChances { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public void Dispose() + { + // TODO - remove it from somewhere? + IsDisposed = true; + } + + public Galaxy Instantiate() + { + return Instantiate(null, 1.0, new PRNG(RandomSeed)); + } + + public int RandomSeed { get; set; } = DateTime.Now.Millisecond + 1000 * DateTime.Now.Second + 60000 * DateTime.Now.Minute; + + /// A status object to report status back to the GUI. + /// How much progress should we report back to the GUI when we're done initializing the galaxy? 1.0 means all done with everything that needs to be done. + public Galaxy Instantiate(Status status, double desiredProgress, PRNG dice) + { + var gal = new Galaxy(); + gal.Width = GameSetup.GalaxySize.Width; + gal.Height = GameSetup.GalaxySize.Height; + gal.MinPlanetValue = GameSetup.MinPlanetValue; + gal.MinSpawnedPlanetValue = GameSetup.MinSpawnedPlanetValue; + gal.MaxSpawnedPlanetValue = GameSetup.MaxSpawnedPlanetValue; + gal.MaxPlanetValue = GameSetup.MaxPlanetValue; + gal.MinAsteroidValue = GameSetup.MinAsteroidValue; + gal.MinSpawnedAsteroidValue = GameSetup.MinSpawnedAsteroidValue; + gal.MaxSpawnedAsteroidValue = GameSetup.MaxSpawnedAsteroidValue; + gal.EventFrequency = GameSetup.EventFrequency; + gal.MaximumEventSeverity = GameSetup.MaximumEventSeverity; + var bounds = new Rectangle(-GameSetup.GalaxySize.Width / 2, -GameSetup.GalaxySize.Height / 2, GameSetup.GalaxySize.Width, GameSetup.GalaxySize.Height); + + var unusedNames = new List(Mod.Current.StarSystemNames); + + // create star systems + if (status != null) + status.Message = "Creating star systems"; + var progressPerStarSystem = (desiredProgress - (status == null ? 0 : status.Progress)) / GameSetup.StarSystemCount / 2d; + for (int i = 0; i < GameSetup.StarSystemCount; i++) + { + if (status != null) + status.Message = "Creating star system " + (i + 1) + " of " + GameSetup.StarSystemCount; + var p = StarSystemPlacementStrategy.PlaceStarSystem(gal, MinimumStarSystemDistance, bounds, GameSetup.StarSystemCount - i, dice); + if (p == null) + break; // no more locations available + + var sst = StarSystemTemplateChances.PickWeighted(dice); + sst.Dice = dice; + var sys = sst.Instantiate(); + sys.Name = unusedNames.PickRandom(dice); + unusedNames.Remove(sys.Name); + NameStellarObjects(sys); + gal.StarSystemLocations.Add(new(sys, p.Value)); + if (status != null) + status.Progress += progressPerStarSystem; + } + + var progressPerWarp = (desiredProgress - (status == null ? 0 : status.Progress)) / (gal.StarSystemLocations.Count * 2); + + // create warp points + if (status != null) + status.Message = "Creating warp points"; + var graph = new ConnectivityGraph>(); + foreach (var ssl in gal.StarSystemLocations) + graph.Add(ssl); + int wpsGenerated = 0; + while (wpsGenerated < gal.StarSystemLocations.Count * 2) + { + // pick 2 systems + ObjectLocation startLocation = null, endLocation = null; + (startLocation, endLocation) = MinDistanceDisconnectedSystemPair(graph); + + // create the warp points + if (startLocation != null && endLocation != null) + { + GameSetup.WarpPointPlacementStrategy.PlaceWarpPoints(startLocation, endLocation); + + // mark systems connected + graph.Connect(startLocation, endLocation, true); + + wpsGenerated++; + } + else + break; + if (status != null) + status.Progress += progressPerWarp; + } + + // TODO - delete excess warp points if system groups count is >1 + + if (status != null) + status.Progress = desiredProgress; + + return gal; + } + + private (ObjectLocation, ObjectLocation) MinDistanceDisconnectedSystemPair(ConnectivityGraph> graph) + { + if (graph.Subgraphs.Count() == 0) + return (null, null); + + (ObjectLocation, ObjectLocation) best = (null, null); + int bestDistance = int.MaxValue; + + if (graph.Subgraphs.Count() == 1) + { + foreach (var l1 in graph) + { + foreach (var l2 in graph) + { + if (graph.AreDirectlyConnected(l1, l2)) + continue; + if (IntersectsExceptAtEnds(l1.Location, l2.Location, graph)) + continue; + var dist = l1.Location.ManhattanDistance(l2.Location); + if (dist < bestDistance && AreWarpPointAnglesOk(l1, l2, Galaxy.Current, MinWarpPointAngle)) + { + bestDistance = dist; + best = (l1, l2); + } + } + } + return best; + } + + foreach (var g1 in graph.Subgraphs) + { + foreach (var g2 in graph.Subgraphs.ExceptSingle(g1)) + { + foreach (var l1 in g1) + { + foreach (var l2 in g2) + { + if (graph.AreDirectlyConnected(l1, l2)) + continue; + var dist = l1.Location.ManhattanDistance(l2.Location); + if (dist < bestDistance && AreWarpPointAnglesOk(l1, l2, Galaxy.Current, MinWarpPointAngle)) + { + bestDistance = dist; + best = (l1, l2); + } + } + } + } + } + return best; + } + + /// + /// Determines if a number is between two bounds (inclusive). + /// + /// + /// + /// + /// + private static bool IsBetween(double num, double bound1, double bound2) + { + return num >= bound1 && num <= bound2 || num >= bound2 && num <= bound1; + } + + private static bool IntersectsExceptAtEnds(Point p1, Point p2, ConnectivityGraph> graph) + { + foreach (var kvp in graph.Connections) + { + var q1 = kvp.Key.Location; + foreach (var q2 in kvp.Value.Select(l => l.Location)) + { + if (IntersectsExceptAtEnds(p1, p2, q1, q2)) + return true; + // else no intersection + } + } + return false; + } + + /// + /// Public for unit tests. + /// + /// + /// + /// + /// + /// + public static bool IntersectsExceptAtEnds(Point p1, Point p2, Point q1, Point q2) + { + if (p1 == q1 && p2 == q2) + return true; + if (p1 == q2 && p2 == q1) + return true; + if (p1 == q1 || p1 == q2 || p2 == q1 || p2 == q2) + return false; // intersects only on endpoints + var slope1 = (double)(p2.Y - p1.Y) / (double)(p2.X - p1.X); + var slope2 = (double)(q2.Y - q1.Y) / (double)(q2.X - q1.X); + if (slope1 != slope2) + { + // intersect in infinite space! but do the line segments actually intersect? + double intercept1, intercept2, intersectX, intersectY; + if ((slope1 == double.PositiveInfinity || slope1 == double.NegativeInfinity) && (slope2 == double.PositiveInfinity || slope2 == double.NegativeInfinity)) + { + if (IsBetween(q1.Y, p1.Y, p2.Y) || IsBetween(q2.Y, p1.Y, p2.Y)) + return true; + } + else if (slope1 == double.PositiveInfinity || slope1 == double.NegativeInfinity) + { + // x is a constant for a vertical line + intersectX = p1.X; + + // y = m*x+b + intercept2 = q1.Y - slope2 * q1.X; + intersectY = slope2 * intersectX + intercept2; + + if (IsBetween(intersectY, p1.Y, p2.Y)) + return true; + } + else if (slope2 == double.PositiveInfinity || slope2 == double.NegativeInfinity) + { + // x is a constant for a vertical line + intersectX = q1.X; + + // y = m*x+b + intercept1 = p1.Y - slope1 * p1.X; + intersectY = slope1 * intersectX + intercept1; + + if (IsBetween(intersectY, p1.Y, p2.Y)) + return true; + } + else + { + // y = m*x+b + // b = y - m*x + intercept1 = p1.Y - slope1 * p1.X; + intercept2 = q1.Y - slope2 * q1.X; + // m1*x+b1 = m2*x+b2 + // m1*x-m2*x = b2-b1 + // x*(m1-m2) = b2-b1 + // x = (b2-b1)/(m1-m2) + intersectX = (intercept2 - intercept1) / (slope1 - slope2); + intersectY = slope1 * intersectX + intercept1; + + if (IsBetween(intersectX, p1.X, p2.X) && IsBetween(intersectX, q1.X, q2.X)) + return true; + } + } + else + { + if (IsBetween(p1.X, q1.X, q2.X) || IsBetween(p2.X, q1.X, q2.X) + || IsBetween(q1.X, p1.X, p2.X) || IsBetween(q2.X, p1.X, p2.X) + || IsBetween(p1.Y, q1.Y, q2.Y) || IsBetween(p2.Y, q1.Y, q2.Y) + || IsBetween(q1.Y, p1.Y, p2.Y) || IsBetween(q2.Y, p1.Y, p2.Y)) + return true; + } + return false; + } + + private bool AreWarpPointAnglesOk(ObjectLocation start, ObjectLocation end, Galaxy gal, int minAngle) + { + var angleOut = NormalizeAngle(start.Location.AngleTo(end.Location)); + var angleBack = NormalizeAngle(angleOut + 180d); + + // test warp points going out + foreach (var angle in GetWarpPointAngles(start, gal)) + { + if (AngleIsInRangeExclusive(angleOut, angle, minAngle)) + return false; + } + + // test warp points coming back + foreach (var angle in GetWarpPointAngles(end, gal)) + { + if (AngleIsInRangeExclusive(angleBack, angle, minAngle)) + return false; + } + + return true; + } + + private IEnumerable GetWarpPointAngles(ObjectLocation ssl, Galaxy gal) + { + foreach (var wp in ssl.Item.FindSpaceObjects()) + { + var target = wp.TargetStarSystemLocation; + var offset = ssl.Location.AngleTo(target.Location); + yield return offset; + } + } + + private int GetWarpPointCount(StarSystem sys) + { + return sys.FindSpaceObjects().Count(); + } + + /// + /// Public for unit tests. + /// + /// + /// + /// + /// + public static bool AngleIsInRangeExclusive(double d, double middle, double range) + { + return Math.Abs(NormalizeAngle(d - middle)) < range; + } + + internal static void NameStellarObjects(StarSystem sys) + { + int index; + + index = 1; + var stars = sys.FindSpaceObjects().ToArray(); + foreach (var star in stars) + { + if (stars.Count() == 1) + star.Name = sys.Name; // just name star after system + else + { + try + { + star.Name = sys.Name + " " + index.ToLetter(); + } + catch (ArgumentException) + { + // seriously, 27 stars? fine, just name it after system again! + star.Name = sys.Name; + } + } + index++; + } + + index = 1; + var planets = sys.FindSpaceObjects().ToArray(); + foreach (var planet in planets.Where(p => p.MoonOf == null)) + { + planet.Name = sys.Name + " " + index.ToRomanNumeral(); + index++; + } + var moonIndices = new Dictionary(); + foreach (var moon in planets.Where(p => p.MoonOf != null)) + { + if (moonIndices.ContainsKey(moon.MoonOf)) + moonIndices[moon.MoonOf]++; + else + moonIndices.Add(moon.MoonOf, 1); + try + { + moon.Name = moon.MoonOf.Name + " " + moonIndices[moon.MoonOf].ToLetter(); + } + catch (ArgumentException) + { + // seriously, 27 moons? just call it a moon + moon.Name = moon.MoonOf.Name + " Moon"; + } + } + + index = 1; + var asteroids = sys.FindSpaceObjects().ToArray(); + foreach (var asteroid in asteroids) + { + asteroid.Name = sys.Name + " Asteroid Field " + index.ToRomanNumeral(); + index++; + } + + index = 1; + var storms = sys.FindSpaceObjects().ToArray(); + foreach (var storm in storms) + { + if (storms.Count() == 1) + storm.Name = sys.Name + " Storm"; + else + { + try + { + storm.Name = sys.Name + " Storm " + index.ToLetter(); + } + catch (ArgumentException) + { + // seriously, 27 storms? fine, just call it a storm! + storm.Name = sys.Name + " Storm"; + } + } + index++; + } + } + + private static double NormalizeAngle(double angle) + { + angle %= 360d; + if (angle < -180d) + angle += 360d; + else if (angle > 180d) + angle -= 360d; + return angle; + } } \ No newline at end of file diff --git a/FrEee/Modding/Templates/PlanetTemplate.cs b/FrEee.Core/Modding/Templates/PlanetTemplate.cs similarity index 96% rename from FrEee/Modding/Templates/PlanetTemplate.cs rename to FrEee.Core/Modding/Templates/PlanetTemplate.cs index 54d2a5df1..f1381daaa 100644 --- a/FrEee/Modding/Templates/PlanetTemplate.cs +++ b/FrEee.Core/Modding/Templates/PlanetTemplate.cs @@ -1,100 +1,102 @@ -using FrEee.Objects.Space; -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.Templates; - -/// -/// A template for generating planets. -/// -[Serializable] -public class PlanetTemplate : ITemplate, IModObject -{ - /// - /// Abilities to assign to the planet. - /// - public RandomAbilityTemplate Abilities { get; set; } - - /// - /// The atmosphere of the planet, or null to choose a planet randomly. - /// - public string Atmosphere { get; set; } - - /// - /// Do we want a constructed world (such as a ringworld or sphereworld)? - /// - public bool IsConstructed { get; set; } - - public bool IsDisposed - { - get; private set; - } - - public string ModID - { - get; - set; - } - - public string Name { get; set; } - - /// - /// The size of the planet, or null to choose a size randomly. - /// - public StellarSize? StellarSize { get; set; } - - /// - /// The surface compositiion of the planet, or null to choose a surface randomly. - /// - public string Surface { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public void Dispose() - { - // TODO - remove it from somewhere? - IsDisposed = true; - } - - public Planet Instantiate() - { - var candidates = Mod.Current.StellarObjectTemplates.OfType(); - if (Atmosphere != null) - candidates = candidates.Where(p => p.Atmosphere == Atmosphere); - if (Surface != null) - candidates = candidates.Where(p => p.Surface == Surface); - if (StellarSize != null) - candidates = candidates.Where(p => p.StellarSize == StellarSize); - candidates = candidates.Where(p => p.Size.IsConstructed == IsConstructed); - - if (!candidates.Any()) - throw new Exception("No planets in SectType.txt match the criteria:\n\tAtmosphere: " + (Atmosphere ?? "Any") + "\n\tSurface: " + (Surface ?? "Any") + "\n\tStellar Size: " + (StellarSize == null ? "Any" : StellarSize.ToString())); - - var planet = candidates.PickRandom().Instantiate(); - - if (planet.Size == null) - { - var sizes = Mod.Current.StellarObjectSizes.Where(sos => sos.StellarObjectType == "Planet" && !sos.IsConstructed && (StellarSize == null || sos.StellarSize == StellarSize.Value)); - planet.Size = sizes.PickRandom(); - } - - var abil = Abilities.Instantiate(); - if (abil != null) - planet.IntrinsicAbilities.Add(abil); - - planet.ResourceValue[Resource.Minerals] = RandomHelper.Range(Galaxy.Current.MinSpawnedPlanetValue, Galaxy.Current.MaxSpawnedPlanetValue); - planet.ResourceValue[Resource.Organics] = RandomHelper.Range(Galaxy.Current.MinSpawnedPlanetValue, Galaxy.Current.MaxSpawnedPlanetValue); - planet.ResourceValue[Resource.Radioactives] = RandomHelper.Range(Galaxy.Current.MinSpawnedPlanetValue, Galaxy.Current.MaxSpawnedPlanetValue); - - planet.ConditionsAmount = RandomHelper.Range(Mod.Current.Settings.MinRandomPlanetConditions, Mod.Current.Settings.MaxRandomPlanetConditions); - - return planet; - } +using FrEee.Objects.Space; +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Modding.Templates; + +/// +/// A template for generating planets. +/// +[Serializable] +public class PlanetTemplate : ITemplate, IModObject +{ + /// + /// Abilities to assign to the planet. + /// + public RandomAbilityTemplate Abilities { get; set; } + + /// + /// The atmosphere of the planet, or null to choose a planet randomly. + /// + public string Atmosphere { get; set; } + + /// + /// Do we want a constructed world (such as a ringworld or sphereworld)? + /// + public bool IsConstructed { get; set; } + + public bool IsDisposed + { + get; private set; + } + + public string ModID + { + get; + set; + } + + public string Name { get; set; } + + /// + /// The size of the planet, or null to choose a size randomly. + /// + public StellarSize? StellarSize { get; set; } + + /// + /// The surface compositiion of the planet, or null to choose a surface randomly. + /// + public string Surface { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public void Dispose() + { + // TODO - remove it from somewhere? + IsDisposed = true; + } + + public Planet Instantiate() + { + var candidates = Mod.Current.StellarObjectTemplates.OfType(); + if (Atmosphere != null) + candidates = candidates.Where(p => p.Atmosphere == Atmosphere); + if (Surface != null) + candidates = candidates.Where(p => p.Surface == Surface); + if (StellarSize != null) + candidates = candidates.Where(p => p.StellarSize == StellarSize); + candidates = candidates.Where(p => p.Size.IsConstructed == IsConstructed); + + if (!candidates.Any()) + throw new Exception("No planets in SectType.txt match the criteria:\n\tAtmosphere: " + (Atmosphere ?? "Any") + "\n\tSurface: " + (Surface ?? "Any") + "\n\tStellar Size: " + (StellarSize == null ? "Any" : StellarSize.ToString())); + + var planet = candidates.PickRandom().Instantiate(); + + if (planet.Size == null) + { + var sizes = Mod.Current.StellarObjectSizes.Where(sos => sos.StellarObjectType == "Planet" && !sos.IsConstructed && (StellarSize == null || sos.StellarSize == StellarSize.Value)); + planet.Size = sizes.PickRandom(); + } + + var abil = Abilities.Instantiate(); + if (abil != null) + planet.IntrinsicAbilities.Add(abil); + + planet.ResourceValue[Resource.Minerals] = RandomHelper.Range(Galaxy.Current.MinSpawnedPlanetValue, Galaxy.Current.MaxSpawnedPlanetValue); + planet.ResourceValue[Resource.Organics] = RandomHelper.Range(Galaxy.Current.MinSpawnedPlanetValue, Galaxy.Current.MaxSpawnedPlanetValue); + planet.ResourceValue[Resource.Radioactives] = RandomHelper.Range(Galaxy.Current.MinSpawnedPlanetValue, Galaxy.Current.MaxSpawnedPlanetValue); + + planet.ConditionsAmount = RandomHelper.Range(Mod.Current.Settings.MinRandomPlanetConditions, Mod.Current.Settings.MaxRandomPlanetConditions); + + return planet; + } } \ No newline at end of file diff --git a/FrEee/Modding/Templates/RandomAbilityTemplate.cs b/FrEee.Core/Modding/Templates/RandomAbilityTemplate.cs similarity index 93% rename from FrEee/Modding/Templates/RandomAbilityTemplate.cs rename to FrEee.Core/Modding/Templates/RandomAbilityTemplate.cs index ab1e641b3..83b0ed4b0 100644 --- a/FrEee/Modding/Templates/RandomAbilityTemplate.cs +++ b/FrEee.Core/Modding/Templates/RandomAbilityTemplate.cs @@ -1,81 +1,82 @@ -using FrEee.Objects.Abilities; -using FrEee.Utility; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.Templates; - -[Serializable] -public struct AbilityChance -{ - /// - /// The ability. - /// - public Ability Ability { get; set; } - - /// - /// The chance, in tenths of a percent. - /// - public int Chance { get; set; } -} - -/// -/// Chooses a random ability, or none at all, based on a roll of a d1000. -/// -[Serializable] -public class RandomAbilityTemplate : ITemplate, IModObject -{ - public RandomAbilityTemplate() - { - AbilityChances = new List(); - } - - /// - /// Chances to get each ability. - /// Chances are expressed in tenths of a percent. - /// The total for all chances should add up to 1000 or less. - /// - public IList AbilityChances { get; private set; } - - public bool IsDisposed - { - get; private set; - } - - public string ModID - { - get; - set; - } - - /// - /// The name of this random ability template. - /// - public string Name { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public void Dispose() - { - // TODO - remove it from somewhere? - IsDisposed = true; - } - - public Ability Instantiate() - { - var num = RandomHelper.Next(Math.Max(1000, AbilityChances.Sum(ac => ac.Chance))); - var howFar = 0; - foreach (var ac in AbilityChances) - { - howFar += ac.Chance; - if (num < howFar) - return ac.Ability; - } - return null; - } +using FrEee.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Utility; +using FrEee.Modding.Abilities; + +namespace FrEee.Modding.Templates; + +[Serializable] +public struct AbilityChance +{ + /// + /// The ability. + /// + public Ability Ability { get; set; } + + /// + /// The chance, in tenths of a percent. + /// + public int Chance { get; set; } +} + +/// +/// Chooses a random ability, or none at all, based on a roll of a d1000. +/// +[Serializable] +public class RandomAbilityTemplate : ITemplate, IModObject +{ + public RandomAbilityTemplate() + { + AbilityChances = new List(); + } + + /// + /// Chances to get each ability. + /// Chances are expressed in tenths of a percent. + /// The total for all chances should add up to 1000 or less. + /// + public IList AbilityChances { get; private set; } + + public bool IsDisposed + { + get; private set; + } + + public string ModID + { + get; + set; + } + + /// + /// The name of this random ability template. + /// + public string Name { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public void Dispose() + { + // TODO - remove it from somewhere? + IsDisposed = true; + } + + public Ability Instantiate() + { + var num = RandomHelper.Next(Math.Max(1000, AbilityChances.Sum(ac => ac.Chance))); + var howFar = 0; + foreach (var ac in AbilityChances) + { + howFar += ac.Chance; + if (num < howFar) + return ac.Ability; + } + return null; + } } \ No newline at end of file diff --git a/FrEee/Modding/Templates/StarSystemTemplate.cs b/FrEee.Core/Modding/Templates/StarSystemTemplate.cs similarity index 95% rename from FrEee/Modding/Templates/StarSystemTemplate.cs rename to FrEee.Core/Modding/Templates/StarSystemTemplate.cs index 5ebde1c9a..3dab03991 100644 --- a/FrEee/Modding/Templates/StarSystemTemplate.cs +++ b/FrEee.Core/Modding/Templates/StarSystemTemplate.cs @@ -1,177 +1,178 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Space; -using FrEee.Modding.StellarObjectLocations; -using FrEee.Utility; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.Templates; - -/// -/// A template for creating star systems. -/// Maps to a record in SystemTypes.txt. -/// -[Serializable] -public class StarSystemTemplate : ITemplate, IModObject, IAbilityContainer -{ - /// - /// Creates an empty star system template. - /// - public StarSystemTemplate(PRNG dice) - { - Dice = dice ?? new PRNG(DateTime.Now.Millisecond + DateTime.Now.Second * 1000 + DateTime.Now.Minute * 60000); - Abilities = new List(); - StellarObjectLocations = new List(); - } - - /// - /// Any special abilities to be possessed by star systems generated from this template. - /// - public IList Abilities { get; private set; } - - public AbilityTargets AbilityTarget - { - get { return AbilityTargets.StarSystem; } - } - - /// - /// The path to the background image for star systems generated from this template. - /// - public string BackgroundImagePath { get; set; } - - public IEnumerable Children - { - // TODO - include stellar object templates here - get { yield break; } - } - - /// - /// A description to use for star systems generated from this template. - /// - public string Description { get; set; } - - /// - /// A random number generator to roll up some numbers. - /// - public PRNG Dice { get; set; } - - /// - /// If true, empire homeworlds can be located in systems generated from this template. - /// - public bool EmpiresCanStartIn { get; set; } - - public IEnumerable IntrinsicAbilities - { - get { return Abilities; } - } - - public bool IsDisposed - { - get; private set; - } - - public string ModID - { - get; - set; - } - - /// - /// The name of this star system template. - /// - public string Name { get; set; } - - /// - /// If true, the background image for star systems generated from this template will be centered, not tiled, in combat. - /// - public bool NonTiledCenterCombatImage { get; set; } - - public IEnumerable Parents - { - get - { - // TODO - include galaxy template here? - yield break; - } - } - - /// - /// The radius of star systems generated from this template. - /// - public int Radius { get; set; } - - /// - /// Stellar objects (such as stars and planets) and their locations in systems generated from this template. - /// - public IList StellarObjectLocations { get; private set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - /// - /// Abilities for random warp points in systems generated from this template. - /// - public RandomAbilityTemplate WarpPointAbilities { get; set; } - - public void Dispose() - { - // TODO - remove it from somewhere? - IsDisposed = true; - } - - public StarSystem Instantiate() - { - var sys = new StarSystem(Radius); - sys.Name = "Unnamed"; // star system will be named later in galaxy generation - sys.Description = Description; - sys.BackgroundImagePath = BackgroundImagePath; - sys.EmpiresCanStartIn = EmpiresCanStartIn; - sys.NonTiledCenterCombatImage = NonTiledCenterCombatImage; - foreach (var abil in Abilities) - sys.Abilities.Add(abil); - sys.WarpPointAbilities = WarpPointAbilities; // warp points will be generated later in galaxy generation - - var planets = new Dictionary(); - - foreach (var loc in StellarObjectLocations) - { - Point pos; - try - { - pos = loc.Resolve(sys, Dice); - } - catch (Exception) - { - // Can't place this space object because there is no room for it - // So just skip it - continue; - } - - // create object - var sobj = loc.StellarObjectTemplate.Instantiate(); - - // place object - sys.Place(sobj, pos); - - // for planets with moons - if (sobj is Planet) - planets.Add(loc, (Planet)sobj); - - // set flags for naming - sobj.Index = sys.FindSpaceObjects(s => s.GetType() == sobj.GetType()).Count() + 1; - sobj.IsUnique = StellarObjectLocations.Where(l => typeof(ITemplate<>).MakeGenericType(sobj.GetType()).IsAssignableFrom(l.StellarObjectTemplate.GetType())).Count() == 1; - if (sobj is Planet && loc is SameAsStellarObjectLocation) - { - var planet = (Planet)sobj; - var loc2 = (SameAsStellarObjectLocation)loc; - planet.MoonOf = planets[StellarObjectLocations[loc2.TargetIndex - 1]]; - } - } - return sys; - } +using FrEee.Objects.Space; +using FrEee.Modding.StellarObjectLocations; +using FrEee.Utility; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Utility; +using FrEee.Modding.Abilities; + +namespace FrEee.Modding.Templates; + +/// +/// A template for creating star systems. +/// Maps to a record in SystemTypes.txt. +/// +[Serializable] +public class StarSystemTemplate : ITemplate, IModObject, IAbilityContainer +{ + /// + /// Creates an empty star system template. + /// + public StarSystemTemplate(PRNG dice) + { + Dice = dice ?? new PRNG(DateTime.Now.Millisecond + DateTime.Now.Second * 1000 + DateTime.Now.Minute * 60000); + Abilities = new List(); + StellarObjectLocations = new List(); + } + + /// + /// Any special abilities to be possessed by star systems generated from this template. + /// + public IList Abilities { get; private set; } + + public AbilityTargets AbilityTarget + { + get { return AbilityTargets.StarSystem; } + } + + /// + /// The path to the background image for star systems generated from this template. + /// + public string BackgroundImagePath { get; set; } + + public IEnumerable Children + { + // TODO - include stellar object templates here + get { yield break; } + } + + /// + /// A description to use for star systems generated from this template. + /// + public string Description { get; set; } + + /// + /// A random number generator to roll up some numbers. + /// + public PRNG Dice { get; set; } + + /// + /// If true, empire homeworlds can be located in systems generated from this template. + /// + public bool EmpiresCanStartIn { get; set; } + + public IEnumerable IntrinsicAbilities + { + get { return Abilities; } + } + + public bool IsDisposed + { + get; private set; + } + + public string ModID + { + get; + set; + } + + /// + /// The name of this star system template. + /// + public string Name { get; set; } + + /// + /// If true, the background image for star systems generated from this template will be centered, not tiled, in combat. + /// + public bool NonTiledCenterCombatImage { get; set; } + + public IEnumerable Parents + { + get + { + // TODO - include galaxy template here? + yield break; + } + } + + /// + /// The radius of star systems generated from this template. + /// + public int Radius { get; set; } + + /// + /// Stellar objects (such as stars and planets) and their locations in systems generated from this template. + /// + public IList StellarObjectLocations { get; private set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + /// + /// Abilities for random warp points in systems generated from this template. + /// + public RandomAbilityTemplate WarpPointAbilities { get; set; } + + public void Dispose() + { + // TODO - remove it from somewhere? + IsDisposed = true; + } + + public StarSystem Instantiate() + { + var sys = new StarSystem(Radius); + sys.Name = "Unnamed"; // star system will be named later in galaxy generation + sys.Description = Description; + sys.BackgroundImagePath = BackgroundImagePath; + sys.EmpiresCanStartIn = EmpiresCanStartIn; + sys.NonTiledCenterCombatImage = NonTiledCenterCombatImage; + foreach (var abil in Abilities) + sys.Abilities.Add(abil); + sys.WarpPointAbilities = WarpPointAbilities; // warp points will be generated later in galaxy generation + + var planets = new Dictionary(); + + foreach (var loc in StellarObjectLocations) + { + Point pos; + try + { + pos = loc.Resolve(sys, Dice); + } + catch (Exception) + { + // Can't place this space object because there is no room for it + // So just skip it + continue; + } + + // create object + var sobj = loc.StellarObjectTemplate.Instantiate(); + + // place object + sys.Place(sobj, pos); + + // for planets with moons + if (sobj is Planet) + planets.Add(loc, (Planet)sobj); + + // set flags for naming + sobj.Index = sys.FindSpaceObjects(s => s.GetType() == sobj.GetType()).Count() + 1; + sobj.IsUnique = StellarObjectLocations.Where(l => typeof(ITemplate<>).MakeGenericType(sobj.GetType()).IsAssignableFrom(l.StellarObjectTemplate.GetType())).Count() == 1; + if (sobj is Planet && loc is SameAsStellarObjectLocation) + { + var planet = (Planet)sobj; + var loc2 = (SameAsStellarObjectLocation)loc; + planet.MoonOf = planets[StellarObjectLocations[loc2.TargetIndex - 1]]; + } + } + return sys; + } } \ No newline at end of file diff --git a/FrEee/Modding/Templates/StarTemplate.cs b/FrEee.Core/Modding/Templates/StarTemplate.cs similarity index 96% rename from FrEee/Modding/Templates/StarTemplate.cs rename to FrEee.Core/Modding/Templates/StarTemplate.cs index b7035423a..57bd6d542 100644 --- a/FrEee/Modding/Templates/StarTemplate.cs +++ b/FrEee.Core/Modding/Templates/StarTemplate.cs @@ -1,89 +1,90 @@ -using FrEee.Objects.Space; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.Templates; - -/// -/// A template for generating stars. -/// -[Serializable] -public class StarTemplate : ITemplate, IModObject -{ - /// - /// Abilities to assign to the star. - /// - public RandomAbilityTemplate Abilities { get; set; } - - /// - /// The age of the star, or null to choose an age randomly. - /// - public string Age { get; set; } - - /// - /// The brightness of the star, or null to choose a brightness randomly. - /// - public string Brightness { get; set; } - - /// - /// The color of the star, or null to choose a color randomly. - /// - public string Color { get; set; } - - /// - /// Do we want a destroyed star? - /// - public bool IsDestroyed { get; set; } - - public bool IsDisposed { get; set; } - - public string ModID - { - get; - set; - } - - public string Name { get; set; } - - /// - /// The size of the star, or null to choose a size randomly. - /// - public StellarSize? StellarSize { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public void Dispose() - { - // TODO - remove it from somewhere? - IsDisposed = true; - } - - public Star Instantiate() - { - var candidates = Mod.Current.StellarObjectTemplates.OfType(); - if (StellarSize != null) - candidates = candidates.Where(s => s.StellarSize == StellarSize.Value); - if (Age != null) - candidates = candidates.Where(s => s.Age == Age); - if (Color != null) - candidates = candidates.Where(s => s.Color == Color); - if (Brightness != null) - candidates = candidates.Where(s => s.Brightness == Brightness); - if (!candidates.Any()) - throw new Exception("No stars in SectType.txt match the criteria:\n\tStellar Size: " + (StellarSize == null ? "Any" : StellarSize.ToString()) + "\n\tAge: " + (Age ?? "Any") + "\n\tColor: " + (Color ?? "Any") + "\n\tBrightness: " + (Brightness ?? "Any")); - - var star = candidates.PickRandom().Instantiate(); - - var abil = Abilities.Instantiate(); - if (abil != null) - star.IntrinsicAbilities.Add(abil); - - return star; - } +using FrEee.Objects.Space; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; + +namespace FrEee.Modding.Templates; + +/// +/// A template for generating stars. +/// +[Serializable] +public class StarTemplate : ITemplate, IModObject +{ + /// + /// Abilities to assign to the star. + /// + public RandomAbilityTemplate Abilities { get; set; } + + /// + /// The age of the star, or null to choose an age randomly. + /// + public string Age { get; set; } + + /// + /// The brightness of the star, or null to choose a brightness randomly. + /// + public string Brightness { get; set; } + + /// + /// The color of the star, or null to choose a color randomly. + /// + public string Color { get; set; } + + /// + /// Do we want a destroyed star? + /// + public bool IsDestroyed { get; set; } + + public bool IsDisposed { get; set; } + + public string ModID + { + get; + set; + } + + public string Name { get; set; } + + /// + /// The size of the star, or null to choose a size randomly. + /// + public StellarSize? StellarSize { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public void Dispose() + { + // TODO - remove it from somewhere? + IsDisposed = true; + } + + public Star Instantiate() + { + var candidates = Mod.Current.StellarObjectTemplates.OfType(); + if (StellarSize != null) + candidates = candidates.Where(s => s.StellarSize == StellarSize.Value); + if (Age != null) + candidates = candidates.Where(s => s.Age == Age); + if (Color != null) + candidates = candidates.Where(s => s.Color == Color); + if (Brightness != null) + candidates = candidates.Where(s => s.Brightness == Brightness); + if (!candidates.Any()) + throw new Exception("No stars in SectType.txt match the criteria:\n\tStellar Size: " + (StellarSize == null ? "Any" : StellarSize.ToString()) + "\n\tAge: " + (Age ?? "Any") + "\n\tColor: " + (Color ?? "Any") + "\n\tBrightness: " + (Brightness ?? "Any")); + + var star = candidates.PickRandom().Instantiate(); + + var abil = Abilities.Instantiate(); + if (abil != null) + star.IntrinsicAbilities.Add(abil); + + return star; + } } \ No newline at end of file diff --git a/FrEee/Modding/Templates/StormTemplate.cs b/FrEee.Core/Modding/Templates/StormTemplate.cs similarity index 95% rename from FrEee/Modding/Templates/StormTemplate.cs rename to FrEee.Core/Modding/Templates/StormTemplate.cs index cc95342bd..6f7fc6921 100644 --- a/FrEee/Modding/Templates/StormTemplate.cs +++ b/FrEee.Core/Modding/Templates/StormTemplate.cs @@ -1,66 +1,67 @@ -using FrEee.Objects.Space; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Modding.Templates; - -/// -/// A template for generating storms. -/// -[Serializable] -public class StormTemplate : ITemplate, IModObject -{ - /// - /// Abilities to assign to the storm. - /// - public RandomAbilityTemplate Abilities { get; set; } - - public bool IsDisposed - { - get; private set; - } - - public string ModID - { - get; - set; - } - - public string Name { get; set; } - - /// - /// The size of the storm, or null to choose a size randomly. - /// - public StellarSize? Size { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - public void Dispose() - { - // TODO - remove it from somewhere? - IsDisposed = true; - } - - public Storm Instantiate() - { - var candidates = Mod.Current.StellarObjectTemplates.OfType(); - if (Size != null) - candidates = candidates.Where(p => p.StellarSize == Size.Value); - if (!candidates.Any()) - throw new Exception("No storms in SectType.txt of stellar size " + Size + "!"); - - var storm = candidates.PickRandom().Instantiate(); - - var abil = Abilities.Instantiate(); - if (abil != null) - storm.IntrinsicAbilities.Add(abil); - - return storm; - } +using FrEee.Objects.Space; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; + +namespace FrEee.Modding.Templates; + +/// +/// A template for generating storms. +/// +[Serializable] +public class StormTemplate : ITemplate, IModObject +{ + /// + /// Abilities to assign to the storm. + /// + public RandomAbilityTemplate Abilities { get; set; } + + public bool IsDisposed + { + get; private set; + } + + public string ModID + { + get; + set; + } + + public string Name { get; set; } + + /// + /// The size of the storm, or null to choose a size randomly. + /// + public StellarSize? Size { get; set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + public void Dispose() + { + // TODO - remove it from somewhere? + IsDisposed = true; + } + + public Storm Instantiate() + { + var candidates = Mod.Current.StellarObjectTemplates.OfType(); + if (Size != null) + candidates = candidates.Where(p => p.StellarSize == Size.Value); + if (!candidates.Any()) + throw new Exception("No storms in SectType.txt of stellar size " + Size + "!"); + + var storm = candidates.PickRandom().Instantiate(); + + var abil = Abilities.Instantiate(); + if (abil != null) + storm.IntrinsicAbilities.Add(abil); + + return storm; + } } \ No newline at end of file diff --git a/FrEee/Objects/Civilization/Aptitude.cs b/FrEee.Core/Objects/Civilization/Aptitude.cs similarity index 100% rename from FrEee/Objects/Civilization/Aptitude.cs rename to FrEee.Core/Objects/Civilization/Aptitude.cs diff --git a/FrEee/Objects/Civilization/CargoStorage/Cargo.cs b/FrEee.Core/Objects/Civilization/CargoStorage/Cargo.cs similarity index 98% rename from FrEee/Objects/Civilization/CargoStorage/Cargo.cs rename to FrEee.Core/Objects/Civilization/CargoStorage/Cargo.cs index fdfcf7fb7..6011b5eef 100644 --- a/FrEee/Objects/Civilization/CargoStorage/Cargo.cs +++ b/FrEee.Core/Objects/Civilization/CargoStorage/Cargo.cs @@ -1,5 +1,4 @@ -using FrEee.Objects.Combat; -using FrEee.Modding; +using FrEee.Modding; using FrEee.Utility; using FrEee.Serialization; using FrEee.Extensions; @@ -7,6 +6,10 @@ using System.Collections.Generic; using System.Linq; using FrEee.Objects.Vehicles; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Processes.Combat; namespace FrEee.Objects.Civilization.CargoStorage; diff --git a/FrEee/Objects/Civilization/CargoStorage/CargoDelta.cs b/FrEee.Core/Objects/Civilization/CargoStorage/CargoDelta.cs similarity index 99% rename from FrEee/Objects/Civilization/CargoStorage/CargoDelta.cs rename to FrEee.Core/Objects/Civilization/CargoStorage/CargoDelta.cs index 877784fc9..0a94a6891 100644 --- a/FrEee/Objects/Civilization/CargoStorage/CargoDelta.cs +++ b/FrEee.Core/Objects/Civilization/CargoStorage/CargoDelta.cs @@ -6,6 +6,8 @@ using System.Collections.Generic; using FrEee.Objects.Vehicles; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.Objects.Civilization.CargoStorage; diff --git a/FrEee/Objects/Civilization/CargoStorage/ICargoContainer.cs b/FrEee.Core/Objects/Civilization/CargoStorage/ICargoContainer.cs similarity index 100% rename from FrEee/Objects/Civilization/CargoStorage/ICargoContainer.cs rename to FrEee.Core/Objects/Civilization/CargoStorage/ICargoContainer.cs diff --git a/FrEee/Objects/Civilization/CargoStorage/ICargoTransferrer.cs b/FrEee.Core/Objects/Civilization/CargoStorage/ICargoTransferrer.cs similarity index 100% rename from FrEee/Objects/Civilization/CargoStorage/ICargoTransferrer.cs rename to FrEee.Core/Objects/Civilization/CargoStorage/ICargoTransferrer.cs diff --git a/FrEee/Objects/Civilization/Colony.cs b/FrEee.Core/Objects/Civilization/Colony.cs similarity index 98% rename from FrEee/Objects/Civilization/Colony.cs rename to FrEee.Core/Objects/Civilization/Colony.cs index 78117b4f1..4f7877729 100644 --- a/FrEee/Objects/Civilization/Colony.cs +++ b/FrEee.Core/Objects/Civilization/Colony.cs @@ -1,4 +1,3 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Space; using FrEee.Objects.Technology; @@ -11,6 +10,10 @@ using System.Linq; using FrEee.Objects.Civilization.Construction; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Civilization; diff --git a/FrEee/Objects/Civilization/Construction/ConstructionQueue.cs b/FrEee.Core/Objects/Civilization/Construction/ConstructionQueue.cs similarity index 99% rename from FrEee/Objects/Civilization/Construction/ConstructionQueue.cs rename to FrEee.Core/Objects/Civilization/Construction/ConstructionQueue.cs index d9afc2070..b1b0addd8 100644 --- a/FrEee/Objects/Civilization/Construction/ConstructionQueue.cs +++ b/FrEee.Core/Objects/Civilization/Construction/ConstructionQueue.cs @@ -12,6 +12,7 @@ using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; +using FrEee.Serialization; namespace FrEee.Objects.Civilization.Construction; diff --git a/FrEee/Objects/Civilization/Construction/IConstructable.cs b/FrEee.Core/Objects/Civilization/Construction/IConstructable.cs similarity index 100% rename from FrEee/Objects/Civilization/Construction/IConstructable.cs rename to FrEee.Core/Objects/Civilization/Construction/IConstructable.cs diff --git a/FrEee/Objects/Civilization/Construction/IConstructionOrder.cs b/FrEee.Core/Objects/Civilization/Construction/IConstructionOrder.cs similarity index 100% rename from FrEee/Objects/Civilization/Construction/IConstructionOrder.cs rename to FrEee.Core/Objects/Civilization/Construction/IConstructionOrder.cs diff --git a/FrEee/Objects/Civilization/Construction/IConstructionTemplate.cs b/FrEee.Core/Objects/Civilization/Construction/IConstructionTemplate.cs similarity index 100% rename from FrEee/Objects/Civilization/Construction/IConstructionTemplate.cs rename to FrEee.Core/Objects/Civilization/Construction/IConstructionTemplate.cs diff --git a/FrEee/Objects/Civilization/Construction/IConstructor.cs b/FrEee.Core/Objects/Civilization/Construction/IConstructor.cs similarity index 100% rename from FrEee/Objects/Civilization/Construction/IConstructor.cs rename to FrEee.Core/Objects/Civilization/Construction/IConstructor.cs diff --git a/FrEee/Objects/Civilization/Culture.cs b/FrEee.Core/Objects/Civilization/Culture.cs similarity index 100% rename from FrEee/Objects/Civilization/Culture.cs rename to FrEee.Core/Objects/Civilization/Culture.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Actions/AcceptProposalAction.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Actions/AcceptProposalAction.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Actions/AcceptProposalAction.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Actions/AcceptProposalAction.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Actions/BreakTreatyAction.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Actions/BreakTreatyAction.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Actions/BreakTreatyAction.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Actions/BreakTreatyAction.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Actions/DeclareWarAction.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Actions/DeclareWarAction.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Actions/DeclareWarAction.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Actions/DeclareWarAction.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Actions/DiplomaticAction.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Actions/DiplomaticAction.cs similarity index 95% rename from FrEee/Objects/Civilization/Diplomacy/Actions/DiplomaticAction.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Actions/DiplomaticAction.cs index bf049eb05..47aae912b 100644 --- a/FrEee/Objects/Civilization/Diplomacy/Actions/DiplomaticAction.cs +++ b/FrEee.Core/Objects/Civilization/Diplomacy/Actions/DiplomaticAction.cs @@ -1,4 +1,5 @@ using FrEee.Objects.Commands; +using FrEee.Objects.GameState; using FrEee.Serialization; namespace FrEee.Objects.Civilization.Diplomacy.Actions; diff --git a/FrEee/Objects/Civilization/Diplomacy/Actions/RejectProposalAction.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Actions/RejectProposalAction.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Actions/RejectProposalAction.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Actions/RejectProposalAction.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/AllianceLevel.cs b/FrEee.Core/Objects/Civilization/Diplomacy/AllianceLevel.cs similarity index 98% rename from FrEee/Objects/Civilization/Diplomacy/AllianceLevel.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/AllianceLevel.cs index 6aa70cdfd..310493a97 100644 --- a/FrEee/Objects/Civilization/Diplomacy/AllianceLevel.cs +++ b/FrEee.Core/Objects/Civilization/Diplomacy/AllianceLevel.cs @@ -1,4 +1,5 @@ using FrEee.Utility; +using FrEee.Utility; namespace FrEee.Objects.Civilization.Diplomacy; /// diff --git a/FrEee/Objects/Civilization/Diplomacy/AllowedTrades.cs b/FrEee.Core/Objects/Civilization/Diplomacy/AllowedTrades.cs similarity index 95% rename from FrEee/Objects/Civilization/Diplomacy/AllowedTrades.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/AllowedTrades.cs index 53a01164b..b2e90fe7d 100644 --- a/FrEee/Objects/Civilization/Diplomacy/AllowedTrades.cs +++ b/FrEee.Core/Objects/Civilization/Diplomacy/AllowedTrades.cs @@ -1,4 +1,5 @@ using FrEee.Utility; +using FrEee.Utility; namespace FrEee.Objects.Civilization.Diplomacy; public enum AllowedTrades diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/AllianceClause.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/AllianceClause.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/AllianceClause.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/AllianceClause.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/Clause.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/Clause.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/Clause.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/Clause.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/CooperativeResearchClause.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/CooperativeResearchClause.cs similarity index 99% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/CooperativeResearchClause.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/CooperativeResearchClause.cs index e26666eb3..1bce7f75d 100644 --- a/FrEee/Objects/Civilization/Diplomacy/Clauses/CooperativeResearchClause.cs +++ b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/CooperativeResearchClause.cs @@ -3,6 +3,7 @@ using FrEee.Extensions; using System.Linq; using Tech = FrEee.Objects.Technology.Technology; +using FrEee.Utility; namespace FrEee.Objects.Civilization.Diplomacy.Clauses; diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/FreeTradeClause.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/FreeTradeClause.cs similarity index 98% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/FreeTradeClause.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/FreeTradeClause.cs index 62397945c..4718bdc15 100644 --- a/FrEee/Objects/Civilization/Diplomacy/Clauses/FreeTradeClause.cs +++ b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/FreeTradeClause.cs @@ -2,6 +2,7 @@ using FrEee.Utility; using FrEee.Extensions; using System; +using FrEee.Extensions; namespace FrEee.Objects.Civilization.Diplomacy.Clauses; diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/ShareAbilityClause.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareAbilityClause.cs similarity index 95% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/ShareAbilityClause.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareAbilityClause.cs index 26890f444..b322eefe5 100644 --- a/FrEee/Objects/Civilization/Diplomacy/Clauses/ShareAbilityClause.cs +++ b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareAbilityClause.cs @@ -1,5 +1,5 @@ -using FrEee.Objects.Abilities; -using FrEee.Extensions; +using FrEee.Extensions; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Civilization.Diplomacy.Clauses; diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/ShareCombatLogsClause.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareCombatLogsClause.cs similarity index 91% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/ShareCombatLogsClause.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareCombatLogsClause.cs index 1082c32d3..9c032bfb6 100644 --- a/FrEee/Objects/Civilization/Diplomacy/Clauses/ShareCombatLogsClause.cs +++ b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareCombatLogsClause.cs @@ -1,7 +1,7 @@ -using FrEee.Objects.Combat; -using FrEee.Objects.LogMessages; +using FrEee.Objects.LogMessages; using FrEee.Extensions; using System.Linq; +using FrEee.Processes.Combat; namespace FrEee.Objects.Civilization.Diplomacy.Clauses; diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/ShareDesignsClause.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareDesignsClause.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/ShareDesignsClause.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareDesignsClause.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/ShareVisionClause.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareVisionClause.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/ShareVisionClause.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/ShareVisionClause.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/SharingPriority.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/SharingPriority.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/SharingPriority.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/SharingPriority.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Clauses/TributeClause.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/TributeClause.cs similarity index 99% rename from FrEee/Objects/Civilization/Diplomacy/Clauses/TributeClause.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Clauses/TributeClause.cs index 6502c1a8e..6b8b71c54 100644 --- a/FrEee/Objects/Civilization/Diplomacy/Clauses/TributeClause.cs +++ b/FrEee.Core/Objects/Civilization/Diplomacy/Clauses/TributeClause.cs @@ -1,6 +1,7 @@ using FrEee.Utility; using FrEee.Extensions; using System.Linq; +using FrEee.Extensions; namespace FrEee.Objects.Civilization.Diplomacy.Clauses; diff --git a/FrEee/Objects/Civilization/Diplomacy/Messages/ActionMessage.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Messages/ActionMessage.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Messages/ActionMessage.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Messages/ActionMessage.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Messages/GeneralMessage.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Messages/GeneralMessage.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Messages/GeneralMessage.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Messages/GeneralMessage.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Messages/IMessage.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Messages/IMessage.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Messages/IMessage.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Messages/IMessage.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Messages/Message.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Messages/Message.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Messages/Message.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Messages/Message.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Messages/ProposalMessage.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Messages/ProposalMessage.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Messages/ProposalMessage.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Messages/ProposalMessage.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Package.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Package.cs similarity index 99% rename from FrEee/Objects/Civilization/Diplomacy/Package.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Package.cs index 01a4a6e40..d4b75f411 100644 --- a/FrEee/Objects/Civilization/Diplomacy/Package.cs +++ b/FrEee.Core/Objects/Civilization/Diplomacy/Package.cs @@ -9,6 +9,7 @@ using Tech = FrEee.Objects.Technology.Technology; using FrEee.Objects.Vehicles; using FrEee.Objects.GameState; +using FrEee.Modding; namespace FrEee.Objects.Civilization.Diplomacy; diff --git a/FrEee/Objects/Civilization/Diplomacy/Proposal.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Proposal.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Proposal.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Proposal.cs diff --git a/FrEee/Objects/Civilization/Diplomacy/Relations.cs b/FrEee.Core/Objects/Civilization/Diplomacy/Relations.cs similarity index 100% rename from FrEee/Objects/Civilization/Diplomacy/Relations.cs rename to FrEee.Core/Objects/Civilization/Diplomacy/Relations.cs diff --git a/FrEee/Objects/Civilization/Empire.cs b/FrEee.Core/Objects/Civilization/Empire.cs similarity index 99% rename from FrEee/Objects/Civilization/Empire.cs rename to FrEee.Core/Objects/Civilization/Empire.cs index 89e5c32a3..13e5a0680 100644 --- a/FrEee/Objects/Civilization/Empire.cs +++ b/FrEee.Core/Objects/Civilization/Empire.cs @@ -1,5 +1,3 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.AI; using FrEee.Objects.Civilization.Diplomacy.Clauses; using FrEee.Objects.Commands; using FrEee.Objects.LogMessages; @@ -21,7 +19,11 @@ using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; using FrEee.Objects.Civilization.Diplomacy; -using FrEee.Setup; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.AI; +using FrEee.Modding.Abilities; +using FrEee.Processes.Setup; namespace FrEee.Objects.Civilization; @@ -41,7 +43,7 @@ public Empire() ResearchedTechnologies = new ModReferenceKeyedDictionary(); AccumulatedResearch = new ModReferenceKeyedDictionary(); ResearchSpending = new ModReferenceKeyedDictionary(); - ResearchQueue = new ModReferenceList(); + ResearchQueue = new ModReferenceList(); UniqueTechsFound = new List(); Memory = new SafeDictionary(); AINotes = new DynamicDictionary(); diff --git a/FrEee/Objects/Civilization/EmpireStatus.cs b/FrEee.Core/Objects/Civilization/EmpireStatus.cs similarity index 100% rename from FrEee/Objects/Civilization/EmpireStatus.cs rename to FrEee.Core/Objects/Civilization/EmpireStatus.cs diff --git a/FrEee/Objects/Civilization/HappinessModel.cs b/FrEee.Core/Objects/Civilization/HappinessModel.cs similarity index 100% rename from FrEee/Objects/Civilization/HappinessModel.cs rename to FrEee.Core/Objects/Civilization/HappinessModel.cs diff --git a/FrEee/Objects/Civilization/IIncomeProducer.cs b/FrEee.Core/Objects/Civilization/IIncomeProducer.cs similarity index 96% rename from FrEee/Objects/Civilization/IIncomeProducer.cs rename to FrEee.Core/Objects/Civilization/IIncomeProducer.cs index 1b7940318..e72b2cf83 100644 --- a/FrEee/Objects/Civilization/IIncomeProducer.cs +++ b/FrEee.Core/Objects/Civilization/IIncomeProducer.cs @@ -1,4 +1,4 @@ -using FrEee.Objects.Abilities; +using FrEee.Modding.Abilities; using FrEee.Objects.Space; using FrEee.Utility; namespace FrEee.Objects.Civilization; diff --git a/FrEee/Objects/Civilization/INameable.cs b/FrEee.Core/Objects/Civilization/INameable.cs similarity index 100% rename from FrEee/Objects/Civilization/INameable.cs rename to FrEee.Core/Objects/Civilization/INameable.cs diff --git a/FrEee/Objects/Civilization/IOrderable.cs b/FrEee.Core/Objects/Civilization/IOrderable.cs similarity index 100% rename from FrEee/Objects/Civilization/IOrderable.cs rename to FrEee.Core/Objects/Civilization/IOrderable.cs diff --git a/FrEee/Objects/Civilization/IOwnable.cs b/FrEee.Core/Objects/Civilization/IOwnable.cs similarity index 92% rename from FrEee/Objects/Civilization/IOwnable.cs rename to FrEee.Core/Objects/Civilization/IOwnable.cs index 27c1daac5..2e6b13f1d 100644 --- a/FrEee/Objects/Civilization/IOwnable.cs +++ b/FrEee.Core/Objects/Civilization/IOwnable.cs @@ -1,4 +1,4 @@ -using FrEee.Serialization; +using FrEee.Utility; namespace FrEee.Objects.Civilization; diff --git a/FrEee/Objects/Civilization/Mood.cs b/FrEee.Core/Objects/Civilization/Mood.cs similarity index 100% rename from FrEee/Objects/Civilization/Mood.cs rename to FrEee.Core/Objects/Civilization/Mood.cs diff --git a/FrEee/Objects/Civilization/Orders/ActivateAbilityOrder.cs b/FrEee.Core/Objects/Civilization/Orders/ActivateAbilityOrder.cs similarity index 99% rename from FrEee/Objects/Civilization/Orders/ActivateAbilityOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/ActivateAbilityOrder.cs index 8a4213a9c..66223efb2 100644 --- a/FrEee/Objects/Civilization/Orders/ActivateAbilityOrder.cs +++ b/FrEee.Core/Objects/Civilization/Orders/ActivateAbilityOrder.cs @@ -1,5 +1,4 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.LogMessages; +using FrEee.Objects.LogMessages; using FrEee.Objects.Space; using FrEee.Objects.Vehicles; using FrEee.Modding; @@ -8,8 +7,10 @@ using System.Collections.Generic; using System.Linq; using FrEee.Objects.Technology; -using FrEee.Objects.Combat; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Civilization.Orders; diff --git a/FrEee/Objects/Civilization/Orders/ColonizeOrder.cs b/FrEee.Core/Objects/Civilization/Orders/ColonizeOrder.cs similarity index 99% rename from FrEee/Objects/Civilization/Orders/ColonizeOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/ColonizeOrder.cs index 9885305d0..41a1dbddd 100644 --- a/FrEee/Objects/Civilization/Orders/ColonizeOrder.cs +++ b/FrEee.Core/Objects/Civilization/Orders/ColonizeOrder.cs @@ -10,6 +10,7 @@ using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Civilization.Construction; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.Objects.Civilization.Orders; diff --git a/FrEee/Objects/Civilization/Orders/ConstructionOrder.cs b/FrEee.Core/Objects/Civilization/Orders/ConstructionOrder.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/ConstructionOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/ConstructionOrder.cs diff --git a/FrEee/Objects/Civilization/Orders/EvadeOrder.cs b/FrEee.Core/Objects/Civilization/Orders/EvadeOrder.cs similarity index 99% rename from FrEee/Objects/Civilization/Orders/EvadeOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/EvadeOrder.cs index 57189d3da..dd3282641 100644 --- a/FrEee/Objects/Civilization/Orders/EvadeOrder.cs +++ b/FrEee.Core/Objects/Civilization/Orders/EvadeOrder.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; +using FrEee.Extensions; namespace FrEee.Objects.Civilization.Orders; diff --git a/FrEee/Objects/Civilization/Orders/IMovementOrder.cs b/FrEee.Core/Objects/Civilization/Orders/IMovementOrder.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/IMovementOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/IMovementOrder.cs diff --git a/FrEee/Objects/Civilization/Orders/IOrder.cs b/FrEee.Core/Objects/Civilization/Orders/IOrder.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/IOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/IOrder.cs diff --git a/FrEee/Objects/Civilization/Orders/IPathfindingOrder.cs b/FrEee.Core/Objects/Civilization/Orders/IPathfindingOrder.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/IPathfindingOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/IPathfindingOrder.cs diff --git a/FrEee/Objects/Civilization/Orders/IRecyclable.cs b/FrEee.Core/Objects/Civilization/Orders/IRecyclable.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/IRecyclable.cs rename to FrEee.Core/Objects/Civilization/Orders/IRecyclable.cs diff --git a/FrEee/Objects/Civilization/Orders/IRecycleBehavior.cs b/FrEee.Core/Objects/Civilization/Orders/IRecycleBehavior.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/IRecycleBehavior.cs rename to FrEee.Core/Objects/Civilization/Orders/IRecycleBehavior.cs diff --git a/FrEee/Objects/Civilization/Orders/MoveOrder.cs b/FrEee.Core/Objects/Civilization/Orders/MoveOrder.cs similarity index 99% rename from FrEee/Objects/Civilization/Orders/MoveOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/MoveOrder.cs index 22004ab21..806014891 100644 --- a/FrEee/Objects/Civilization/Orders/MoveOrder.cs +++ b/FrEee.Core/Objects/Civilization/Orders/MoveOrder.cs @@ -1,4 +1,4 @@ -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; using FrEee.Objects.LogMessages; using FrEee.Objects.Space; using FrEee.Utility; diff --git a/FrEee/Objects/Civilization/Orders/PathfindingOrder.cs b/FrEee.Core/Objects/Civilization/Orders/PathfindingOrder.cs similarity index 99% rename from FrEee/Objects/Civilization/Orders/PathfindingOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/PathfindingOrder.cs index 1ba195725..75caa27b9 100644 --- a/FrEee/Objects/Civilization/Orders/PathfindingOrder.cs +++ b/FrEee.Core/Objects/Civilization/Orders/PathfindingOrder.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.Objects.Civilization.Orders; diff --git a/FrEee/Objects/Civilization/Orders/PursueOrder.cs b/FrEee.Core/Objects/Civilization/Orders/PursueOrder.cs similarity index 95% rename from FrEee/Objects/Civilization/Orders/PursueOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/PursueOrder.cs index 17d61ed54..5af94e11e 100644 --- a/FrEee/Objects/Civilization/Orders/PursueOrder.cs +++ b/FrEee.Core/Objects/Civilization/Orders/PursueOrder.cs @@ -1,6 +1,5 @@ - -using FrEee.Objects.Combat; -using FrEee.Objects.Space; +using FrEee.Objects.Space; +using FrEee.Processes.Combat; using FrEee.Utility; using System; using System.Collections.Generic; diff --git a/FrEee/Objects/Civilization/Orders/RecycleBehaviors/ScrapBehavior.cs b/FrEee.Core/Objects/Civilization/Orders/RecycleBehaviors/ScrapBehavior.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/RecycleBehaviors/ScrapBehavior.cs rename to FrEee.Core/Objects/Civilization/Orders/RecycleBehaviors/ScrapBehavior.cs diff --git a/FrEee/Objects/Civilization/Orders/RecycleFacilityOrCargoOrder.cs b/FrEee.Core/Objects/Civilization/Orders/RecycleFacilityOrCargoOrder.cs similarity index 98% rename from FrEee/Objects/Civilization/Orders/RecycleFacilityOrCargoOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/RecycleFacilityOrCargoOrder.cs index 9245f324e..8cd4c1a1b 100644 --- a/FrEee/Objects/Civilization/Orders/RecycleFacilityOrCargoOrder.cs +++ b/FrEee.Core/Objects/Civilization/Orders/RecycleFacilityOrCargoOrder.cs @@ -4,8 +4,8 @@ using FrEee.Extensions; using System.Collections.Generic; using System.Linq; -using FrEee.Objects.Combat; using FrEee.Objects.GameState; +using FrEee.Processes.Combat; namespace FrEee.Objects.Civilization.Orders; diff --git a/FrEee/Objects/Civilization/Orders/RecycleVehicleInSpaceOrder.cs b/FrEee.Core/Objects/Civilization/Orders/RecycleVehicleInSpaceOrder.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/RecycleVehicleInSpaceOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/RecycleVehicleInSpaceOrder.cs diff --git a/FrEee/Objects/Civilization/Orders/SentryOrder.cs b/FrEee.Core/Objects/Civilization/Orders/SentryOrder.cs similarity index 98% rename from FrEee/Objects/Civilization/Orders/SentryOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/SentryOrder.cs index dc149ec5f..b5c79427b 100644 --- a/FrEee/Objects/Civilization/Orders/SentryOrder.cs +++ b/FrEee.Core/Objects/Civilization/Orders/SentryOrder.cs @@ -6,8 +6,8 @@ using System; using System.Collections.Generic; using System.Linq; -using FrEee.Objects.Combat; using FrEee.Objects.GameState; +using FrEee.Processes.Combat; namespace FrEee.Objects.Civilization.Orders; diff --git a/FrEee/Objects/Civilization/Orders/TransferCargoOrder.cs b/FrEee.Core/Objects/Civilization/Orders/TransferCargoOrder.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/TransferCargoOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/TransferCargoOrder.cs diff --git a/FrEee/Objects/Civilization/Orders/UpgradeFacilityOrder.cs b/FrEee.Core/Objects/Civilization/Orders/UpgradeFacilityOrder.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/UpgradeFacilityOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/UpgradeFacilityOrder.cs diff --git a/FrEee/Objects/Civilization/Orders/WarpOrder.cs b/FrEee.Core/Objects/Civilization/Orders/WarpOrder.cs similarity index 100% rename from FrEee/Objects/Civilization/Orders/WarpOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/WarpOrder.cs diff --git a/FrEee/Objects/Civilization/Orders/WaypointOrder.cs b/FrEee.Core/Objects/Civilization/Orders/WaypointOrder.cs similarity index 99% rename from FrEee/Objects/Civilization/Orders/WaypointOrder.cs rename to FrEee.Core/Objects/Civilization/Orders/WaypointOrder.cs index 4d41caaba..142eed5db 100644 --- a/FrEee/Objects/Civilization/Orders/WaypointOrder.cs +++ b/FrEee.Core/Objects/Civilization/Orders/WaypointOrder.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.Objects.Civilization.Orders; diff --git a/FrEee/Objects/Civilization/PlayerInfo.cs b/FrEee.Core/Objects/Civilization/PlayerInfo.cs similarity index 100% rename from FrEee/Objects/Civilization/PlayerInfo.cs rename to FrEee.Core/Objects/Civilization/PlayerInfo.cs diff --git a/FrEee/Objects/Civilization/Race.cs b/FrEee.Core/Objects/Civilization/Race.cs similarity index 98% rename from FrEee/Objects/Civilization/Race.cs rename to FrEee.Core/Objects/Civilization/Race.cs index e90b1664d..0b889f9c0 100644 --- a/FrEee/Objects/Civilization/Race.cs +++ b/FrEee.Core/Objects/Civilization/Race.cs @@ -1,4 +1,3 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Space; using FrEee.Modding; using FrEee.Utility; @@ -10,6 +9,9 @@ using System.IO; using System.Linq; using FrEee.Objects.GameState; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Civilization; diff --git a/FrEee/Objects/Civilization/SectorWaypoint.cs b/FrEee.Core/Objects/Civilization/SectorWaypoint.cs similarity index 100% rename from FrEee/Objects/Civilization/SectorWaypoint.cs rename to FrEee.Core/Objects/Civilization/SectorWaypoint.cs diff --git a/FrEee/Objects/Civilization/SpaceObjectWaypoint.cs b/FrEee.Core/Objects/Civilization/SpaceObjectWaypoint.cs similarity index 96% rename from FrEee/Objects/Civilization/SpaceObjectWaypoint.cs rename to FrEee.Core/Objects/Civilization/SpaceObjectWaypoint.cs index 58278cb2c..00a968f78 100644 --- a/FrEee/Objects/Civilization/SpaceObjectWaypoint.cs +++ b/FrEee.Core/Objects/Civilization/SpaceObjectWaypoint.cs @@ -2,6 +2,7 @@ using FrEee.Serialization; using FrEee.Extensions; using System; +using FrEee.Objects.GameState; namespace FrEee.Objects.Civilization; diff --git a/FrEee/Objects/Civilization/Trait.cs b/FrEee.Core/Objects/Civilization/Trait.cs similarity index 97% rename from FrEee/Objects/Civilization/Trait.cs rename to FrEee.Core/Objects/Civilization/Trait.cs index 62b2ecb11..64258a125 100644 --- a/FrEee/Objects/Civilization/Trait.cs +++ b/FrEee.Core/Objects/Civilization/Trait.cs @@ -1,10 +1,10 @@ -using FrEee.Objects.Abilities; -using FrEee.Modding; +using FrEee.Modding; using FrEee.Extensions; using System; using System.Collections.Generic; using System.Drawing; using FrEee.Objects.GameState; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Civilization; diff --git a/FrEee/Objects/Civilization/Waypoint.cs b/FrEee.Core/Objects/Civilization/Waypoint.cs similarity index 100% rename from FrEee/Objects/Civilization/Waypoint.cs rename to FrEee.Core/Objects/Civilization/Waypoint.cs diff --git a/FrEee/Objects/Commands/AddOrderCommand.cs b/FrEee.Core/Objects/Commands/AddOrderCommand.cs similarity index 100% rename from FrEee/Objects/Commands/AddOrderCommand.cs rename to FrEee.Core/Objects/Commands/AddOrderCommand.cs diff --git a/FrEee/Objects/Commands/ClearPlayerNoteCommand.cs b/FrEee.Core/Objects/Commands/ClearPlayerNoteCommand.cs similarity index 96% rename from FrEee/Objects/Commands/ClearPlayerNoteCommand.cs rename to FrEee.Core/Objects/Commands/ClearPlayerNoteCommand.cs index 7697685f9..64e35bf58 100644 --- a/FrEee/Objects/Commands/ClearPlayerNoteCommand.cs +++ b/FrEee.Core/Objects/Commands/ClearPlayerNoteCommand.cs @@ -1,6 +1,7 @@ using FrEee.Objects.Civilization; using FrEee.Utility; using System.Collections.Generic; +using FrEee.Utility; namespace FrEee.Objects.Commands; diff --git a/FrEee/Objects/Commands/ClearPrivateNameCommand.cs b/FrEee.Core/Objects/Commands/ClearPrivateNameCommand.cs similarity index 95% rename from FrEee/Objects/Commands/ClearPrivateNameCommand.cs rename to FrEee.Core/Objects/Commands/ClearPrivateNameCommand.cs index b51d88e82..7366d42ef 100644 --- a/FrEee/Objects/Commands/ClearPrivateNameCommand.cs +++ b/FrEee.Core/Objects/Commands/ClearPrivateNameCommand.cs @@ -1,6 +1,7 @@ using FrEee.Objects.Civilization; using FrEee.Serialization; using FrEee.Extensions; +using FrEee.Objects.GameState; namespace FrEee.Objects.Commands; diff --git a/FrEee/Objects/Commands/Command.cs b/FrEee.Core/Objects/Commands/Command.cs similarity index 100% rename from FrEee/Objects/Commands/Command.cs rename to FrEee.Core/Objects/Commands/Command.cs diff --git a/FrEee/Objects/Commands/CreateDesignCommand.cs b/FrEee.Core/Objects/Commands/CreateDesignCommand.cs similarity index 100% rename from FrEee/Objects/Commands/CreateDesignCommand.cs rename to FrEee.Core/Objects/Commands/CreateDesignCommand.cs diff --git a/FrEee/Objects/Commands/CreateFleetCommand.cs b/FrEee.Core/Objects/Commands/CreateFleetCommand.cs similarity index 100% rename from FrEee/Objects/Commands/CreateFleetCommand.cs rename to FrEee.Core/Objects/Commands/CreateFleetCommand.cs diff --git a/FrEee/Objects/Commands/CreateWaypointCommand.cs b/FrEee.Core/Objects/Commands/CreateWaypointCommand.cs similarity index 100% rename from FrEee/Objects/Commands/CreateWaypointCommand.cs rename to FrEee.Core/Objects/Commands/CreateWaypointCommand.cs diff --git a/FrEee/Objects/Commands/DeleteMessageCommand.cs b/FrEee.Core/Objects/Commands/DeleteMessageCommand.cs similarity index 96% rename from FrEee/Objects/Commands/DeleteMessageCommand.cs rename to FrEee.Core/Objects/Commands/DeleteMessageCommand.cs index 4cef4b7c1..433a74d2a 100644 --- a/FrEee/Objects/Commands/DeleteMessageCommand.cs +++ b/FrEee.Core/Objects/Commands/DeleteMessageCommand.cs @@ -1,7 +1,7 @@ using FrEee.Objects.Civilization; -using FrEee.Serialization; using FrEee.Extensions; using FrEee.Objects.Civilization.Diplomacy.Messages; +using FrEee.Objects.GameState; namespace FrEee.Objects.Commands; diff --git a/FrEee/Objects/Commands/DeleteWaypointCommand.cs b/FrEee.Core/Objects/Commands/DeleteWaypointCommand.cs similarity index 100% rename from FrEee/Objects/Commands/DeleteWaypointCommand.cs rename to FrEee.Core/Objects/Commands/DeleteWaypointCommand.cs diff --git a/FrEee/Objects/Commands/DisbandFleetCommand.cs b/FrEee.Core/Objects/Commands/DisbandFleetCommand.cs similarity index 100% rename from FrEee/Objects/Commands/DisbandFleetCommand.cs rename to FrEee.Core/Objects/Commands/DisbandFleetCommand.cs diff --git a/FrEee/Objects/Commands/EditStrategyCommand.cs b/FrEee.Core/Objects/Commands/EditStrategyCommand.cs similarity index 100% rename from FrEee/Objects/Commands/EditStrategyCommand.cs rename to FrEee.Core/Objects/Commands/EditStrategyCommand.cs diff --git a/FrEee/Objects/Commands/HotkeyWaypointCommand.cs b/FrEee.Core/Objects/Commands/HotkeyWaypointCommand.cs similarity index 100% rename from FrEee/Objects/Commands/HotkeyWaypointCommand.cs rename to FrEee.Core/Objects/Commands/HotkeyWaypointCommand.cs diff --git a/FrEee/Objects/Commands/ICommand.cs b/FrEee.Core/Objects/Commands/ICommand.cs similarity index 100% rename from FrEee/Objects/Commands/ICommand.cs rename to FrEee.Core/Objects/Commands/ICommand.cs diff --git a/FrEee/Objects/Commands/ICreateDesignCommand.cs b/FrEee.Core/Objects/Commands/ICreateDesignCommand.cs similarity index 100% rename from FrEee/Objects/Commands/ICreateDesignCommand.cs rename to FrEee.Core/Objects/Commands/ICreateDesignCommand.cs diff --git a/FrEee/Objects/Commands/IOrderCommand.cs b/FrEee.Core/Objects/Commands/IOrderCommand.cs similarity index 100% rename from FrEee/Objects/Commands/IOrderCommand.cs rename to FrEee.Core/Objects/Commands/IOrderCommand.cs diff --git a/FrEee/Objects/Commands/JoinFleetCommand.cs b/FrEee.Core/Objects/Commands/JoinFleetCommand.cs similarity index 100% rename from FrEee/Objects/Commands/JoinFleetCommand.cs rename to FrEee.Core/Objects/Commands/JoinFleetCommand.cs diff --git a/FrEee/Objects/Commands/LeaveFleetCommand.cs b/FrEee.Core/Objects/Commands/LeaveFleetCommand.cs similarity index 100% rename from FrEee/Objects/Commands/LeaveFleetCommand.cs rename to FrEee.Core/Objects/Commands/LeaveFleetCommand.cs diff --git a/FrEee/Objects/Commands/MinisterToggleCommand.cs b/FrEee.Core/Objects/Commands/MinisterToggleCommand.cs similarity index 94% rename from FrEee/Objects/Commands/MinisterToggleCommand.cs rename to FrEee.Core/Objects/Commands/MinisterToggleCommand.cs index d5770dc73..e7879ffca 100644 --- a/FrEee/Objects/Commands/MinisterToggleCommand.cs +++ b/FrEee.Core/Objects/Commands/MinisterToggleCommand.cs @@ -1,6 +1,7 @@ using FrEee.Objects.Civilization; using FrEee.Serialization; using FrEee.Extensions; +using FrEee.Objects.GameState; namespace FrEee.Objects.Commands; diff --git a/FrEee/Objects/Commands/OrderCommand.cs b/FrEee.Core/Objects/Commands/OrderCommand.cs similarity index 100% rename from FrEee/Objects/Commands/OrderCommand.cs rename to FrEee.Core/Objects/Commands/OrderCommand.cs diff --git a/FrEee/Objects/Commands/RearrangeOrdersCommand.cs b/FrEee.Core/Objects/Commands/RearrangeOrdersCommand.cs similarity index 100% rename from FrEee/Objects/Commands/RearrangeOrdersCommand.cs rename to FrEee.Core/Objects/Commands/RearrangeOrdersCommand.cs diff --git a/FrEee/Objects/Commands/RemoveOrderCommand.cs b/FrEee.Core/Objects/Commands/RemoveOrderCommand.cs similarity index 100% rename from FrEee/Objects/Commands/RemoveOrderCommand.cs rename to FrEee.Core/Objects/Commands/RemoveOrderCommand.cs diff --git a/FrEee/Objects/Commands/ResearchCommand.cs b/FrEee.Core/Objects/Commands/ResearchCommand.cs similarity index 98% rename from FrEee/Objects/Commands/ResearchCommand.cs rename to FrEee.Core/Objects/Commands/ResearchCommand.cs index 2a2ad62e8..1c25de25c 100644 --- a/FrEee/Objects/Commands/ResearchCommand.cs +++ b/FrEee.Core/Objects/Commands/ResearchCommand.cs @@ -3,6 +3,7 @@ using FrEee.Extensions; using System.Linq; using Tech = FrEee.Objects.Technology.Technology; +using FrEee.Modding; namespace FrEee.Objects.Commands; diff --git a/FrEee/Objects/Commands/SendMessageCommand.cs b/FrEee.Core/Objects/Commands/SendMessageCommand.cs similarity index 100% rename from FrEee/Objects/Commands/SendMessageCommand.cs rename to FrEee.Core/Objects/Commands/SendMessageCommand.cs diff --git a/FrEee/Objects/Commands/SetObsoleteFlagCommand.cs b/FrEee.Core/Objects/Commands/SetObsoleteFlagCommand.cs similarity index 100% rename from FrEee/Objects/Commands/SetObsoleteFlagCommand.cs rename to FrEee.Core/Objects/Commands/SetObsoleteFlagCommand.cs diff --git a/FrEee/Objects/Commands/SetPlayerInfoCommand.cs b/FrEee.Core/Objects/Commands/SetPlayerInfoCommand.cs similarity index 100% rename from FrEee/Objects/Commands/SetPlayerInfoCommand.cs rename to FrEee.Core/Objects/Commands/SetPlayerInfoCommand.cs diff --git a/FrEee/Objects/Commands/SetPlayerNoteCommand.cs b/FrEee.Core/Objects/Commands/SetPlayerNoteCommand.cs similarity index 95% rename from FrEee/Objects/Commands/SetPlayerNoteCommand.cs rename to FrEee.Core/Objects/Commands/SetPlayerNoteCommand.cs index 622feb8f1..bf8110815 100644 --- a/FrEee/Objects/Commands/SetPlayerNoteCommand.cs +++ b/FrEee.Core/Objects/Commands/SetPlayerNoteCommand.cs @@ -1,6 +1,7 @@ using FrEee.Objects.Civilization; using FrEee.Serialization; using FrEee.Extensions; +using FrEee.Objects.GameState; namespace FrEee.Objects.Commands; diff --git a/FrEee/Objects/Commands/SetPrivateNameCommand.cs b/FrEee.Core/Objects/Commands/SetPrivateNameCommand.cs similarity index 96% rename from FrEee/Objects/Commands/SetPrivateNameCommand.cs rename to FrEee.Core/Objects/Commands/SetPrivateNameCommand.cs index 0282c364a..204027958 100644 --- a/FrEee/Objects/Commands/SetPrivateNameCommand.cs +++ b/FrEee.Core/Objects/Commands/SetPrivateNameCommand.cs @@ -1,6 +1,7 @@ using FrEee.Objects.Civilization; using FrEee.Serialization; using FrEee.Extensions; +using FrEee.Objects.GameState; namespace FrEee.Objects.Commands; diff --git a/FrEee/Objects/Commands/SetPublicNameCommand.cs b/FrEee.Core/Objects/Commands/SetPublicNameCommand.cs similarity index 100% rename from FrEee/Objects/Commands/SetPublicNameCommand.cs rename to FrEee.Core/Objects/Commands/SetPublicNameCommand.cs diff --git a/FrEee/Objects/Commands/ToggleOrdersOnHoldCommand.cs b/FrEee.Core/Objects/Commands/ToggleOrdersOnHoldCommand.cs similarity index 100% rename from FrEee/Objects/Commands/ToggleOrdersOnHoldCommand.cs rename to FrEee.Core/Objects/Commands/ToggleOrdersOnHoldCommand.cs diff --git a/FrEee/Objects/Commands/ToggleRepeatOrdersCommand.cs b/FrEee.Core/Objects/Commands/ToggleRepeatOrdersCommand.cs similarity index 100% rename from FrEee/Objects/Commands/ToggleRepeatOrdersCommand.cs rename to FrEee.Core/Objects/Commands/ToggleRepeatOrdersCommand.cs diff --git a/FrEee/Objects/Events/Event.cs b/FrEee.Core/Objects/Events/Event.cs similarity index 98% rename from FrEee/Objects/Events/Event.cs rename to FrEee.Core/Objects/Events/Event.cs index 28b076ba3..a361973e9 100644 --- a/FrEee/Objects/Events/Event.cs +++ b/FrEee.Core/Objects/Events/Event.cs @@ -10,6 +10,8 @@ using System.Text.RegularExpressions; using FrEee.Serialization; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.Objects.Events; diff --git a/FrEee/Objects/Events/EventMessage.cs b/FrEee.Core/Objects/Events/EventMessage.cs similarity index 100% rename from FrEee/Objects/Events/EventMessage.cs rename to FrEee.Core/Objects/Events/EventMessage.cs diff --git a/FrEee/Objects/GameState/Galaxy.cs b/FrEee.Core/Objects/GameState/Galaxy.cs similarity index 99% rename from FrEee/Objects/GameState/Galaxy.cs rename to FrEee.Core/Objects/GameState/Galaxy.cs index bf02f89a0..54cfe19c2 100644 --- a/FrEee/Objects/GameState/Galaxy.cs +++ b/FrEee.Core/Objects/GameState/Galaxy.cs @@ -1,13 +1,9 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Objects.Civilization.Diplomacy.Clauses; -using FrEee.Objects.Combat; -using FrEee.Objects.Combat.Grid; +using FrEee.Processes.Combat.Grid; using FrEee.Objects.Commands; using FrEee.Objects.Events; using FrEee.Objects.LogMessages; -using FrEee.Setup; -using FrEee.Setup.WarpPointPlacementStrategies; using FrEee.Modding; using FrEee.Utility; using FrEee.Serialization; @@ -26,6 +22,13 @@ using FrEee.Objects.Space; using FrEee.Objects.Civilization.Diplomacy; using FrEee.Objects.Technology; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; +using FrEee.Processes.Setup; +using FrEee.Processes.Setup.WarpPointPlacementStrategies; namespace FrEee.Objects.GameState; diff --git a/FrEee.Core/Objects/GameState/GalaxyProgress.cs b/FrEee.Core/Objects/GameState/GalaxyProgress.cs new file mode 100644 index 000000000..ac100f7d1 --- /dev/null +++ b/FrEee.Core/Objects/GameState/GalaxyProgress.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Serialization; +using FrEee.Utility; + +namespace FrEee.Objects.GameState +{ + public class GalaxyProgress : Progress, T> + where T : IReferrable + { + public GalaxyProgress(T item, long value, long maximum, long incrementalProgressBeforeDelay = 0, double? delay = 0, long extraIncrementalProgressAfterDelay = 0) + : base(item, value, maximum, incrementalProgressBeforeDelay, delay, extraIncrementalProgressAfterDelay) + { + } + } +} diff --git a/FrEee.Core/Objects/GameState/GalaxyReference.cs b/FrEee.Core/Objects/GameState/GalaxyReference.cs new file mode 100644 index 000000000..f0f7edfba --- /dev/null +++ b/FrEee.Core/Objects/GameState/GalaxyReference.cs @@ -0,0 +1,183 @@ +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using FrEee.Utility; +using FrEee.Serialization; + +namespace FrEee.Objects.GameState; + +/// +/// A lightweight reference to some object in the current galaxy. +/// Can be passed around on the network as a surrogate for said object. +/// This class should be used when referencing a server side object from the client. +/// It is not necessary to use GalaxyReference when entirely within either the client or the server. +/// +/// +[Serializable] +public class GalaxyReference : IReference, IPromotable + where T : IReferrable +{ + + /// + /// Either will create a new Galaxy Reference with the given id, or return null. + /// Useful to allow a client to store an ID locally for reference, when the server might destroy said ID. + /// + /// + /// + public static GalaxyReference GetGalaxyReference(long id) + { + if (Galaxy.Current.referrables.ContainsKey(id)) + return new GalaxyReference(id); + + return null; + } + + public GalaxyReference() + { + InitializeCache(); + } + + public GalaxyReference(T t) + : this() + { + if (t is IReferrable) + { + var r = (IReferrable)t; + if (Galaxy.Current == null) + throw new ReferenceException("Can't create a reference to an IReferrable without a galaxy."); + else if (t == null) + ID = 0; + else if (r.ID > 0) + ID = r.ID; + else + ID = Galaxy.Current.AssignID(r); + if (!HasValue) + { + Galaxy.Current.referrables[r.ID] = r; + cache = null; // reset cache + if (!HasValue) + throw new ArgumentException("{0} does not exist in the current galaxy so it cannot be referenced.".F(t)); + } + } + else + { + value = t; + } + } + + public GalaxyReference(long id) + : this() + { + if (Galaxy.Current == null) + throw new ReferenceException("Can't create a reference to an IReferrable without a galaxy."); + else if (!Galaxy.Current.referrables.ContainsKey(id)) + throw new IndexOutOfRangeException($"The id of {id} is not currently a valid reference"); + else if (Galaxy.Current.referrables[id] is T) + ID = id; + else + throw new Exception("Object with ID " + id + " is not a " + typeof(T) + "."); + } + + private void InitializeCache() + { + cache = new ClientSideCache(() => + { + if (ID <= 0) + return value; + var obj = (T)Galaxy.Current.GetReferrable(ID); + if (obj == null) + return default; + /*if (obj is IReferrable && (obj as IReferrable).IsDisposed) + return default(T);*/ + return obj; + } + ); + } + + /// + /// Does the reference have a valid value? + /// + public bool HasValue => Value != null; + + public long ID { get; internal set; } + + /// + /// Resolves the reference. + /// + /// + public T Value + { + get + { + if (cache == null) + InitializeCache(); + return cache.Value; + } + } + + [field: NonSerialized] + private T value { get; set; } + + [NonSerialized] + private ClientSideCache cache; + + public static implicit operator GalaxyReference(T t) + { + if (t == null) + return null; + return new GalaxyReference(t); + } + + public static implicit operator T(GalaxyReference r) + { + if (r == null) + return default; + return r.Value; + } + + public static bool operator !=(GalaxyReference r1, GalaxyReference r2) + { + return !(r1 == r2); + } + + public static bool operator ==(GalaxyReference r1, GalaxyReference r2) + { + if (r1 is null && r2 is null) + return true; + if (r1 is null || r2 is null) + return false; + return r1.ID == r2.ID; + } + + public override bool Equals(object? obj) + { + // TODO - upgrade equals to use "as" operator + if (obj is GalaxyReference) + return this == (GalaxyReference)obj; + return false; + } + + public override int GetHashCode() + { + return ID.GetHashCode(); + } + + public void ReplaceClientIDs(IDictionary idmap, ISet done = null) + { + if (done == null) + done = new HashSet(); + if (!done.Contains(this)) + { + done.Add(this); + if (idmap.ContainsKey(ID)) + ID = idmap[ID]; + if (HasValue && Value is IPromotable) + ((IPromotable)Value).ReplaceClientIDs(idmap, done); + } + } + + public override string ToString() + { + return "ID=" + ID + ", Value=" + Value; + } +} diff --git a/FrEee.Core/Objects/GameState/GalaxyReferenceKeyedDictionary.cs b/FrEee.Core/Objects/GameState/GalaxyReferenceKeyedDictionary.cs new file mode 100644 index 000000000..a6f0c2a98 --- /dev/null +++ b/FrEee.Core/Objects/GameState/GalaxyReferenceKeyedDictionary.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Serialization; +using FrEee.Utility; + +namespace FrEee.Objects.GameState; + +public class GalaxyReferenceKeyedDictionary : ReferenceKeyedDictionary, TKey, TValue> + where TKey : IReferrable +{ + private SafeDictionary dict = new SafeDictionary(); + + protected override long ExtractID(TKey key) + { + return key.ID; + } + + protected override TKey LookUp(long id) + { + if (!dict.ContainsKey(id)) + dict[id] = (TKey)Galaxy.Current.GetReferrable(id); + return dict[id]; + } +} \ No newline at end of file diff --git a/FrEee.Core/Objects/GameState/GalaxyReferenceList.cs b/FrEee.Core/Objects/GameState/GalaxyReferenceList.cs new file mode 100644 index 000000000..8a19da989 --- /dev/null +++ b/FrEee.Core/Objects/GameState/GalaxyReferenceList.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Serialization; + +namespace FrEee.Objects.GameState +{ + public class GalaxyReferenceList + : ReferenceList, T> + where T : IReferrable + { + } +} \ No newline at end of file diff --git a/FrEee.Core/Objects/GameState/GalaxyReferenceSet.cs b/FrEee.Core/Objects/GameState/GalaxyReferenceSet.cs new file mode 100644 index 000000000..6ba0b8450 --- /dev/null +++ b/FrEee.Core/Objects/GameState/GalaxyReferenceSet.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Serialization; + +namespace FrEee.Objects.GameState +{ + [Serializable] + public class GalaxyReferenceSet + : ReferenceSet, T> + where T : IReferrable + { + public GalaxyReferenceSet() + : base() + { + } + + public GalaxyReferenceSet(IEnumerable objs) + : base(objs) + { + } + } +} diff --git a/FrEee/Objects/GameState/ICleanable.cs b/FrEee.Core/Objects/GameState/ICleanable.cs similarity index 100% rename from FrEee/Objects/GameState/ICleanable.cs rename to FrEee.Core/Objects/GameState/ICleanable.cs diff --git a/FrEee/Objects/GameState/IContainable.cs b/FrEee.Core/Objects/GameState/IContainable.cs similarity index 93% rename from FrEee/Objects/GameState/IContainable.cs rename to FrEee.Core/Objects/GameState/IContainable.cs index 91d6bfd6d..89ead7557 100644 --- a/FrEee/Objects/GameState/IContainable.cs +++ b/FrEee.Core/Objects/GameState/IContainable.cs @@ -1,4 +1,5 @@ using FrEee.Serialization; +using FrEee.Utility; namespace FrEee.Objects.GameState; diff --git a/FrEee/Objects/GameState/IFoggable.cs b/FrEee.Core/Objects/GameState/IFoggable.cs similarity index 100% rename from FrEee/Objects/GameState/IFoggable.cs rename to FrEee.Core/Objects/GameState/IFoggable.cs diff --git a/FrEee/Objects/GameState/INamed.cs b/FrEee.Core/Objects/GameState/INamed.cs similarity index 100% rename from FrEee/Objects/GameState/INamed.cs rename to FrEee.Core/Objects/GameState/INamed.cs diff --git a/FrEee/Objects/GameState/IPictorial.cs b/FrEee.Core/Objects/GameState/IPictorial.cs similarity index 100% rename from FrEee/Objects/GameState/IPictorial.cs rename to FrEee.Core/Objects/GameState/IPictorial.cs diff --git a/FrEee/Objects/GameState/IPromotable.cs b/FrEee.Core/Objects/GameState/IPromotable.cs similarity index 100% rename from FrEee/Objects/GameState/IPromotable.cs rename to FrEee.Core/Objects/GameState/IPromotable.cs diff --git a/FrEee/Objects/GameState/ITemplate.cs b/FrEee.Core/Objects/GameState/ITemplate.cs similarity index 100% rename from FrEee/Objects/GameState/ITemplate.cs rename to FrEee.Core/Objects/GameState/ITemplate.cs diff --git a/FrEee/Objects/GameState/IUnlockable.cs b/FrEee.Core/Objects/GameState/IUnlockable.cs similarity index 100% rename from FrEee/Objects/GameState/IUnlockable.cs rename to FrEee.Core/Objects/GameState/IUnlockable.cs diff --git a/FrEee/Objects/GameState/Visibility.cs b/FrEee.Core/Objects/GameState/Visibility.cs similarity index 100% rename from FrEee/Objects/GameState/Visibility.cs rename to FrEee.Core/Objects/GameState/Visibility.cs diff --git a/FrEee/Objects/LogMessages/GenericLogMessage.cs b/FrEee.Core/Objects/LogMessages/GenericLogMessage.cs similarity index 100% rename from FrEee/Objects/LogMessages/GenericLogMessage.cs rename to FrEee.Core/Objects/LogMessages/GenericLogMessage.cs diff --git a/FrEee/Objects/LogMessages/IPictorialLogMessage.cs b/FrEee.Core/Objects/LogMessages/IPictorialLogMessage.cs similarity index 100% rename from FrEee/Objects/LogMessages/IPictorialLogMessage.cs rename to FrEee.Core/Objects/LogMessages/IPictorialLogMessage.cs diff --git a/FrEee/Objects/LogMessages/LogMessage.cs b/FrEee.Core/Objects/LogMessages/LogMessage.cs similarity index 100% rename from FrEee/Objects/LogMessages/LogMessage.cs rename to FrEee.Core/Objects/LogMessages/LogMessage.cs diff --git a/FrEee/Objects/LogMessages/PictorialLogMessage.cs b/FrEee.Core/Objects/LogMessages/PictorialLogMessage.cs similarity index 100% rename from FrEee/Objects/LogMessages/PictorialLogMessage.cs rename to FrEee.Core/Objects/LogMessages/PictorialLogMessage.cs diff --git a/FrEee/Objects/SimulatedObjectWrappers.cs b/FrEee.Core/Objects/SimulatedObjectWrappers.cs similarity index 97% rename from FrEee/Objects/SimulatedObjectWrappers.cs rename to FrEee.Core/Objects/SimulatedObjectWrappers.cs index 9c85b5254..394668b7a 100644 --- a/FrEee/Objects/SimulatedObjectWrappers.cs +++ b/FrEee.Core/Objects/SimulatedObjectWrappers.cs @@ -2,8 +2,8 @@ using FrEee.Extensions; using System; using System.Collections.Generic; -using FrEee.Objects.Combat; using FrEee.Objects.Vehicles; +using FrEee.Processes.Combat; namespace FrEee.Objects; diff --git a/FrEee/Objects/Space/AsteroidField.cs b/FrEee.Core/Objects/Space/AsteroidField.cs similarity index 97% rename from FrEee/Objects/Space/AsteroidField.cs rename to FrEee.Core/Objects/Space/AsteroidField.cs index af4b868a1..5d0c03564 100644 --- a/FrEee/Objects/Space/AsteroidField.cs +++ b/FrEee.Core/Objects/Space/AsteroidField.cs @@ -5,7 +5,9 @@ using FrEee.Extensions; using System; using FrEee.Objects.GameState; -using FrEee.Objects.Abilities; +using FrEee.Serialization; +using FrEee.Utility; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Space/Conditions.cs b/FrEee.Core/Objects/Space/Conditions.cs similarity index 100% rename from FrEee/Objects/Space/Conditions.cs rename to FrEee.Core/Objects/Space/Conditions.cs diff --git a/FrEee/Objects/Space/Fleet.cs b/FrEee.Core/Objects/Space/Fleet.cs similarity index 99% rename from FrEee/Objects/Space/Fleet.cs rename to FrEee.Core/Objects/Space/Fleet.cs index 1d12c946c..308c6c42e 100644 --- a/FrEee/Objects/Space/Fleet.cs +++ b/FrEee.Core/Objects/Space/Fleet.cs @@ -1,6 +1,4 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; using FrEee.Objects.Technology; using FrEee.Objects.Vehicles; using FrEee.Modding; @@ -16,6 +14,11 @@ using FrEee.Objects.Civilization.Construction; using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Space/ILocated.cs b/FrEee.Core/Objects/Space/ILocated.cs similarity index 100% rename from FrEee/Objects/Space/ILocated.cs rename to FrEee.Core/Objects/Space/ILocated.cs diff --git a/FrEee/Objects/Space/IMineableSpaceObject.cs b/FrEee.Core/Objects/Space/IMineableSpaceObject.cs similarity index 100% rename from FrEee/Objects/Space/IMineableSpaceObject.cs rename to FrEee.Core/Objects/Space/IMineableSpaceObject.cs diff --git a/FrEee/Objects/Space/IMobileSpaceObject.cs b/FrEee.Core/Objects/Space/IMobileSpaceObject.cs similarity index 97% rename from FrEee/Objects/Space/IMobileSpaceObject.cs rename to FrEee.Core/Objects/Space/IMobileSpaceObject.cs index 4445ac49d..bb8536391 100644 --- a/FrEee/Objects/Space/IMobileSpaceObject.cs +++ b/FrEee.Core/Objects/Space/IMobileSpaceObject.cs @@ -1,7 +1,7 @@ using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; using FrEee.Objects.GameState; using FrEee.Objects.Space; +using FrEee.Processes.Combat; using FrEee.Utility; using System.Collections.Generic; diff --git a/FrEee/Objects/Space/ISpaceObject.cs b/FrEee.Core/Objects/Space/ISpaceObject.cs similarity index 98% rename from FrEee/Objects/Space/ISpaceObject.cs rename to FrEee.Core/Objects/Space/ISpaceObject.cs index b77a49542..9cab8374f 100644 --- a/FrEee/Objects/Space/ISpaceObject.cs +++ b/FrEee.Core/Objects/Space/ISpaceObject.cs @@ -1,4 +1,4 @@ -using FrEee.Objects.Abilities; +using FrEee.Modding.Abilities; using FrEee.Objects.GameState; using FrEee.Serialization; using FrEee.Utility; diff --git a/FrEee/Objects/Space/IStellarObject.cs b/FrEee.Core/Objects/Space/IStellarObject.cs similarity index 96% rename from FrEee/Objects/Space/IStellarObject.cs rename to FrEee.Core/Objects/Space/IStellarObject.cs index d65f6614a..3b20c64b8 100644 --- a/FrEee/Objects/Space/IStellarObject.cs +++ b/FrEee.Core/Objects/Space/IStellarObject.cs @@ -1,5 +1,5 @@ using FrEee.Modding; -using FrEee.Objects.Abilities; +using FrEee.Modding.Abilities; using FrEee.Serialization; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Space/ObjectLocation.cs b/FrEee.Core/Objects/Space/ObjectLocation.cs similarity index 100% rename from FrEee/Objects/Space/ObjectLocation.cs rename to FrEee.Core/Objects/Space/ObjectLocation.cs diff --git a/FrEee/Objects/Space/Planet.cs b/FrEee.Core/Objects/Space/Planet.cs similarity index 99% rename from FrEee/Objects/Space/Planet.cs rename to FrEee.Core/Objects/Space/Planet.cs index 8ad22346a..937da93b0 100644 --- a/FrEee/Objects/Space/Planet.cs +++ b/FrEee.Core/Objects/Space/Planet.cs @@ -1,6 +1,4 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; using FrEee.Objects.Technology; using FrEee.Objects.Vehicles; using FrEee.Modding; @@ -17,6 +15,11 @@ using FrEee.Objects.Civilization.Construction; using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Serialization; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Space/Sector.cs b/FrEee.Core/Objects/Space/Sector.cs similarity index 99% rename from FrEee/Objects/Space/Sector.cs rename to FrEee.Core/Objects/Space/Sector.cs index 535aaeb19..a5a2eb5ed 100644 --- a/FrEee/Objects/Space/Sector.cs +++ b/FrEee.Core/Objects/Space/Sector.cs @@ -1,4 +1,3 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Utility; using FrEee.Serialization; @@ -11,6 +10,9 @@ using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Vehicles; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Space/Star.cs b/FrEee.Core/Objects/Space/Star.cs similarity index 96% rename from FrEee/Objects/Space/Star.cs rename to FrEee.Core/Objects/Space/Star.cs index cc897480d..68ce338e2 100644 --- a/FrEee/Objects/Space/Star.cs +++ b/FrEee.Core/Objects/Space/Star.cs @@ -4,7 +4,9 @@ using FrEee.Extensions; using System; using FrEee.Objects.GameState; -using FrEee.Objects.Abilities; +using FrEee.Serialization; +using FrEee.Utility; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Space/StarSystem.cs b/FrEee.Core/Objects/Space/StarSystem.cs similarity index 99% rename from FrEee/Objects/Space/StarSystem.cs rename to FrEee.Core/Objects/Space/StarSystem.cs index 54b2959b8..ebfcef412 100644 --- a/FrEee/Objects/Space/StarSystem.cs +++ b/FrEee.Core/Objects/Space/StarSystem.cs @@ -3,7 +3,6 @@ using System.Drawing; using System.IO; using System.Linq; -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Modding; using FrEee.Modding.Templates; @@ -11,6 +10,9 @@ using FrEee.Serialization; using FrEee.Extensions; using FrEee.Objects.GameState; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Space/StellarObject.cs b/FrEee.Core/Objects/Space/StellarObject.cs similarity index 98% rename from FrEee/Objects/Space/StellarObject.cs rename to FrEee.Core/Objects/Space/StellarObject.cs index d7b5d62dd..bf9c12005 100644 --- a/FrEee/Objects/Space/StellarObject.cs +++ b/FrEee.Core/Objects/Space/StellarObject.cs @@ -1,4 +1,3 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Modding; using FrEee.Utility; @@ -10,6 +9,9 @@ using System.IO; using FrEee.Objects.Civilization.Construction; using FrEee.Objects.GameState; +using FrEee.Serialization; +using FrEee.Utility; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Space/StellarSize.cs b/FrEee.Core/Objects/Space/StellarSize.cs similarity index 100% rename from FrEee/Objects/Space/StellarSize.cs rename to FrEee.Core/Objects/Space/StellarSize.cs diff --git a/FrEee/Objects/Space/Storm.cs b/FrEee.Core/Objects/Space/Storm.cs similarity index 93% rename from FrEee/Objects/Space/Storm.cs rename to FrEee.Core/Objects/Space/Storm.cs index 459568be9..b1e122b5a 100644 --- a/FrEee/Objects/Space/Storm.cs +++ b/FrEee.Core/Objects/Space/Storm.cs @@ -4,7 +4,9 @@ using FrEee.Extensions; using System; using FrEee.Objects.GameState; -using FrEee.Objects.Abilities; +using FrEee.Serialization; +using FrEee.Utility; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Space/WarpPoint.cs b/FrEee.Core/Objects/Space/WarpPoint.cs similarity index 97% rename from FrEee/Objects/Space/WarpPoint.cs rename to FrEee.Core/Objects/Space/WarpPoint.cs index f6f8b7a7e..b0820a32d 100644 --- a/FrEee/Objects/Space/WarpPoint.cs +++ b/FrEee.Core/Objects/Space/WarpPoint.cs @@ -5,7 +5,9 @@ using System; using System.Linq; using FrEee.Objects.GameState; -using FrEee.Objects.Abilities; +using FrEee.Serialization; +using FrEee.Utility; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Space; diff --git a/FrEee/Objects/Technology/Component.cs b/FrEee.Core/Objects/Technology/Component.cs similarity index 98% rename from FrEee/Objects/Technology/Component.cs rename to FrEee.Core/Objects/Technology/Component.cs index 29de421a3..f07f06e42 100644 --- a/FrEee/Objects/Technology/Component.cs +++ b/FrEee.Core/Objects/Technology/Component.cs @@ -1,6 +1,4 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; +using FrEee.Objects.Civilization; using FrEee.Objects.Space; using FrEee.Modding; using FrEee.Utility; @@ -12,6 +10,10 @@ using System.Linq; using FrEee.Objects.Vehicles; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/ComponentReference.cs b/FrEee.Core/Objects/Technology/ComponentReference.cs similarity index 100% rename from FrEee/Objects/Technology/ComponentReference.cs rename to FrEee.Core/Objects/Technology/ComponentReference.cs diff --git a/FrEee/Objects/Technology/DirectFireWeaponInfo.cs b/FrEee.Core/Objects/Technology/DirectFireWeaponInfo.cs similarity index 93% rename from FrEee/Objects/Technology/DirectFireWeaponInfo.cs rename to FrEee.Core/Objects/Technology/DirectFireWeaponInfo.cs index f641d4271..6715d1699 100644 --- a/FrEee/Objects/Technology/DirectFireWeaponInfo.cs +++ b/FrEee.Core/Objects/Technology/DirectFireWeaponInfo.cs @@ -1,5 +1,5 @@ using FrEee.Modding; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; using System; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/Facility.cs b/FrEee.Core/Objects/Technology/Facility.cs similarity index 98% rename from FrEee/Objects/Technology/Facility.cs rename to FrEee.Core/Objects/Technology/Facility.cs index 4682daf1c..40dfecead 100644 --- a/FrEee/Objects/Technology/Facility.cs +++ b/FrEee.Core/Objects/Technology/Facility.cs @@ -1,6 +1,4 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; +using FrEee.Objects.Civilization; using FrEee.Objects.Space; using FrEee.Modding; using FrEee.Utility; @@ -13,6 +11,11 @@ using FrEee.Objects.Civilization.Construction; using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Serialization; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/FacilityUpgrade.cs b/FrEee.Core/Objects/Technology/FacilityUpgrade.cs similarity index 98% rename from FrEee/Objects/Technology/FacilityUpgrade.cs rename to FrEee.Core/Objects/Technology/FacilityUpgrade.cs index 38b1a50d8..726d8595b 100644 --- a/FrEee/Objects/Technology/FacilityUpgrade.cs +++ b/FrEee.Core/Objects/Technology/FacilityUpgrade.cs @@ -6,6 +6,9 @@ using System.Linq; using FrEee.Objects.Civilization.Construction; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Serialization; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/Hull.cs b/FrEee.Core/Objects/Technology/Hull.cs similarity index 98% rename from FrEee/Objects/Technology/Hull.cs rename to FrEee.Core/Objects/Technology/Hull.cs index 6b9b87463..b87707606 100644 --- a/FrEee/Objects/Technology/Hull.cs +++ b/FrEee.Core/Objects/Technology/Hull.cs @@ -1,5 +1,4 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; +using FrEee.Objects.Civilization; using FrEee.Objects.Vehicles; using FrEee.Modding; using FrEee.Utility; @@ -10,6 +9,8 @@ using System.Drawing; using System.IO; using FrEee.Objects.GameState; +using FrEee.Serialization; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/IHull.cs b/FrEee.Core/Objects/Technology/IHull.cs similarity index 98% rename from FrEee/Objects/Technology/IHull.cs rename to FrEee.Core/Objects/Technology/IHull.cs index b95e522de..0671ccdae 100644 --- a/FrEee/Objects/Technology/IHull.cs +++ b/FrEee.Core/Objects/Technology/IHull.cs @@ -1,10 +1,10 @@ using FrEee.Utility; using System.Collections.Generic; using System.Drawing; -using FrEee.Objects.Abilities; using FrEee.Objects.Vehicles; using FrEee.Objects.GameState; using FrEee.Modding; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/IResearchable.cs b/FrEee.Core/Objects/Technology/IResearchable.cs similarity index 100% rename from FrEee/Objects/Technology/IResearchable.cs rename to FrEee.Core/Objects/Technology/IResearchable.cs diff --git a/FrEee/Objects/Technology/IUpgradeable.cs b/FrEee.Core/Objects/Technology/IUpgradeable.cs similarity index 100% rename from FrEee/Objects/Technology/IUpgradeable.cs rename to FrEee.Core/Objects/Technology/IUpgradeable.cs diff --git a/FrEee/Objects/Technology/Mount.cs b/FrEee.Core/Objects/Technology/Mount.cs similarity index 98% rename from FrEee/Objects/Technology/Mount.cs rename to FrEee.Core/Objects/Technology/Mount.cs index 7f227266b..a9e8d5c73 100644 --- a/FrEee/Objects/Technology/Mount.cs +++ b/FrEee.Core/Objects/Technology/Mount.cs @@ -1,5 +1,4 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; +using FrEee.Objects.Civilization; using FrEee.Modding; using FrEee.Utility; using FrEee.Extensions; @@ -8,7 +7,8 @@ using System.IO; using FrEee.Objects.GameState; using FrEee.Objects.Vehicles; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/MountedComponentTemplate.cs b/FrEee.Core/Objects/Technology/MountedComponentTemplate.cs similarity index 98% rename from FrEee/Objects/Technology/MountedComponentTemplate.cs rename to FrEee.Core/Objects/Technology/MountedComponentTemplate.cs index 0008ecd1b..b356b6e2b 100644 --- a/FrEee/Objects/Technology/MountedComponentTemplate.cs +++ b/FrEee.Core/Objects/Technology/MountedComponentTemplate.cs @@ -1,6 +1,5 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; using FrEee.Objects.Vehicles; using FrEee.Modding; using FrEee.Modding.Templates; @@ -12,6 +11,9 @@ using System.Drawing; using System.Linq; using FrEee.Objects.GameState; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/MountedComponentTemplateContainerPopulator.cs b/FrEee.Core/Objects/Technology/MountedComponentTemplateContainerPopulator.cs similarity index 96% rename from FrEee/Objects/Technology/MountedComponentTemplateContainerPopulator.cs rename to FrEee.Core/Objects/Technology/MountedComponentTemplateContainerPopulator.cs index 00b781501..99ff386db 100644 --- a/FrEee/Objects/Technology/MountedComponentTemplateContainerPopulator.cs +++ b/FrEee.Core/Objects/Technology/MountedComponentTemplateContainerPopulator.cs @@ -2,6 +2,7 @@ using FrEee.Objects.GameState; using FrEee.Objects.Vehicles; using FrEee.Utility; +using FrEee.Utility; namespace FrEee.Objects.Technology; /// diff --git a/FrEee/Objects/Technology/SeekingWeaponInfo.cs b/FrEee.Core/Objects/Technology/SeekingWeaponInfo.cs similarity index 94% rename from FrEee/Objects/Technology/SeekingWeaponInfo.cs rename to FrEee.Core/Objects/Technology/SeekingWeaponInfo.cs index 512e717fd..4dc6aa0ce 100644 --- a/FrEee/Objects/Technology/SeekingWeaponInfo.cs +++ b/FrEee.Core/Objects/Technology/SeekingWeaponInfo.cs @@ -1,5 +1,5 @@ using FrEee.Modding; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; using System; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/Technology.cs b/FrEee.Core/Objects/Technology/Technology.cs similarity index 99% rename from FrEee/Objects/Technology/Technology.cs rename to FrEee.Core/Objects/Technology/Technology.cs index 000f93957..77b035a3f 100644 --- a/FrEee/Objects/Technology/Technology.cs +++ b/FrEee.Core/Objects/Technology/Technology.cs @@ -7,6 +7,7 @@ using System.Drawing; using System.Linq; using FrEee.Objects.GameState; +using FrEee.Utility; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/TechnologyCost.cs b/FrEee.Core/Objects/Technology/TechnologyCost.cs similarity index 100% rename from FrEee/Objects/Technology/TechnologyCost.cs rename to FrEee.Core/Objects/Technology/TechnologyCost.cs diff --git a/FrEee/Objects/Technology/TechnologyRequirement.cs b/FrEee.Core/Objects/Technology/TechnologyRequirement.cs similarity index 98% rename from FrEee/Objects/Technology/TechnologyRequirement.cs rename to FrEee.Core/Objects/Technology/TechnologyRequirement.cs index 863b7ba94..53b6e5934 100644 --- a/FrEee/Objects/Technology/TechnologyRequirement.cs +++ b/FrEee.Core/Objects/Technology/TechnologyRequirement.cs @@ -3,6 +3,7 @@ using FrEee.Serialization; using System; using FrEee.Objects.GameState; +using FrEee.Serialization; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/WarheadWeaponInfo.cs b/FrEee.Core/Objects/Technology/WarheadWeaponInfo.cs similarity index 90% rename from FrEee/Objects/Technology/WarheadWeaponInfo.cs rename to FrEee.Core/Objects/Technology/WarheadWeaponInfo.cs index a66ef90ee..817e47675 100644 --- a/FrEee/Objects/Technology/WarheadWeaponInfo.cs +++ b/FrEee.Core/Objects/Technology/WarheadWeaponInfo.cs @@ -1,5 +1,5 @@ using System; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Technology/WeaponInfo.cs b/FrEee.Core/Objects/Technology/WeaponInfo.cs similarity index 97% rename from FrEee/Objects/Technology/WeaponInfo.cs rename to FrEee.Core/Objects/Technology/WeaponInfo.cs index 4d941ef64..44b42e0f7 100644 --- a/FrEee/Objects/Technology/WeaponInfo.cs +++ b/FrEee.Core/Objects/Technology/WeaponInfo.cs @@ -1,6 +1,6 @@ -using FrEee.Objects.Combat; -using FrEee.Modding; +using FrEee.Modding; using System; +using FrEee.Processes.Combat; namespace FrEee.Objects.Technology; diff --git a/FrEee/Objects/Vehicles/Base.cs b/FrEee.Core/Objects/Vehicles/Base.cs similarity index 95% rename from FrEee/Objects/Vehicles/Base.cs rename to FrEee.Core/Objects/Vehicles/Base.cs index 4d308c852..79abe0274 100644 --- a/FrEee/Objects/Vehicles/Base.cs +++ b/FrEee.Core/Objects/Vehicles/Base.cs @@ -1,4 +1,4 @@ -using FrEee.Objects.Abilities; +using FrEee.Modding.Abilities; using FrEee.Objects.Space; using System; diff --git a/FrEee/Objects/Vehicles/Design.cs b/FrEee.Core/Objects/Vehicles/Design.cs similarity index 99% rename from FrEee/Objects/Vehicles/Design.cs rename to FrEee.Core/Objects/Vehicles/Design.cs index 7f6373b3a..69663e77a 100644 --- a/FrEee/Objects/Vehicles/Design.cs +++ b/FrEee.Core/Objects/Vehicles/Design.cs @@ -1,4 +1,3 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Objects.Commands; using FrEee.Objects.Technology; @@ -16,6 +15,9 @@ using FrEee.Objects.Civilization.Orders; using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/Drone.cs b/FrEee.Core/Objects/Vehicles/Drone.cs similarity index 95% rename from FrEee/Objects/Vehicles/Drone.cs rename to FrEee.Core/Objects/Vehicles/Drone.cs index 6e963470f..06fa4aa10 100644 --- a/FrEee/Objects/Vehicles/Drone.cs +++ b/FrEee.Core/Objects/Vehicles/Drone.cs @@ -4,8 +4,8 @@ using FrEee.Objects.Space; using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.GameState; -using FrEee.Objects.Abilities; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/Fighter.cs b/FrEee.Core/Objects/Vehicles/Fighter.cs similarity index 94% rename from FrEee/Objects/Vehicles/Fighter.cs rename to FrEee.Core/Objects/Vehicles/Fighter.cs index 811a0686e..85930c448 100644 --- a/FrEee/Objects/Vehicles/Fighter.cs +++ b/FrEee.Core/Objects/Vehicles/Fighter.cs @@ -5,8 +5,9 @@ using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Space; using FrEee.Objects.GameState; -using FrEee.Objects.Abilities; -using FrEee.Objects.Combat; +using FrEee.Serialization; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/IDesign.cs b/FrEee.Core/Objects/Vehicles/IDesign.cs similarity index 99% rename from FrEee/Objects/Vehicles/IDesign.cs rename to FrEee.Core/Objects/Vehicles/IDesign.cs index cc5c71611..27bc2546f 100644 --- a/FrEee/Objects/Vehicles/IDesign.cs +++ b/FrEee.Core/Objects/Vehicles/IDesign.cs @@ -3,11 +3,11 @@ using FrEee.Modding.Templates; using FrEee.Utility; using System.Collections.Generic; -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization.Construction; using FrEee.Objects.Commands; using FrEee.Serialization; using FrEee.Objects.GameState; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/IUnit.cs b/FrEee.Core/Objects/Vehicles/IUnit.cs similarity index 100% rename from FrEee/Objects/Vehicles/IUnit.cs rename to FrEee.Core/Objects/Vehicles/IUnit.cs diff --git a/FrEee/Objects/Vehicles/IVehicle.cs b/FrEee.Core/Objects/Vehicles/IVehicle.cs similarity index 90% rename from FrEee/Objects/Vehicles/IVehicle.cs rename to FrEee.Core/Objects/Vehicles/IVehicle.cs index c7f709b86..17033bb51 100644 --- a/FrEee/Objects/Vehicles/IVehicle.cs +++ b/FrEee.Core/Objects/Vehicles/IVehicle.cs @@ -1,12 +1,14 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Objects.Civilization.Construction; using FrEee.Objects.Civilization.Orders; -using FrEee.Objects.Combat; using FrEee.Objects.Technology; using FrEee.Serialization; using FrEee.Utility; using System.Collections.Generic; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/MajorSpaceVehicle.cs b/FrEee.Core/Objects/Vehicles/MajorSpaceVehicle.cs similarity index 99% rename from FrEee/Objects/Vehicles/MajorSpaceVehicle.cs rename to FrEee.Core/Objects/Vehicles/MajorSpaceVehicle.cs index 1c0739516..92422bcb0 100644 --- a/FrEee/Objects/Vehicles/MajorSpaceVehicle.cs +++ b/FrEee.Core/Objects/Vehicles/MajorSpaceVehicle.cs @@ -8,7 +8,7 @@ using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Civilization.Construction; using FrEee.Objects.GameState; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/Mine.cs b/FrEee.Core/Objects/Vehicles/Mine.cs similarity index 95% rename from FrEee/Objects/Vehicles/Mine.cs rename to FrEee.Core/Objects/Vehicles/Mine.cs index 1e2b7eb07..7c532aaed 100644 --- a/FrEee/Objects/Vehicles/Mine.cs +++ b/FrEee.Core/Objects/Vehicles/Mine.cs @@ -1,10 +1,10 @@ using FrEee.Extensions; -using FrEee.Objects.Abilities; +using FrEee.Modding.Abilities; using FrEee.Objects.Civilization; using FrEee.Objects.Civilization.CargoStorage; -using FrEee.Objects.Combat; using FrEee.Objects.GameState; using FrEee.Objects.Space; +using FrEee.Processes.Combat; using System; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/Satellite.cs b/FrEee.Core/Objects/Vehicles/Satellite.cs similarity index 95% rename from FrEee/Objects/Vehicles/Satellite.cs rename to FrEee.Core/Objects/Vehicles/Satellite.cs index 641d579a9..760f662a8 100644 --- a/FrEee/Objects/Vehicles/Satellite.cs +++ b/FrEee.Core/Objects/Vehicles/Satellite.cs @@ -4,8 +4,8 @@ using FrEee.Objects.Space; using FrEee.Objects.GameState; using FrEee.Objects.Civilization.CargoStorage; -using FrEee.Objects.Abilities; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/Ship.cs b/FrEee.Core/Objects/Vehicles/Ship.cs similarity index 89% rename from FrEee/Objects/Vehicles/Ship.cs rename to FrEee.Core/Objects/Vehicles/Ship.cs index 099a902a5..6763ec1be 100644 --- a/FrEee/Objects/Vehicles/Ship.cs +++ b/FrEee.Core/Objects/Vehicles/Ship.cs @@ -1,5 +1,5 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Combat; +using FrEee.Modding.Abilities; +using FrEee.Processes.Combat; using System; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/SpaceVehicle.cs b/FrEee.Core/Objects/Vehicles/SpaceVehicle.cs similarity index 98% rename from FrEee/Objects/Vehicles/SpaceVehicle.cs rename to FrEee.Core/Objects/Vehicles/SpaceVehicle.cs index 88bead052..5972513a8 100644 --- a/FrEee/Objects/Vehicles/SpaceVehicle.cs +++ b/FrEee.Core/Objects/Vehicles/SpaceVehicle.cs @@ -7,9 +7,12 @@ using System; using System.Collections.Generic; using System.Linq; -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/Troop.cs b/FrEee.Core/Objects/Vehicles/Troop.cs similarity index 96% rename from FrEee/Objects/Vehicles/Troop.cs rename to FrEee.Core/Objects/Vehicles/Troop.cs index 0f61ae59a..5d3acd63b 100644 --- a/FrEee/Objects/Vehicles/Troop.cs +++ b/FrEee.Core/Objects/Vehicles/Troop.cs @@ -5,10 +5,11 @@ using System; using System.Collections.Generic; using System.Linq; -using FrEee.Objects.Abilities; using FrEee.Objects.GameState; using FrEee.Objects.Civilization.CargoStorage; -using FrEee.Objects.Combat; +using FrEee.Serialization; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/Vehicle.cs b/FrEee.Core/Objects/Vehicles/Vehicle.cs similarity index 99% rename from FrEee/Objects/Vehicles/Vehicle.cs rename to FrEee.Core/Objects/Vehicles/Vehicle.cs index 5762f50f6..e1b0fb039 100644 --- a/FrEee/Objects/Vehicles/Vehicle.cs +++ b/FrEee.Core/Objects/Vehicles/Vehicle.cs @@ -2,9 +2,7 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; using FrEee.Objects.Space; using FrEee.Objects.Technology; using FrEee.Modding; @@ -15,6 +13,11 @@ using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; using FrEee.Objects.Civilization.CargoStorage; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/Vehicles/VehicleTypes.cs b/FrEee.Core/Objects/Vehicles/VehicleTypes.cs similarity index 97% rename from FrEee/Objects/Vehicles/VehicleTypes.cs rename to FrEee.Core/Objects/Vehicles/VehicleTypes.cs index a49b0cd0c..64683b3a1 100644 --- a/FrEee/Objects/Vehicles/VehicleTypes.cs +++ b/FrEee.Core/Objects/Vehicles/VehicleTypes.cs @@ -1,5 +1,6 @@ using System; using FrEee.Utility; +using FrEee.Utility; namespace FrEee.Objects.Vehicles; /// diff --git a/FrEee/Objects/Vehicles/WeaponPlatform.cs b/FrEee.Core/Objects/Vehicles/WeaponPlatform.cs similarity index 96% rename from FrEee/Objects/Vehicles/WeaponPlatform.cs rename to FrEee.Core/Objects/Vehicles/WeaponPlatform.cs index 090039e55..6241f8fcc 100644 --- a/FrEee/Objects/Vehicles/WeaponPlatform.cs +++ b/FrEee.Core/Objects/Vehicles/WeaponPlatform.cs @@ -4,10 +4,11 @@ using FrEee.Extensions; using System; using System.Collections.Generic; -using FrEee.Objects.Abilities; using FrEee.Objects.GameState; using FrEee.Objects.Civilization.CargoStorage; -using FrEee.Objects.Combat; +using FrEee.Serialization; +using FrEee.Processes.Combat; +using FrEee.Modding.Abilities; namespace FrEee.Objects.Vehicles; diff --git a/FrEee/Objects/VictoryConditions/IVictoryCondition.cs b/FrEee.Core/Objects/VictoryConditions/IVictoryCondition.cs similarity index 100% rename from FrEee/Objects/VictoryConditions/IVictoryCondition.cs rename to FrEee.Core/Objects/VictoryConditions/IVictoryCondition.cs diff --git a/FrEee/Objects/VictoryConditions/MajorEmpireEliminationVictoryCondition.cs b/FrEee.Core/Objects/VictoryConditions/MajorEmpireEliminationVictoryCondition.cs similarity index 100% rename from FrEee/Objects/VictoryConditions/MajorEmpireEliminationVictoryCondition.cs rename to FrEee.Core/Objects/VictoryConditions/MajorEmpireEliminationVictoryCondition.cs diff --git a/FrEee/Objects/VictoryConditions/PeaceVictoryCondition.cs b/FrEee.Core/Objects/VictoryConditions/PeaceVictoryCondition.cs similarity index 100% rename from FrEee/Objects/VictoryConditions/PeaceVictoryCondition.cs rename to FrEee.Core/Objects/VictoryConditions/PeaceVictoryCondition.cs diff --git a/FrEee/Objects/VictoryConditions/ScorePercentageVictoryCondition.cs b/FrEee.Core/Objects/VictoryConditions/ScorePercentageVictoryCondition.cs similarity index 100% rename from FrEee/Objects/VictoryConditions/ScorePercentageVictoryCondition.cs rename to FrEee.Core/Objects/VictoryConditions/ScorePercentageVictoryCondition.cs diff --git a/FrEee/Objects/VictoryConditions/ScoreVictoryCondition.cs b/FrEee.Core/Objects/VictoryConditions/ScoreVictoryCondition.cs similarity index 100% rename from FrEee/Objects/VictoryConditions/ScoreVictoryCondition.cs rename to FrEee.Core/Objects/VictoryConditions/ScoreVictoryCondition.cs diff --git a/FrEee/Objects/VictoryConditions/SurvivalVictoryCondition.cs b/FrEee.Core/Objects/VictoryConditions/SurvivalVictoryCondition.cs similarity index 100% rename from FrEee/Objects/VictoryConditions/SurvivalVictoryCondition.cs rename to FrEee.Core/Objects/VictoryConditions/SurvivalVictoryCondition.cs diff --git a/FrEee/Objects/VictoryConditions/TechnologyVictoryCondition.cs b/FrEee.Core/Objects/VictoryConditions/TechnologyVictoryCondition.cs similarity index 100% rename from FrEee/Objects/VictoryConditions/TechnologyVictoryCondition.cs rename to FrEee.Core/Objects/VictoryConditions/TechnologyVictoryCondition.cs diff --git a/FrEee/Objects/VictoryConditions/TotalEliminationVictoryCondition.cs b/FrEee.Core/Objects/VictoryConditions/TotalEliminationVictoryCondition.cs similarity index 100% rename from FrEee/Objects/VictoryConditions/TotalEliminationVictoryCondition.cs rename to FrEee.Core/Objects/VictoryConditions/TotalEliminationVictoryCondition.cs diff --git a/FrEee.Core/Processes/AI/AI.cs b/FrEee.Core/Processes/AI/AI.cs new file mode 100644 index 000000000..9afde8b36 --- /dev/null +++ b/FrEee.Core/Processes/AI/AI.cs @@ -0,0 +1,73 @@ +using FrEee.Modding; +using FrEee.Modding.Scripts; +using FrEee.Utility; +using System; +using System.Collections.Generic; +using FrEee.Utility; + +namespace FrEee.Processes.AI; + +/// +/// An AI script which has control over a domain. +/// +/// The type of domain. +/// The type of contextual data that the AI needs to be aware of. +[Serializable] +public abstract class AI : IModObject +{ + public AI(string name, IScript script, SafeDictionary> ministerNames) + { + Name = name; + Script = script; + MinisterNames = ministerNames; + } + + public bool IsDisposed { get; private set; } + + /// + /// The names of any ministers that the AI can use, keyed by category. + /// + public SafeDictionary> MinisterNames { get; private set; } + + + public string ModID { get; set; } + + public string Name + { + get; + private set; + } + + /// + /// The script to run. + /// + public IScript Script { get; protected set; } + + /// + /// Parameters from the mod meta templates. + /// + public IDictionary TemplateParameters { get; set; } + + /// + /// Allows the AI to act on its domain using information from its context. + /// + /// The AI's domain of control. + /// Contextual data that the AI needs to be aware of. + /// The names of any ministers that the player has enabled, keyed by category. + public abstract void Act(TDomain domain, TContext context, SafeDictionary> enabledMinisters); + + + public void Dispose() + { + // TODO - remove from mod? + IsDisposed = true; + } + + public override string ToString() + { + return Name; + } + + + +} \ No newline at end of file diff --git a/FrEee.Core/Processes/AI/CSAI.cs b/FrEee.Core/Processes/AI/CSAI.cs new file mode 100644 index 000000000..99c990948 --- /dev/null +++ b/FrEee.Core/Processes/AI/CSAI.cs @@ -0,0 +1,65 @@ +using FrEee.Objects.Civilization; +using FrEee.Modding; +using FrEee.Utility; +using Microsoft.CodeAnalysis.Scripting; +using System; +using System.Collections.Generic; +using FrEee.Objects.GameState; +using FrEee.Utility; + +namespace FrEee.Processes.AI; + +[Serializable] +public class CSAI : AI where TDomain : Empire where TContext : Galaxy +{ + public CSAI(string name, CSScript script, SafeDictionary> ministerNames) + : base(name, script, ministerNames) + { + ScriptRunner = script.CreateScriptObject(); + } + + + /// + /// The object that holds a cs script within memory. + /// + public ScriptRunner ScriptRunner; + + public override void Act(TDomain domain, TContext context, SafeDictionary> EnabledMinisters) + { + try + { + //NOTE: this really should be run as its own seperate program, passing information back and forth. + // Reason being, there is nothing to stop a script from doing things like creating files. + //This means it is a security risk to run scripts as mods are usually done so. + // By running in a seperate process, it can be sandboxed by the system, limiting its rights. + //however, such is a lot more intensive than this. + var global = new Globals() { Context = context, Domain = domain, EnabledMinisters = EnabledMinisters }; + + var task = ScriptRunner.Invoke(globals: global); + + task.Wait(); + var result = task.Result; + if (result != null) + domain = result; + + } + catch (Exception) + { + throw; + //error log? + } + } +} + + +/// +/// Local class containing the tdomain and tcontext. +/// +public class Globals +{ + public Empire Domain; + + public Galaxy Context; + + public SafeDictionary> EnabledMinisters; +} diff --git a/FrEee.Core/Processes/AI/PythonAI.cs b/FrEee.Core/Processes/AI/PythonAI.cs new file mode 100644 index 000000000..82394109a --- /dev/null +++ b/FrEee.Core/Processes/AI/PythonAI.cs @@ -0,0 +1,27 @@ +using FrEee.Modding; +using FrEee.Utility; +using System; +using System.Collections.Generic; +using FrEee.Utility; + +namespace FrEee.Processes.AI; + +[Serializable] +public class PythonAI : AI +{ + public PythonAI(string name, PythonScript script, SafeDictionary> ministerNames) : base(name, script, ministerNames) + { + } + + public override void Act(TDomain domain, TContext context, SafeDictionary> EnabledMinisters) + { + + var variables = new Dictionary(); + variables.Add("domain", domain); + var readOnlyVariables = new Dictionary(); + readOnlyVariables.Add("context", context); + readOnlyVariables.Add("enabledMinisters", EnabledMinisters); + PythonScriptEngine.RunScript(Script as PythonScript, variables, readOnlyVariables); + + } +} diff --git a/FrEee.Core/Processes/Combat/BeamWeaponDisplayEffect.cs b/FrEee.Core/Processes/Combat/BeamWeaponDisplayEffect.cs new file mode 100644 index 000000000..9228716ca --- /dev/null +++ b/FrEee.Core/Processes/Combat/BeamWeaponDisplayEffect.cs @@ -0,0 +1,38 @@ +using System; +using System.Drawing; + +namespace FrEee.Processes.Combat; + +[Serializable] +public class BeamWeaponDisplayEffect : WeaponDisplayEffect +{ + public BeamWeaponDisplayEffect(string name) + : base(name) + { + } + + public override Point GlobalSpriteOffset + { + get { return new Point(); } + } + + public override string GlobalSpriteSheetName + { + get { return "Beams"; } + } + + public override Point ShipsetSpriteOffset + { + get { return new Point(); } + } + + public override string ShipsetSpriteSheetName + { + get { return "Beams"; } + } + + public override Size SpriteSize + { + get { return new Size(20, 20); } + } +} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Combat2/Battle_Space.cs b/FrEee.Core/Processes/Combat/Combat2/Battle_Space.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/Battle_Space.cs rename to FrEee.Core/Processes/Combat/Combat2/Battle_Space.cs diff --git a/FrEee/Objects/Combat/Combat2/CombatPlanet.cs b/FrEee.Core/Processes/Combat/Combat2/CombatPlanet.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/CombatPlanet.cs rename to FrEee.Core/Processes/Combat/Combat2/CombatPlanet.cs diff --git a/FrEee/Objects/Combat/Combat2/CombatReplayLog.cs b/FrEee.Core/Processes/Combat/Combat2/CombatReplayLog.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/CombatReplayLog.cs rename to FrEee.Core/Processes/Combat/Combat2/CombatReplayLog.cs diff --git a/FrEee/Objects/Combat/Combat2/CombatSeeker.cs b/FrEee.Core/Processes/Combat/Combat2/CombatSeeker.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/CombatSeeker.cs rename to FrEee.Core/Processes/Combat/Combat2/CombatSeeker.cs diff --git a/FrEee/Objects/Combat/Combat2/CombatShot.cs b/FrEee.Core/Processes/Combat/Combat2/CombatShot.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/CombatShot.cs rename to FrEee.Core/Processes/Combat/Combat2/CombatShot.cs diff --git a/FrEee/Objects/Combat/Combat2/CombatVehicle.cs b/FrEee.Core/Processes/Combat/Combat2/CombatVehicle.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/CombatVehicle.cs rename to FrEee.Core/Processes/Combat/Combat2/CombatVehicle.cs diff --git a/FrEee/Objects/Combat/Combat2/CombatWeapon.cs b/FrEee.Core/Processes/Combat/Combat2/CombatWeapon.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/CombatWeapon.cs rename to FrEee.Core/Processes/Combat/Combat2/CombatWeapon.cs diff --git a/FrEee/Objects/Combat/Combat2/ControlledCombatObject.cs b/FrEee.Core/Processes/Combat/Combat2/ControlledCombatObject.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/ControlledCombatObject.cs rename to FrEee.Core/Processes/Combat/Combat2/ControlledCombatObject.cs diff --git a/FrEee/Objects/Combat/Combat2/StrategyBlocks.cs b/FrEee.Core/Processes/Combat/Combat2/StrategyBlocks.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/StrategyBlocks.cs rename to FrEee.Core/Processes/Combat/Combat2/StrategyBlocks.cs diff --git a/FrEee/Objects/Combat/Combat2/StrategyObject.cs b/FrEee.Core/Processes/Combat/Combat2/StrategyObject.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/StrategyObject.cs rename to FrEee.Core/Processes/Combat/Combat2/StrategyObject.cs diff --git a/FrEee/Objects/Combat/Combat2/Tactics/Tactic.cs b/FrEee.Core/Processes/Combat/Combat2/Tactics/Tactic.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/Tactics/Tactic.cs rename to FrEee.Core/Processes/Combat/Combat2/Tactics/Tactic.cs diff --git a/FrEee/Objects/Combat/Combat2/Tactics/TacticBlock.cs b/FrEee.Core/Processes/Combat/Combat2/Tactics/TacticBlock.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/Tactics/TacticBlock.cs rename to FrEee.Core/Processes/Combat/Combat2/Tactics/TacticBlock.cs diff --git a/FrEee/Objects/Combat/Combat2/Tactics/TacticNode.cs b/FrEee.Core/Processes/Combat/Combat2/Tactics/TacticNode.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/Tactics/TacticNode.cs rename to FrEee.Core/Processes/Combat/Combat2/Tactics/TacticNode.cs diff --git a/FrEee/Objects/Combat/Combat2/combatObjects.cs b/FrEee.Core/Processes/Combat/Combat2/combatObjects.cs similarity index 100% rename from FrEee/Objects/Combat/Combat2/combatObjects.cs rename to FrEee.Core/Processes/Combat/Combat2/combatObjects.cs diff --git a/FrEee/Objects/Combat/Combat2/lib/FixMath.dll b/FrEee.Core/Processes/Combat/Combat2/lib/FixMath.dll similarity index 100% rename from FrEee/Objects/Combat/Combat2/lib/FixMath.dll rename to FrEee.Core/Processes/Combat/Combat2/lib/FixMath.dll diff --git a/FrEee/Objects/Combat/Combat2/lib/FixMath.pdb b/FrEee.Core/Processes/Combat/Combat2/lib/FixMath.pdb similarity index 100% rename from FrEee/Objects/Combat/Combat2/lib/FixMath.pdb rename to FrEee.Core/Processes/Combat/Combat2/lib/FixMath.pdb diff --git a/FrEee/Objects/Combat/Combat2/lib/NewtMath.dll b/FrEee.Core/Processes/Combat/Combat2/lib/NewtMath.dll similarity index 100% rename from FrEee/Objects/Combat/Combat2/lib/NewtMath.dll rename to FrEee.Core/Processes/Combat/Combat2/lib/NewtMath.dll diff --git a/FrEee/Objects/Combat/Combat2/lib/NewtMath.pdb b/FrEee.Core/Processes/Combat/Combat2/lib/NewtMath.pdb similarity index 100% rename from FrEee/Objects/Combat/Combat2/lib/NewtMath.pdb rename to FrEee.Core/Processes/Combat/Combat2/lib/NewtMath.pdb diff --git a/FrEee/Objects/Combat/Combat2/lib/nunit.framework.dll b/FrEee.Core/Processes/Combat/Combat2/lib/nunit.framework.dll similarity index 100% rename from FrEee/Objects/Combat/Combat2/lib/nunit.framework.dll rename to FrEee.Core/Processes/Combat/Combat2/lib/nunit.framework.dll diff --git a/FrEee/Objects/Combat/Combat2/lib/nunit.framework.xml b/FrEee.Core/Processes/Combat/Combat2/lib/nunit.framework.xml similarity index 100% rename from FrEee/Objects/Combat/Combat2/lib/nunit.framework.xml rename to FrEee.Core/Processes/Combat/Combat2/lib/nunit.framework.xml diff --git a/FrEee.Core/Processes/Combat/Grid/Battle.cs b/FrEee.Core/Processes/Combat/Grid/Battle.cs new file mode 100644 index 000000000..942bac214 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/Battle.cs @@ -0,0 +1,761 @@ +using FrEee.Objects.Civilization; +using FrEee.Objects.LogMessages; +using FrEee.Objects.Space; +using FrEee.Objects.Technology; +using FrEee.Objects.Vehicles; +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using static System.Math; +using FrEee.Objects.Civilization.CargoStorage; +using FrEee.Objects.GameState; + +namespace FrEee.Processes.Combat.Grid; + +public abstract class Battle : IBattle, IDisposable +{ + static Battle() + { + Current = new HashSet(); + Previous = new HashSet(); + } + + public Battle() + { + Log = new List(); + + double stardate = Galaxy.Current.Timestamp; + Timestamp = stardate; + } + + /// + /// Any battles that are currently ongoing. + /// This is a collection so we can multithread battle resolution if so desired. + /// + public static ICollection Current { get; private set; } + + /// + /// Any battles that have completed this turn. + /// + public static ICollection Previous { get; private set; } + + /// + /// The combatants in this battle. + /// + public ISet Combatants { get; protected set; } + + /// + /// Copies of the combatants from the start of the battle. + /// + public IDictionary StartCombatants { get; private set; } = new SafeDictionary(); + + /// + /// Copies of the combatants from the end of the battle. + /// + public IDictionary EndCombatants { get; private set; } = new SafeDictionary(); + + /// + /// Starting HP of all combatants. + /// + [Obsolete("OriginalHitpoints is obsolete, use StartCombatants.")] + // TODO - remove after games are over + public SafeDictionary OriginalHitpoints { get; private set; } = new SafeDictionary(); + + /// + /// Who originally owned each combatant? + /// + [Obsolete("OriginalOwners is obsolete, use StartCombatants.")] + // TODO - remove after games are over + public SafeDictionary OriginalOwners { get; private set; } = new SafeDictionary(); + + /// + /// Who launched each unit? So we can recover them after combat. + /// + [DoNotSerialize(false)] + private SafeDictionary Launchers { get; set; } = new SafeDictionary(); + + /// + /// Saved-up fractional combat speed from the previous round. + /// + [DoNotSerialize(false)] + public SafeDictionary CombatSpeedBuffer { get; private set; } = new SafeDictionary(); + + /// + /// The percentage of normal damage that weapons inflict. + /// + public abstract int DamagePercentage { get; } + + public PRNG Dice { get; set; } + + /// + /// The number of rounds this battle lasted. + /// + public int Duration => Events.Count; + + /// + /// The empires engaged in battle. + /// + public IEnumerable Empires { get; protected set; } + + public List> Events + { + get; private set; + } + + public Image Icon + { + get { return Combatants.OfType().Largest()?.Icon; } + } + + public Image Icon32 => Icon.Resize(32); + + public IEnumerable IconPaths + { + get + { + return Combatants.OfType().Largest()?.IconPaths ?? Enumerable.Empty(); + } + } + + private SafeDictionary DistancesToTargets { get; } = new SafeDictionary(); + + private SafeDictionary> IgnoredTargets { get; } = new SafeDictionary>(true); + + public IList Log { get; private set; } + + public IList> LowerRight { get; private set; } = new List>(); + + public abstract int MaxRounds { get; } + + /// + /// The name of the battle. Battles are typicaly named after their location. + /// + public abstract string Name { get; } + + public Image Portrait + { + get { return Combatants.OfType().Largest()?.Portrait; } + } + + public IEnumerable PortraitPaths + { + get + { + return Combatants.OfType().Largest()?.PortraitPaths ?? Enumerable.Empty(); + } + } + + /// + /// The sector in which this battle took place. + /// + public Sector Sector { get; set; } + + /// + /// The star system in which this battle took place. + /// + public StarSystem StarSystem { get { return Sector.StarSystem; } } + + public double Timestamp { get; private set; } + + public IList> UpperLeft { get; private set; } = new List>(); + + public int GetDiameter(int round) + { + return UpperLeft[round].DistanceToEightWay(LowerRight[round]) + 1; + } + + public virtual void Initialize(IEnumerable combatants) + { + Combatants = combatants.ToHashSet(); + StartCombatants = combatants.Select(c => new { c.ID, Copy = c.CopyAndAssignNewID() }).ToDictionary(q => q.ID, q => q.Copy); + } + + public abstract void PlaceCombatants(SafeDictionary> locations); + + /// + /// Resolves the battle. + /// + public void Resolve() + { + // update memories + foreach (var sobj in StarSystem.SpaceObjects.Where(x => !x.IsMemory).ToArray()) + sobj.UpdateEmpireMemories(); + + Current.Add(this); + + var reloads = new SafeDictionary(); + var locations = new SafeDictionary>(); + + PlaceCombatants(locations); + + Events = new List>(); + + UpdateBounds(0, locations.Values); + + // let all combatants scan each other + foreach (var c in Combatants) + c.UpdateEmpireMemories(); + + // make a query so we can check who's alive + var alives = Combatants.Where(q => q.IsAlive); + + for (int i = 0; i < MaxRounds; i++) + { + var combatSpeeds = new SafeDictionary(); + var multiplex = new SafeDictionary>(true); + foreach (var c in Combatants) + combatSpeeds[c] = c.CombatSpeed; + + int GetCombatSpeedThisRound(ICombatant c) + { + return (int)(combatSpeeds[c] + CombatSpeedBuffer[c]); + } + + Events.Add(new List()); + + if (i == 0) + { + // first round, all combatants appear + foreach (var c in Combatants) + Events.Last().Add(new CombatantAppearsEvent(this, c, locations[c])); + } + + var turnorder = alives.OrderBy(x => x is Seeker ? 1 : 0).ThenBy(x => combatSpeeds[x]).ThenShuffle(Dice).ToArray(); + + // phase 0: reload weapons + foreach (var w in turnorder.SelectMany(q => q.Weapons)) + { + reloads[w]--; + if (reloads[w] < 0) + reloads[w] = 0; + } + + // phase 1: combatants move starting with the slowest (so the faster ships get to react to their moves) - but seekers go last so they get a chance to hit + foreach (var c in turnorder) + { + var oldpos = locations[c]; + if (c is Seeker s) + { + if (locations[s] == null) + continue; // HACK - seeker is destroyed but still showing up in turn order + if (locations[s.Target] == null) + { + s.Hitpoints = 0; // seekers self destruct when their target is destroyed + Events.Last().Add(new CombatantDestroyedEvent(this, s, locations[s])); + continue; + } + s.DistanceTraveled += Min(GetCombatSpeedThisRound(c), locations[s].DistanceToEightWay(locations[s.Target])); + locations[s] = Vector2.InterpolateEightWay(locations[s], locations[s.Target], GetCombatSpeedThisRound(c)); + if (s.DistanceTraveled > s.WeaponInfo.MaxRange) + { + s.Hitpoints = 0; + Events.Last().Add(new CombatantDestroyedEvent(this, s, locations[s])); + } + } + else + { + // TODO - both pursue target and evade scary enemies at the same time using heatmap + // find out how good each target is + var targetiness = new SafeDictionary(); + foreach (var target in alives.Where(x => + c.IsHostileTo(x.Owner) && + (c.CanTarget(x) || x is Planet && c is ICargoContainer cc && cc.Cargo.Units.OfType().Any()))) + { + targetiness[target] = 1d / (locations[target] - locations[c]).LengthEightWay; + } + + if (!targetiness.Any()) + { + // evade enemies + var heatmap = new HeatMap(); + foreach (var e in alives.Where(x => x.IsHostileTo(c.Owner) && x.CanTarget(c))) + { + int threat; + if (e.Weapons.Any()) + threat = GetCombatSpeedThisRound(e) + e.Weapons.Where(w => w.CanTarget(c)).Max(w => w.Template.WeaponMaxRange); + else + threat = 0; + heatmap.AddLinearGradientEightWay(locations[e], threat, threat, -1); + } + if (c.FillsCombatTile) + { + // only one ship/base/planet per tile + foreach (var tile in heatmap.ToArray()) + { + if (locations.Any(q => q.Key.FillsCombatTile && q.Value == tile.Key)) + heatmap.Remove(tile.Key); + } + } + if (heatmap.Any()) + locations[c] = heatmap.FindMin(locations[c], GetCombatSpeedThisRound(c)); + } + else + { + // move to max range that we can inflict max damage on best target + var goodTargets = targetiness.Where(x => !IgnoredTargets[c].Contains(x.Key)).WithMax(x => x.Value); + ICombatant bestTarget = null; + if (goodTargets.Any()) + bestTarget = goodTargets.First().Key; + if (bestTarget == null) + { + // try previously ignored targets + IgnoredTargets[c].Clear(); + goodTargets = targetiness.Where(x => !IgnoredTargets[c].Contains(x.Key)).WithMax(x => x.Value); + if (goodTargets.Any()) + bestTarget = goodTargets.First().Key; + } + if (bestTarget != null) + { + gotosAreEvil: + var maxdmg = 0; + var maxdmgrange = 0; + if (c.Weapons.Any()) + { + for (var range = 0; range < c.Weapons.Max(w => w.Template.WeaponMaxRange); range++) + { + var dmg = c.Weapons.Where(w => w.CanTarget(bestTarget)).Sum(w => w.Template.GetWeaponDamage(range)); + if (dmg >= maxdmg) + { + maxdmg = dmg; + maxdmgrange = range; + } + } + } + if (c.Weapons.Any(w => w.Template.ComponentTemplate.WeaponInfo.IsSeeker) + && locations[c].DistanceToEightWay(locations[bestTarget]) > DistancesToTargets[c]) + { + // adjust desired range due to seeker speed and target speed if retreating + var roundsToClose = c.Weapons.Where(w => w.Template.ComponentTemplate.WeaponInfo.IsSeeker).Max(w => + (int)Ceiling(w.Template.WeaponMaxRange / (double)(w.Template.ComponentTemplate.WeaponInfo as SeekingWeaponInfo).SeekerSpeed)); + var distanceAdjustment = (int)Ceiling(combatSpeeds[bestTarget] * roundsToClose); + maxdmgrange -= distanceAdjustment; + if (maxdmgrange < 0) + maxdmgrange = 0; + } + var targetPos = locations[bestTarget]; + var tiles = new HashSet>(); + for (var x = targetPos.X - maxdmgrange; x <= targetPos.X + maxdmgrange; x++) + { + tiles.Add(new Vector2(x, targetPos.Y - maxdmgrange)); + tiles.Add(new Vector2(x, targetPos.Y + maxdmgrange)); + } + for (var y = targetPos.Y - maxdmgrange; y <= targetPos.Y + maxdmgrange; y++) + { + tiles.Add(new Vector2(targetPos.X - maxdmgrange, y)); + tiles.Add(new Vector2(targetPos.X + maxdmgrange, y)); + } + if (c.FillsCombatTile) + { + foreach (var tile in tiles.ToArray()) + { + if (locations.Any(q => q.Key.FillsCombatTile && q.Value == tile)) + tiles.Remove(tile); + } + } + if (tiles.Any()) + { + var closest = tiles.WithMin(t => t.DistanceToEightWay(locations[c])).First(); + locations[c] = Vector2.InterpolateEightWay(locations[c], closest, GetCombatSpeedThisRound(c), vec => locations.Values.Contains(vec)); + var newdist = locations[c].DistanceToEightWay(locations[bestTarget]); + if (DistancesToTargets.ContainsKey(c) && newdist >= DistancesToTargets[c] && combatSpeeds[c] <= combatSpeeds[bestTarget] && !c.Weapons.Any(w => w.Template.WeaponMaxRange >= newdist)) + { + DistancesToTargets.Remove(c); + IgnoredTargets[c].Add(bestTarget); // can't catch it, might as well find a new target + goodTargets = targetiness.Where(x => !IgnoredTargets[c].Contains(x.Key)).WithMax(x => x.Value); + bestTarget = null; + if (goodTargets.Any()) + bestTarget = goodTargets.First().Key; + if (bestTarget == null) + goto gotosAreVeryEvil; + goto gotosAreEvil; + } + else + DistancesToTargets[c] = newdist; + } + } + else + DistancesToTargets.Remove(c); + } + } + gotosAreVeryEvil: + if (locations[c] != oldpos) + Events.Last().Add(new CombatantMovesEvent(this, c, oldpos, locations[c])); + } + + UpdateBounds(i, locations.Values); + + // phase 2: combatants launch units + foreach (var c in turnorder) + { + // find launchable units + var unitsToLaunch = new List<(ICombatant Launcher, SpaceVehicle Launchee)>(); + if (c is Planet) + { + // planets can launch infinite units per turn + var p = (Planet)c; + if (p.Cargo != null && p.Cargo.Units != null) + { + foreach (var u in p.Cargo.Units.OfType()) + unitsToLaunch.Add((p, u)); + } + } + else if (c is ICargoTransferrer) + { + // ships, etc. can launch units based on abilities + var ct = (ICargoTransferrer)c; + foreach (var vt in Enum.GetValues(typeof(VehicleTypes)).Cast().Distinct()) + { + var rate = ct.GetAbilityValue("Launch/Recover " + vt.ToSpacedString() + "s").ToInt(); + foreach (var u in ct.Cargo.Units.Where(u => u.Design.VehicleType == vt).OfType().Take(rate)) + unitsToLaunch.Add((c, u)); + } + } + + // launch them temporarily for combat + foreach (var info in unitsToLaunch) + { + Launchers[info.Launchee] = info.Launcher; + if (info.Launcher is ICargoTransferrer ct && info.Launchee is IUnit u) + ct.RemoveUnit(u); + + Combatants.Add(info.Item2); + StartCombatants[info.Item2.ID] = info.Item2.Copy(); + for (var ix = 0; ix < info.Item2.Weapons.Count(); ix++) + { + var w = info.Item2.Weapons.ElementAt(ix); + var wc = StartCombatants[info.Item2.ID].Weapons.ElementAt(ix); + } + locations[info.Launchee] = new Vector2(locations[info.Launcher]); + Events.Last().Add(new CombatantLaunchedEvent(this, info.Launcher, info.Launchee, locations[info.Launchee])); + } + } + + turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); + + // phase 3: combatants fire point defense non-warhead weapons starting with the fastest (so the faster ships get to inflict damage first and possibly KO enemies preventing them from firing back) + foreach (var c in turnorder.Reverse()) + { + foreach (var w in c.Weapons.Where(w => w.Template.ComponentTemplate.WeaponInfo.IsPointDefense && !w.Template.ComponentTemplate.WeaponInfo.IsWarhead)) + TryFireWeapon(c, w, reloads, locations, multiplex); + } + + turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); + + // phase 4: point defense seekers detonate + foreach (var s in turnorder.Reverse().OfType().Where(s => s.WeaponInfo.IsPointDefense)) + { + CheckSeekerDetonation(s, locations); + } + + turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); + + // phase 5: ships fire non-PD non-warhead weapons starting with the fastest (so the faster ships get to inflict damage first and possibly KO enemies preventing them from firing back) + foreach (var c in turnorder.Reverse()) + { + foreach (var w in c.Weapons.Where(w => !w.Template.ComponentTemplate.WeaponInfo.IsPointDefense && !w.Template.ComponentTemplate.WeaponInfo.IsWarhead)) + TryFireWeapon(c, w, reloads, locations, multiplex); + } + + turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); + + // phase 6: non-PD seekers detonate + foreach (var s in turnorder.Reverse().OfType().Where(s => !s.WeaponInfo.IsPointDefense)) + { + CheckSeekerDetonation(s, locations); + } + + turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); + + // phase 7: ramming! only activates if ship has no other weapons + foreach (var c in turnorder.Reverse()) + { + if (!c.Weapons.Any(w => !w.Template.ComponentTemplate.WeaponInfo.IsWarhead)) + { + // TODO - add damage from ship HP on both sides + foreach (var w in c.Weapons.Where(w => w.Template.ComponentTemplate.WeaponInfo.IsWarhead)) + TryFireWeapon(c, w, reloads, locations, multiplex); + } + } + + turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); + + // TODO - boarding + + // phase 8: drop troops + foreach (var c in turnorder.Reverse()) + { + if (c is ICargoTransferrer cc && cc.AllUnits.OfType().Any()) + { + // find enemy planets in the same square + var dropTargets = locations.Where(q => q.Key != c && q.Value == locations[c] && q.Key is Planet p && c.IsHostileTo(p.Owner)).Select(q => q.Key).Cast(); + var dropTarget = dropTargets.PickRandom(Dice); + if (dropTarget != null) + { + var cd = new CargoDelta(); + cd.UnitTypeTonnage.Add(VehicleTypes.Troop, null); + cc.TransferCargo(cd, dropTarget, cc.Owner, true); + var groundBattle = new GroundBattle(dropTarget); + groundBattle.Resolve(); + } + } + } + + // clear used combat speed buffer speed + foreach (var x in Combatants) + { + CombatSpeedBuffer[x] += x.CombatSpeed - Floor(x.CombatSpeed); + CombatSpeedBuffer[x] -= Floor(CombatSpeedBuffer[x]); + } + + UpdateBounds(i, locations.Values); + + bool hostile = false; + foreach (var a in alives) + { + foreach (var b in alives) + { + // TODO - check if ships want to ram even if they have no weapons + if (a.IsHostileTo(b.Owner) && a.Weapons.Any()) + { + hostile = true; + break; + } + } + if (hostile) + break; + } + if (!hostile) + break; + } + + // recover units + var orphans = new List(); + foreach (var u in Combatants.OfType()) + { + if (Launchers[u] is ICargoTransferrer cc && cc.CargoStorageFree() >= u.Design.Hull.Size && u.Owner == cc.Owner) + cc.Cargo.Units.Add(u); + else + orphans.Add(u); + } + foreach (var u in orphans) + { + var recoverer = Combatants.OfType().Where(q => q.CargoStorageFree() >= u.Design.Hull.Size && q.Owner == u.Owner).FirstOrDefault(); + if (recoverer != null) + recoverer.Cargo.Units.Add(u); + else + u.Dispose(); // no one can recover this unit, it is destroyed + } + + // save state of combatants at end of battle - set to undisposed so they don't get purged! + EndCombatants = Combatants.Select(c => new { c.ID, Copy = c.CopyAndAssignNewID() }).ToDictionary(q => q.ID, q => q.Copy); + foreach (var c in EndCombatants.Values) + c.IsDisposed = false; + + // validate fleets since some ships might have died + foreach (var fleet in Sector.SpaceObjects.OfType()) + fleet.Validate(); + + // replenish combatants' shields + foreach (var combatant in Sector.SpaceObjects.OfType()) + combatant.ReplenishShields(); + + // mark battle complete + Current.Remove(this); + Previous.Add(this); + + // update memories + foreach (var sobj in Combatants.OfType().Where(x => !x.IsMemory).ToArray()) + { + foreach (var emp in Empires) + { + emp.UpdateMemory(sobj); ; + } + } + + // modify happiness + ModifyHappiness(); + } + + public abstract void ModifyHappiness(); + + public override string ToString() + { + return Name; + } + + private void CheckSeekerDetonation(Seeker s, SafeDictionary> locations) + { + if (locations[s] == locations[s.Target]) + { + var range = s.DistanceTraveled; + var shot = new Shot(s.LaunchingCombatant, s.LaunchingComponent, s.Target, range); + var hit = new Hit(shot, s.Target, s.Damage.Evaluate(shot)); + bool wasArmed = s.Target is Seeker || s.Target.Weapons.Any(); + s.Target.TakeDamage(hit, Dice); + bool isArmed = s.Target is Seeker || s.Target.Weapons.Any(); + Events.Last().Add(new CombatantsCollideEvent(this, s, s.Target, locations[s.Target], s.Hitpoints, hit.NominalDamage, false, wasArmed && !isArmed)); + s.Hitpoints = 0; + Events.Last().Add(new CombatantDestroyedEvent(this, s, locations[s])); + locations.Remove(s); + if (s.Target.IsDestroyed) + { + var loc = locations[s.Target]; + Events.Last().Add(new CombatantDestroyedEvent(this, s.Target, locations[s.Target])); + locations.Remove(s.Target); + } + } + } + + private void TryFireWeapon(ICombatant c, Component w, SafeDictionary reloads, SafeDictionary> locations, SafeDictionary> multiplex) + { + // find suitable targets in range + ICombatant target; + if (w.Template.ComponentTemplate.WeaponInfo.IsWarhead) + { + // warheads only work at range zero and are unaffected by multiplex tracking limits + target = Combatants.Where(x => + { + if (!x.IsAlive) + return false; + if (!x.Owner.IsEnemyOf(w.Owner, StarSystem)) + return false; + if (!w.CanTarget(x)) + return false; + var range = locations[c].DistanceToEightWay(locations[x]); + return range == 0; + }).FirstOrDefault(); + } + else if (w.Template.ComponentTemplate.WeaponInfo.IsPointDefense) + { + // point defense weapons are unaffected by multiplex tracking limits + target = Combatants.Where(x => + { + if (!x.IsAlive) + return false; + if (!x.Owner.IsEnemyOf(w.Owner, StarSystem)) + return false; + if (!w.CanTarget(x)) + return false; + var range = locations[c].DistanceToEightWay(locations[x]); + return range >= w.Template.WeaponMinRange && range <= w.Template.WeaponMaxRange; + }).FirstOrDefault(); + } + else + { + target = Combatants.Where(x => + { + if (!x.IsAlive) + return false; + if (!x.Owner.IsEnemyOf(c.Owner, StarSystem)) + return false; + if (!w.CanTarget(x)) + return false; + var range = locations[c].DistanceToEightWay(locations[x]); + return range >= w.Template.WeaponMinRange && range <= w.Template.WeaponMaxRange; + }).FirstOrDefault(x => multiplex[c].Contains(x) || multiplex[c].Count < c.MaxTargets); + if (target != null) + multiplex[c].Add(target); + } + + if (target == null) + return; + + // fire! + while (reloads[w] <= 0) + { + if (w.BurnSupplies()) + { + if (w.Template.ComponentTemplate.WeaponType == WeaponTypes.Seeking || w.Template.ComponentTemplate.WeaponType == WeaponTypes.SeekingPointDefense) + { + var seeker = new Seeker(Sector, c.Owner, c, w, target); + Galaxy.Current.AssignID(seeker); + Combatants.Add(seeker); + StartCombatants[seeker.ID] = seeker.Copy(); + locations[seeker] = new Vector2(locations[c]); + Events.Last().Add(new CombatantLaunchedEvent(this, c, seeker, locations[seeker])); + } + else + { + // fire + int dmg = 0; + var winfo = w.Template.ComponentTemplate.WeaponInfo; + var minrng = w.Template.WeaponMinRange; + var maxrng = w.Template.WeaponMaxRange; + var range = locations[c].DistanceToEightWay(locations[target]); + var shot = new Shot(c, w, target, range); + bool wasArmed = target is Seeker || target.Weapons.Any(); + if (w.Template.ComponentTemplate.WeaponInfo.IsWarhead || shot.RollAccuracy(Dice)) + { + dmg += shot.FullDamage; + Hit hit; + if (w.Template.ComponentTemplate.WeaponInfo.IsWarhead) + { + hit = new Hit(shot, target, w.Template.GetWeaponDamage(range) * Mod.Current.Settings.RammingSourceHitpointsDamagePercent / 100); + // warheads have a damage modifer + target.TakeDamage(hit); + // warheads damage the firing ship too + c.TakeDamage(new Hit(shot, target, w.Template.GetWeaponDamage(range) * Mod.Current.Settings.RammingTargetHitpointsDamagePercent / 100)); + // warheads destroy themselves on activation + w.Hitpoints = 0; + } + else + { + hit = new Hit(shot, target, w.Template.GetWeaponDamage(range)); + target.TakeDamage(hit); + } + bool isArmed = target is Seeker || target.Weapons.Any(); + Events.Last().Add(new WeaponFiresEvent(this, c, locations[c], target, locations[target], w, hit, wasArmed && !isArmed)); + } + else + { + bool isArmed = target is Seeker || target.Weapons.Any(); + Events.Last().Add(new WeaponFiresEvent(this, c, locations[c], target, locations[target], w, null, wasArmed && !isArmed)); + } + } + // TODO - mounts that affect reload rate? + reloads[w] += w.Template.ComponentTemplate.WeaponInfo.ReloadRate.Evaluate(w.Template); + } + else + break; + } + + if (target.IsDestroyed) + { + Events.Last().Add(new CombatantDestroyedEvent(this, target, locations[target])); + locations.Remove(target); + } + } + + private void UpdateBounds(int round, IEnumerable> positions) + { + while (UpperLeft.Count() <= round) + UpperLeft.Add(new Vector2()); + while (LowerRight.Count() <= round) + LowerRight.Add(new Vector2()); + UpperLeft[round] = UpperLeft[round] with { X = positions.MinOrDefault(q => q.X) }; + LowerRight[round] = LowerRight[round] with { X = positions.MaxOrDefault(q => q.X) }; + UpperLeft[round] = UpperLeft[round] with { Y = positions.MinOrDefault(q => q.Y) }; + LowerRight[round] = LowerRight[round] with { Y = positions.MaxOrDefault(q => q.Y) }; + } + + public void Dispose() + { + foreach (var seeker in Combatants.OfType().ToArray()) + seeker.Dispose(); + Combatants.Clear(); + if (CombatSpeedBuffer != null) + CombatSpeedBuffer.Clear(); + Events.Clear(); + LowerRight.Clear(); + if (StartCombatants != null) + StartCombatants.Clear(); + if (EndCombatants != null) + EndCombatants.Clear(); + UpperLeft.Clear(); + } +} diff --git a/FrEee.Core/Processes/Combat/Grid/BattleEvent.cs b/FrEee.Core/Processes/Combat/Grid/BattleEvent.cs new file mode 100644 index 000000000..f5a21e3f1 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/BattleEvent.cs @@ -0,0 +1,35 @@ +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Objects.GameState; + +namespace FrEee.Processes.Combat.Grid; + +public abstract class BattleEvent : IBattleEvent +{ + protected BattleEvent(IBattle battle, ICombatant combatant, Vector2 startPosition, Vector2 endPosition) + { + Battle = battle; + Combatant = combatant; + StartPosition = startPosition; + EndPosition = endPosition; + } + + [DoNotCopy] + public IBattle Battle { get; set; } + + private GalaxyReference combatant { get; set; } + + [DoNotSerialize] + public ICombatant Combatant + { + get => combatant?.Value ?? Battle?.StartCombatants?[combatant.ID]; + set => combatant = value.ReferViaGalaxy(); + } + + public Vector2 EndPosition { get; set; } + + public Vector2 StartPosition { get; set; } +} diff --git a/FrEee.Core/Processes/Combat/Grid/CombatantAppearsEvent.cs b/FrEee.Core/Processes/Combat/Grid/CombatantAppearsEvent.cs new file mode 100644 index 000000000..c5523079e --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/CombatantAppearsEvent.cs @@ -0,0 +1,17 @@ +using FrEee.Utility; +using System.Linq; +using FrEee.Utility; +using FrEee.Processes.Combat; + +namespace FrEee.Processes.Combat.Grid; + +public class CombatantAppearsEvent : BattleEvent +{ + public CombatantAppearsEvent(IBattle battle, ICombatant combatant, Vector2 position) + : base(battle, combatant, position, position) + { + IsUnarmed = !(Combatant is Seeker) && !Combatant.Weapons.Any(); + } + + public bool IsUnarmed { get; set; } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/Grid/CombatantDestroyedEvent.cs b/FrEee.Core/Processes/Combat/Grid/CombatantDestroyedEvent.cs new file mode 100644 index 000000000..f242315ad --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/CombatantDestroyedEvent.cs @@ -0,0 +1,13 @@ +using FrEee.Processes.Combat; +using FrEee.Utility; +using FrEee.Utility; +namespace FrEee.Processes.Combat.Grid; + +public class CombatantDestroyedEvent : BattleEvent +{ + public CombatantDestroyedEvent(IBattle battle, ICombatant combatant, Vector2 position) + : base(battle, combatant, position, position) + { + } + +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/Grid/CombatantDisappearsEvent.cs b/FrEee.Core/Processes/Combat/Grid/CombatantDisappearsEvent.cs new file mode 100644 index 000000000..2c4c308d4 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/CombatantDisappearsEvent.cs @@ -0,0 +1,16 @@ +using FrEee.Utility; +using System; +using FrEee.Utility; +using FrEee.Processes.Combat; + +namespace FrEee.Processes.Combat.Grid; + +[Obsolete("This class is deprecated; use CombatantDestroyedEvent if a combatant is destroyed.")] +public class CombatantDisappearsEvent : BattleEvent +{ + public CombatantDisappearsEvent(IBattle battle, ICombatant combatant, Vector2 position) + : base(battle, combatant, position, position) + { + } + +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/Grid/CombatantLaunchedEvent.cs b/FrEee.Core/Processes/Combat/Grid/CombatantLaunchedEvent.cs new file mode 100644 index 000000000..9c649ec10 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/CombatantLaunchedEvent.cs @@ -0,0 +1,27 @@ +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Objects.GameState; + +namespace FrEee.Processes.Combat.Grid; + +public class CombatantLaunchedEvent : BattleEvent +{ + public CombatantLaunchedEvent(Battle battle, ICombatant launcher, ICombatant combatant, Vector2 position) + : base(battle, combatant, position, position) + { + Launcher = launcher; + } + + private GalaxyReference launcher { get; set; } + + [DoNotSerialize] + public ICombatant Launcher + { + get => launcher?.Value ?? Battle?.StartCombatants?[launcher.ID]; + set => launcher = value.ReferViaGalaxy(); + } + +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/Grid/CombatantMovesEvent.cs b/FrEee.Core/Processes/Combat/Grid/CombatantMovesEvent.cs new file mode 100644 index 000000000..e568cbb53 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/CombatantMovesEvent.cs @@ -0,0 +1,12 @@ +using FrEee.Processes.Combat; +using FrEee.Utility; +using FrEee.Utility; +namespace FrEee.Processes.Combat.Grid; + +public class CombatantMovesEvent : BattleEvent +{ + public CombatantMovesEvent(Battle battle, ICombatant combatant, Vector2 here, Vector2 there) + : base(battle, combatant, here, there) + { + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/Grid/CombatantsCollideEvent.cs b/FrEee.Core/Processes/Combat/Grid/CombatantsCollideEvent.cs new file mode 100644 index 000000000..8a39dda3b --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/CombatantsCollideEvent.cs @@ -0,0 +1,41 @@ +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Objects.GameState; + +namespace FrEee.Processes.Combat.Grid; + +/// +/// When combatants collide - seeker detonation or ship ramming +/// +/// +public class CombatantsCollideEvent : BattleEvent +{ + public CombatantsCollideEvent(Battle battle, ICombatant combatant, ICombatant target, Vector2 location, int combatantDamage, int targetDamage, bool wasCombatantDisarmed, bool wasTargetDisarmed) + : base(battle, combatant, location, location) + { + Target = target; + CombatantDamage = combatantDamage; + TargetDamage = targetDamage; + WasCombatantDisarmed = wasCombatantDisarmed; + WasTargetDisarmed = wasTargetDisarmed; + } + + + private GalaxyReference target { get; set; } + + [DoNotSerialize] + public ICombatant Target + { + get => target?.Value ?? Battle?.StartCombatants?[target.ID]; + set => target = value.ReferViaGalaxy(); + } + + public int CombatantDamage { get; set; } + public int TargetDamage { get; set; } + + public bool WasCombatantDisarmed { get; set; } + public bool WasTargetDisarmed { get; set; } +} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Grid/Extensions.cs b/FrEee.Core/Processes/Combat/Grid/Extensions.cs similarity index 100% rename from FrEee/Objects/Combat/Grid/Extensions.cs rename to FrEee.Core/Processes/Combat/Grid/Extensions.cs diff --git a/FrEee.Core/Processes/Combat/Grid/GroundBattle.cs b/FrEee.Core/Processes/Combat/Grid/GroundBattle.cs new file mode 100644 index 000000000..ad8f1fca1 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/GroundBattle.cs @@ -0,0 +1,92 @@ +using FrEee.Objects.Civilization; +using FrEee.Objects.Space; +using FrEee.Objects.Vehicles; +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Utility; +using FrEee.Processes.Combat; + +namespace FrEee.Processes.Combat.Grid; + +/// +/// A battle which takes place on a planet's surface. +/// +/// +public class GroundBattle : Battle +{ + public GroundBattle(Planet location) + : base() + { + Planet = location; + OriginalPlanetOwner = Planet.Owner; + Sector = location.Sector ?? throw new Exception("Ground battles require a sector location."); + + // TODO - should weapon platforms participate in ground combat like in SE5? + Empires = Planet.Cargo.Units.OfType().Select(t => t.Owner).Distinct(); + var combatants = new HashSet(Planet.Cargo.Units.OfType()); + for (var i = 0; i < Planet.PopulationFill.Value / Mod.Current.Settings.PopulationFactor / (Mod.Current.Settings.PopulationPerMilitia == 0 ? 20 : Mod.Current.Settings.PopulationPerMilitia); i++) + { + var militia = Design.MilitiaDesign.Instantiate(); + militia.Owner = Planet.Owner; + combatants.Add(militia); + } + + Initialize(combatants); + } + + public override int DamagePercentage => Mod.Current.Settings.GroundCombatDamagePercent; + + public Planet Planet { get; private set; } + + public Empire OriginalPlanetOwner { get; private set; } + + public override void Initialize(IEnumerable combatants) + { + base.Initialize(combatants); + + Empires = Planet.Cargo.Units.OfType().Select(t => t.Owner).Distinct(); + + int moduloID = (int)(Planet.ID % 100000); + Dice = new PRNG((int)(moduloID / Galaxy.Current.Timestamp * 10)); + } + + public override void PlaceCombatants(SafeDictionary> locations) + { + // in ground combat, for now everyone is right on top of each other + foreach (var c in Combatants) + locations.Add(c, new Vector2()); + } + + public override int MaxRounds => Mod.Current.Settings.GroundCombatTurns; + + public override void ModifyHappiness() + { + foreach (var e in Empires) + { + switch (this.ResultFor(e)) + { + case "victory": + if (OriginalPlanetOwner != e) + e.TriggerHappinessChange(hm => hm.EnemyPlanetCaptured); + break; + case "defeat": + if (OriginalPlanetOwner == e) + { + e.TriggerHappinessChange(hm => hm.OurPlanetCaptured); + e.TriggerHappinessChange(hm => hm.OurPlanetLost); + if (Planet.Colony.IsHomeworld) + e.TriggerHappinessChange(hm => hm.OurHomeworldLost); + } + break; + } + + } + } + + public override string Name => $"Ground Battle at {Planet}"; +} diff --git a/FrEee.Core/Processes/Combat/Grid/IBattleEvent.cs b/FrEee.Core/Processes/Combat/Grid/IBattleEvent.cs new file mode 100644 index 000000000..779e32f04 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/IBattleEvent.cs @@ -0,0 +1,12 @@ +using FrEee.Processes.Combat; +using FrEee.Utility; +using FrEee.Utility; +namespace FrEee.Processes.Combat.Grid; + +public interface IBattleEvent +{ + IBattle Battle { get; } + ICombatant Combatant { get; } + Vector2 EndPosition { get; } + Vector2 StartPosition { get; } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/Grid/SpaceBattle.cs b/FrEee.Core/Processes/Combat/Grid/SpaceBattle.cs new file mode 100644 index 000000000..dfaa10d85 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/SpaceBattle.cs @@ -0,0 +1,140 @@ +using FrEee.Objects.Space; +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using static System.Math; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; + +namespace FrEee.Processes.Combat.Grid; + +/// +/// A battle which takes place... IIIN... SPAAACE!!! +/// +/// +public class SpaceBattle : Battle +{ + public SpaceBattle(Sector location) + : base() + { + Sector = location ?? throw new Exception("Space battles require a sector location."); + + // TODO - what about cloaked ships? should they not participate in combat? + Empires = Sector.SpaceObjects.OfType().Select(sobj => sobj.Owner).Where(emp => emp != null).Distinct().ToArray(); + Combatants = new HashSet(Sector.SpaceObjects.OfType().Where(o => o.Owner != null).Union(Sector.SpaceObjects.OfType().SelectMany(f => f.Combatants)).Where(o => !(o is Fleet))); + + Initialize(new HashSet(Sector.SpaceObjects.OfType().Where(o => o.Owner != null).Union(Sector.SpaceObjects.OfType().SelectMany(f => f.Combatants)).Where(o => !(o is Fleet)))); + } + + public override int DamagePercentage => 100; + + public override void Initialize(IEnumerable combatants) + { + base.Initialize(combatants); + + Empires = Sector.SpaceObjects.OfType().Select(sobj => sobj.Owner).Where(emp => emp != null).Distinct().ToArray(); + + int moduloID = (int)(Sector.StarSystem.ID % 100000); + Dice = new PRNG((int)(moduloID / Galaxy.Current.Timestamp * 10)); + } + + public override void PlaceCombatants(SafeDictionary> locations) + { + if (Sector.SpaceObjects.OfType().Any()) + { + // HACK - warp point in sector, assume someone warped + // TODO - do this for warp point exits instead since warp points may be one way + // warp battles start with everyone mashed together to allow blockades + foreach (var c in Combatants.OrderByDescending(q => q.Size)) + PlaceCombatant(locations, 0, 0, c); + } + else + { + // place all combatants at the points of a regular polygon + var sideLength = 20 + (int)Ceiling((double)Combatants.GroupBy(q => q.Owner).Max(q => q.Count())); // make sure no one can shoot each other at the start + // https://stackoverflow.com/questions/32169875/calculating-the-coordinates-of-a-regular-polygon-given-its-center-and-its-side-l + var radius = sideLength / (2 * Sin(PI / Empires.Count())); + var combs = Combatants.ToArray(); + for (int i = 0; i < Empires.Count(); i++) + { + var x = radius * Cos(PI / Empires.Count() * (1 + 2 * i)); + var y = radius * Sin(PI / Empires.Count() * (1 + 2 * i)); + foreach (var comb in Combatants.Where(q => q.Owner == Empires.ElementAt(i)).OrderByDescending(q => q.Size)) + { + PlaceCombatant(locations, x, y, comb); + } + } + } + } + + private void PlaceCombatant(SafeDictionary> locations, double x, double y, ICombatant comb) + { + // scramble all tile-filling combatants in rings around the largest + if (comb.FillsCombatTile) + { + for (int r = 0; ; r++) + { + bool done = false; + var tiles = Vector2Utility.AtRadius(r); + foreach (var tile in tiles.Shuffle(Dice)) + { + var atHere = locations.Where(q => q.Key.FillsCombatTile && q.Value == tile); + if (!atHere.Any()) + { + locations.Add(comb, new Vector2((int)x + tile.X, (int)y + tile.Y)); + done = true; + break; + } + } + if (done) + break; + } + } + else // put non-filling combatants in the center + locations.Add(comb, new Vector2((int)x, (int)y)); + } + + /// + /// Battles are named after any stellar objects in their sector; failing that, they are named after the star system and sector coordinates. + /// + public override string Name + { + get + { + if (Sector.SpaceObjects.OfType().Any()) + return "Battle at " + Sector.SpaceObjects.OfType().Largest(); + var coords = Sector.Coordinates; + return "Battle at " + Sector.StarSystem + " sector (" + coords.X + ", " + coords.Y + ")"; + } + } + + public override int MaxRounds => Mod.Current.Settings.SpaceCombatTurns; + + public override void ModifyHappiness() + { + foreach (var e in Empires) + { + switch (this.ResultFor(e)) + { + case "victory": + e.TriggerHappinessChange(StarSystem, hm => hm.BattleInSystemWin); + e.TriggerHappinessChange(Sector, hm => hm.BattleInSectorWin); + break; + case "defeat": + e.TriggerHappinessChange(StarSystem, hm => hm.BattleInSystemLoss); + e.TriggerHappinessChange(Sector, hm => hm.BattleInSectorLoss); + break; + case "stalemate": + case "Pyrrhic victory": + e.TriggerHappinessChange(StarSystem, hm => hm.BattleInSystemStalemate); + e.TriggerHappinessChange(Sector, hm => hm.BattleInSectorStalemate); + break; + } + } + } +} diff --git a/FrEee.Core/Processes/Combat/Grid/WeaponFiresEvent.cs b/FrEee.Core/Processes/Combat/Grid/WeaponFiresEvent.cs new file mode 100644 index 000000000..c5fca8011 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Grid/WeaponFiresEvent.cs @@ -0,0 +1,51 @@ +using FrEee.Objects.Technology; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Objects.GameState; + +namespace FrEee.Processes.Combat.Grid; + +public class WeaponFiresEvent : BattleEvent +{ + public WeaponFiresEvent(Battle battle, ICombatant attacker, Vector2 here, ICombatant target, Vector2 there, Component weapon, Hit hit, bool wasTargetDisarmed) + : base(battle, attacker, here, there) + { + Attacker = attacker; + Target = target; + Weapon = weapon; + Hit = hit; + IsHit = hit != null; + Damage = hit?.NominalDamage ?? 0; + WasTargetDisarmed = wasTargetDisarmed; + } + public bool IsHit { get; set; } + + private GalaxyReference attacker { get; set; } + + private GalaxyReference target { get; set; } + + [DoNotSerialize] + public ICombatant Attacker + { + get => attacker?.Value ?? Battle?.StartCombatants?[attacker.ID]; + set => attacker = value.ReferViaGalaxy(); + } + + [DoNotSerialize] + public ICombatant Target + { + get => target?.Value ?? Battle?.StartCombatants?[target.ID]; + set => target = value.ReferViaGalaxy(); + } + + // TODO - make this some sort of reference? + public Component Weapon { get; set; } + + public Hit Hit { get; set; } + public int Damage { get; set; } + + public bool WasTargetDisarmed { get; set; } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/Hit.cs b/FrEee.Core/Processes/Combat/Hit.cs new file mode 100644 index 000000000..5e739e646 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Hit.cs @@ -0,0 +1,75 @@ +using System.Collections.Generic; +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Objects.GameState; + +namespace FrEee.Processes.Combat; + +/// +/// A hit by a weapon or other source of damage. +/// +public class Hit : IFormulaHost +{ + public Hit(Shot shot, IDamageable target, int? nominalDamage = null) + { + Shot = shot; + DamageType = shot?.DamageType ?? DamageType.Normal; + Target = target; + NominalDamage = nominalDamage ?? shot.DamageLeft; + } + + public Hit(DamageType dt, int damage, IDamageable target) + { + DamageType = dt; + Target = target; + NominalDamage = damage; + } + + public DamageType DamageType { get; set; } + + /// + /// The nominal damage inflicted by this hit, not accounting for special damage types and target defenses. + /// + public int NominalDamage { get; set; } + + /// + /// The shot which inflicted this hit. + /// + public Shot Shot { get; set; } + + /// + /// The specific target of this hit. + /// + [DoNotSerialize] + public IDamageable Target + { + get { return target?.Value ?? _target; } + set + { + if (value is IDamageableReferrable dr) + target = dr.ReferViaGalaxy(); + else + _target = value; + } + } + + public IDictionary Variables + { + get + { + var sv = Shot.Variables; + var result = new SafeDictionary(); + foreach (var v in sv) + result.Add(v); + result["target"] = Target; + return result; + } + } + + private GalaxyReference target { get; set; } + + private IDamageable _target { get; set; } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/IBattle.cs b/FrEee.Core/Processes/Combat/IBattle.cs new file mode 100644 index 000000000..b8dadab69 --- /dev/null +++ b/FrEee.Core/Processes/Combat/IBattle.cs @@ -0,0 +1,22 @@ +using FrEee.Objects.Civilization; +using FrEee.Objects.GameState; +using FrEee.Objects.LogMessages; +using FrEee.Objects.Space; +using FrEee.Utility; +using System.Collections.Generic; +using FrEee.Utility; + +namespace FrEee.Processes.Combat; + +public interface IBattle : INamed, IPictorial, ILocated +{ + ISet Combatants { get; } + PRNG Dice { get; set; } + IEnumerable Empires { get; } + IList Log { get; } + double Timestamp { get; } + IDictionary StartCombatants { get; } + IDictionary EndCombatants { get; } + + void Resolve(); +} \ No newline at end of file diff --git a/FrEee/Objects/Combat/ICombatSpaceObject.cs b/FrEee.Core/Processes/Combat/ICombatSpaceObject.cs similarity index 83% rename from FrEee/Objects/Combat/ICombatSpaceObject.cs rename to FrEee.Core/Processes/Combat/ICombatSpaceObject.cs index 0f81195ea..5224471fa 100644 --- a/FrEee/Objects/Combat/ICombatSpaceObject.cs +++ b/FrEee.Core/Processes/Combat/ICombatSpaceObject.cs @@ -1,6 +1,6 @@ using FrEee.Objects.Space; -namespace FrEee.Objects.Combat; +namespace FrEee.Processes.Combat; /// /// A space object that can participate in combat. diff --git a/FrEee/Objects/Combat/ICombatant.cs b/FrEee.Core/Processes/Combat/ICombatant.cs similarity index 98% rename from FrEee/Objects/Combat/ICombatant.cs rename to FrEee.Core/Processes/Combat/ICombatant.cs index 86e56828f..d94a79035 100644 --- a/FrEee/Objects/Combat/ICombatant.cs +++ b/FrEee.Core/Processes/Combat/ICombatant.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace FrEee.Objects.Combat; +namespace FrEee.Processes.Combat; /// /// An object that can fire weapons and/or targeted by weapons. diff --git a/FrEee/Objects/Combat/IDamageable.cs b/FrEee.Core/Processes/Combat/IDamageable.cs similarity index 96% rename from FrEee/Objects/Combat/IDamageable.cs rename to FrEee.Core/Processes/Combat/IDamageable.cs index 896a5305a..b704332a2 100644 --- a/FrEee/Objects/Combat/IDamageable.cs +++ b/FrEee.Core/Processes/Combat/IDamageable.cs @@ -1,6 +1,7 @@ using FrEee.Serialization; using FrEee.Utility; -namespace FrEee.Objects.Combat; +using FrEee.Utility; +namespace FrEee.Processes.Combat; /// /// Something which can take damage. diff --git a/FrEee/Objects/Combat/ITargetable.cs b/FrEee.Core/Processes/Combat/ITargetable.cs similarity index 92% rename from FrEee/Objects/Combat/ITargetable.cs rename to FrEee.Core/Processes/Combat/ITargetable.cs index fd2a2155f..13e697c8d 100644 --- a/FrEee/Objects/Combat/ITargetable.cs +++ b/FrEee.Core/Processes/Combat/ITargetable.cs @@ -1,6 +1,6 @@ using FrEee.Objects.Civilization; -namespace FrEee.Objects.Combat; +namespace FrEee.Processes.Combat; /// /// Something which can be specifically target by weapons. diff --git a/FrEee.Core/Processes/Combat/ProjectileWeaponDisplayEffect.cs b/FrEee.Core/Processes/Combat/ProjectileWeaponDisplayEffect.cs new file mode 100644 index 000000000..33e9afa59 --- /dev/null +++ b/FrEee.Core/Processes/Combat/ProjectileWeaponDisplayEffect.cs @@ -0,0 +1,38 @@ +using System; +using System.Drawing; + +namespace FrEee.Processes.Combat; + +[Serializable] +public class ProjectileWeaponDisplayEffect : WeaponDisplayEffect +{ + public ProjectileWeaponDisplayEffect(string name) + : base(name) + { + } + + public override Point GlobalSpriteOffset + { + get { return new Point(); } + } + + public override string GlobalSpriteSheetName + { + get { return "Torps"; } + } + + public override Point ShipsetSpriteOffset + { + get { return new Point(); } + } + + public override string ShipsetSpriteSheetName + { + get { return "Torps"; } + } + + public override Size SpriteSize + { + get { return new Size(20, 20); } + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/Seeker.cs b/FrEee.Core/Processes/Combat/Seeker.cs new file mode 100644 index 000000000..441ec5a3f --- /dev/null +++ b/FrEee.Core/Processes/Combat/Seeker.cs @@ -0,0 +1,372 @@ +using FrEee.Objects.Civilization; +using FrEee.Objects.Space; +using FrEee.Objects.Technology; +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Utility; +using FrEee.Serialization; + +namespace FrEee.Processes.Combat; + +/// +/// A seeking missile or torpedo. +/// +public class Seeker : ICombatant +{ + public Seeker(Sector sector, Empire owner, ICombatant attacker, Component launcher, ICombatant target) + { + Sector = sector; + Owner = owner; + if (launcher.Template.ComponentTemplate.WeaponInfo is SeekingWeaponInfo) + LaunchingComponent = launcher; + else + throw new Exception(launcher + " cannot launch seekers."); + Name = Owner.Name + " " + launcher.Name; + if (WeaponInfo.Targets.HasFlag(target.WeaponTargetType)) + Target = target; + else + throw new Exception(launcher + " cannot target a " + target.WeaponTargetType + "."); + Hitpoints = WeaponInfo.SeekerDurability; // TODO - can mounts affect seeker durability? + CombatSpeed = WeaponInfo.SeekerSpeed; + } + + /// + /// Seekers don't fire so it doesn't really matter... + /// + public int Accuracy + { + get { return 0; } + } + + /// + /// TODO - armored seekers? + /// + public int ArmorHitpoints + { + get { return 0; } + } + + /// + /// The battle in which this seeker was fired. + /// + [DoNotSerialize(false)] + [Obsolete("Seekers don't need to know what battle they're in; this property is obsolete.")] + public IBattle Battle { get; set; } + + public double CombatSpeed { get; set; } + + public Formula Damage + { + get + { + return LaunchingComponent.Template.GetWeaponDamage(1); // TODO - seekers that do different damage based on some sort of abstracted "range" + } + } + + public int DistanceTraveled { get; set; } + + /// + /// Seeker evasion is determined by Settings.txt. + /// TODO - add a field to Components.txt that lets seekers have custom evasion values? + /// + public int Evasion + { + get { return Mod.Current.Settings.SeekerEvasion; } + } + + public int HitChance + { + get { return 1; } + } + + /// + /// The remaining durability of this seeker. + /// + public int Hitpoints { get; set; } + + public int HullHitpoints + { + get { return Hitpoints; } + } + + public Image Icon + { + get { return Portrait; } + } + + public Image Icon32 => Icon.Resize(32); + + public IEnumerable IconPaths + { + get + { + return PortraitPaths; + } + } + + public long ID + { + get; + set; + } + + public bool IsAlive => !IsDestroyed; + + public bool IsDestroyed + { + get { return Hitpoints <= 0; } + } + + public bool IsDisposed { get; set; } + + public bool IsMemory + { + get; + set; + } + + /// + /// The combatant which launched the seeker. + /// + public ICombatant LaunchingCombatant { get; private set; } + + /// + /// The component which launched this seeker. + /// + public Component LaunchingComponent { get; private set; } + + public int MaxArmorHitpoints + { + get { return 0; } + } + + public int MaxHitpoints + { + get + { + return WeaponInfo.SeekerDurability; // TODO - let mounts affect seeker HP? + } + } + + public int MaxHullHitpoints + { + get { return MaxHitpoints; } + } + + public int MaxNormalShields + { + get { return 0; } + } + + public int MaxPhasedShields + { + get { return 0; } + } + + public int MaxShieldHitpoints + { + get { return MaxNormalShields + MaxPhasedShields; } + } + + public int MaxTargets => 0; + + /// + /// The name of the seeker. + /// + public string Name { get; private set; } + + /// + /// Seekers do not have shields. + /// TODO - maybe let seekers have shields? + /// + public int NormalShields + { + get + { + return 0; + } + set + { + // do nothing + } + } + + /// + /// The owner of the seeker. + /// + public Empire Owner { get; set; } + + /// + /// Seekers do not have shields. + /// TODO - maybe let seekers have shields? + /// + public int PhasedShields + { + get + { + return 0; + } + set + { + // do nothing + } + } + + public Image Portrait + { + // TODO - custom seeker images per shipset + get { return Pictures.GetGenericImage(1.0); } + } + + public IEnumerable PortraitPaths + { + get + { + var paths = new List(); + + var shipsetPath = Owner.ShipsetPath; + + if (Mod.Current?.RootPath != null) + { + paths.Add(Path.Combine("Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Seeker")); + paths.Add(Path.Combine("Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_" + "Seeker")); + } + paths.Add(Path.Combine("Pictures", "Races", shipsetPath, "Seeker")); + paths.Add(Path.Combine("Pictures", "Races", shipsetPath, shipsetPath + "_" + "Seeker")); + return paths; + } + } + + public Sector Sector + { + get; set; + } + + public int ShieldHitpoints + { + get { return NormalShields + PhasedShields; } + } + + public StarSystem StarSystem + { + get { return Sector.StarSystem; } + } + + /// + /// The target of the seeker. + /// + public ICombatant Target { get; private set; } + + public double Timestamp { get; set; } + + public SeekingWeaponInfo WeaponInfo + { + get { return (SeekingWeaponInfo)LaunchingComponent.Template.ComponentTemplate.WeaponInfo; } + } + + /// + /// Seekers do not carry other weapons. + /// + public IEnumerable Weapons + { + get { return Enumerable.Empty(); } + } + + public WeaponTargets WeaponTargetType + { + get { return WeaponTargets.Seeker; } + } + + public bool CanTarget(ITargetable target) + { + return target != null && LaunchingComponent.Template.ComponentTemplate.WeaponInfo.Targets.HasFlag(target.WeaponTargetType); + } + + public Visibility CheckVisibility(Empire emp) + { + if (Owner == emp) + return Visibility.Owned; + if (Galaxy.Current.Battles.Any(b => + (b.Combatants.Contains(this) + || b.StartCombatants.Values.Contains(this) + || b.EndCombatants.Values.Contains(this)) + && b.Combatants.Any(c => c.Owner == emp))) + return Visibility.Scanned; + return Visibility.Unknown; + } + + public void Dispose() + { + if (IsDisposed) + return; + Target = null; + Galaxy.Current.UnassignID(this); + } + + public bool IsHostileTo(Empire emp) + { + return Owner == null ? false : Owner.IsEnemyOf(emp, StarSystem); + } + + public bool IsObsoleteMemory(Empire emp) + { + return Timestamp < Galaxy.Current.Timestamp - 1; + } + + public void Redact(Empire emp) + { + var vis = CheckVisibility(emp); + if (vis < Visibility.Fogged) + Dispose(); + } + + public int? Repair(int? amount = null) + { + if (amount == null) + { + Hitpoints = MaxHitpoints; + return amount; + } + else + { + var actual = Math.Min(MaxHitpoints - Hitpoints, amount.Value); + Hitpoints += actual; + return amount.Value - actual; + } + } + + public void ReplenishShields(int? amount = null) + { + // do nothing, seekers don't have shields + } + + public int TakeDamage(Hit hit, PRNG dice = null) + { + var damage = hit.Shot.DamageLeft; + damage *= hit.Shot.DamageType.SeekerDamage.Evaluate(this) / 100; + var pierced = damage * hit.Shot.DamageType.ComponentPiercing.Evaluate(this); + int realDamage; + realDamage = Math.Min(Hitpoints, damage); + Hitpoints -= realDamage; + return damage - realDamage; + } + + public override string ToString() + { + return Name; + } + + public IEnumerable Components => Enumerable.Empty(); + + public bool FillsCombatTile => false; + + public int Size => 0; +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/SeekerWeaponDisplayEffect.cs b/FrEee.Core/Processes/Combat/SeekerWeaponDisplayEffect.cs new file mode 100644 index 000000000..77398c3f1 --- /dev/null +++ b/FrEee.Core/Processes/Combat/SeekerWeaponDisplayEffect.cs @@ -0,0 +1,38 @@ +using System; +using System.Drawing; + +namespace FrEee.Processes.Combat; + +[Serializable] +public class SeekerWeaponDisplayEffect : WeaponDisplayEffect +{ + public SeekerWeaponDisplayEffect(string name) + : base(name) + { + } + + public override Point GlobalSpriteOffset + { + get { return new Point(); } + } + + public override string GlobalSpriteSheetName + { + get { return "Seekers"; } + } + + public override Point ShipsetSpriteOffset + { + get { return new Point(40, 0); } + } + + public override string ShipsetSpriteSheetName + { + get { return "Main"; } + } + + public override Size SpriteSize + { + get { return new Size(20, 20); } + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Combat/Shot.cs b/FrEee.Core/Processes/Combat/Shot.cs new file mode 100644 index 000000000..36bbc5605 --- /dev/null +++ b/FrEee.Core/Processes/Combat/Shot.cs @@ -0,0 +1,127 @@ +using System.Collections.Generic; +using FrEee.Objects.Technology; +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Objects.GameState; + +namespace FrEee.Processes.Combat; + +/// +/// A weapon's fire, or another source of damage. +/// +public class Shot : IFormulaHost +{ + public Shot(ICombatant attacker, Component weapon, IDamageable defender, int range) + { + Attacker = attacker; + Weapon = weapon; + Defender = defender; + Range = range; + DamageLeft = FullDamage; + } + + public GalaxyReference attacker { get; set; } + + [DoNotSerialize] + public ICombatant Attacker { get { return attacker == null ? null : attacker.Value; } set { attacker = value == null ? null : value.ReferViaGalaxy(); } } + + public int DamageLeft { get; private set; } + + public DamageType DamageType + { + get + { + if (Weapon != null && Weapon.Template.ComponentTemplate.WeaponInfo != null) + return Weapon.Template.ComponentTemplate.WeaponInfo.DamageType; + return Mod.Current.DamageTypes.FindByName("Normal") ?? new DamageType(); // TODO - moddable damage types for storms, etc. + } + } + + /// + /// The specific target of this hit. + /// + [DoNotSerialize] + public IDamageable Defender + { + get { return target?.Value ?? _target; } + set + { + if (value is IDamageableReferrable dr) + target = dr.ReferViaGalaxy(); + else + _target = value; + } + } + + /// + /// Effective range for damage purposes, due to mount range modifiers + /// + public int EffectiveRange + { + get + { + var r = Range - (Weapon.Template.Mount == null ? 0 : Weapon.Template.Mount.WeaponRangeModifier.Evaluate(Weapon)); + if (r < 1) + return 1; + return r; + } + } + + public int FullDamage + { + get + { + if (Weapon == null || Range < Weapon.Template.WeaponMinRange || Range > Weapon.Template.WeaponMaxRange) + return 0; + return Weapon.Template.GetWeaponDamage(EffectiveRange); // TODO - use PRNG + } + } + + public IEnumerable Hits { get; private set; } + public int Range { get; set; } + public GalaxyReference target { get; set; } + private IDamageable _target { get; set; } + + public IDictionary Variables + { + get + { + return new Dictionary + { + { "range", Range}, + }; + } + } + + // TODO - make this some sort of reference? + public Component Weapon { get; set; } + + public int InflictDamage(IDamageable target, PRNG dice = null) + { + var hit = new Hit(this, target, DamageLeft); + DamageLeft = target.TakeDamage(hit, dice); + return DamageLeft; + } + + public bool RollAccuracy(PRNG dice = null) + { + var accuracy = Weapon.Template.WeaponAccuracy + Attacker.Accuracy + Mod.Current.Settings.WeaponAccuracyPointBlank - Range * Mod.Current.Settings.WeaponAccuracyLossPerSquare; + int evasion = 0; + if (Defender is ITargetable t) + evasion = t.Evasion; + var netAccuracy = accuracy - evasion; + if (netAccuracy > 99) + netAccuracy = 99; + if (netAccuracy < 1) + netAccuracy = 1; + return RandomHelper.Range(0, 99, dice) < netAccuracy; + } + + public override string ToString() + { + return Attacker + "'s " + Weapon + " vs. " + Defender + " at range " + Range + " (" + DamageLeft + " damage left)"; + } +} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Simple/Battle.cs b/FrEee.Core/Processes/Combat/Simple/Battle.cs similarity index 100% rename from FrEee/Objects/Combat/Simple/Battle.cs rename to FrEee.Core/Processes/Combat/Simple/Battle.cs diff --git a/FrEee.Core/Processes/Combat/WeaponDisplayEffect.cs b/FrEee.Core/Processes/Combat/WeaponDisplayEffect.cs new file mode 100644 index 000000000..2571c91f2 --- /dev/null +++ b/FrEee.Core/Processes/Combat/WeaponDisplayEffect.cs @@ -0,0 +1,145 @@ +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using FrEee.Objects.GameState; + +namespace FrEee.Processes.Combat; + +/// +/// The display effect to use for a weapon in combat. +/// +[Serializable] +public abstract class WeaponDisplayEffect : IPictorial +{ + protected WeaponDisplayEffect(string name) + { + Name = name; + } + + /// + /// The pixel offset to the first sprite in the global sprite sheet. + /// + public abstract Point GlobalSpriteOffset { get; } + + public Image GlobalSpriteSheet + { + get + { + return Pictures.GetModImage(Path.Combine("Pictures", "Combat", GlobalSpriteSheetName)); + } + } + + /// + /// The name of the sprite sheet to use. + /// + public abstract string GlobalSpriteSheetName { get; } + + public Image Icon + { + get { return GetIcon(null); } + } + + public Image Icon32 => Icon.Resize(32); + + public IEnumerable IconPaths + { + get + { + yield return Path.Combine("Races", "Default", Name); + yield return Path.Combine("Races", "Default", "Default" + "_" + Name); + yield return Path.Combine("Combat", Name); + } + } + + /// + /// The name or index of the effect to use. + /// + public string Name { get; set; } + + public Image Portrait + { + get { return Icon; } + } + + public IEnumerable PortraitPaths + { + get + { + return IconPaths; + } + } + + /// + /// The pixel offset to the first sprite in the shipset-specific sprite sheet. + /// + public abstract Point ShipsetSpriteOffset { get; } + + /// + /// The name of the sprite sheet to use. + /// + public abstract string ShipsetSpriteSheetName { get; } + + /// + /// The size of each sprite, in pixels. + /// + public abstract Size SpriteSize { get; } + + public Image GetIcon(string shipset) + { + // see if we have a positive number to use a sprite sheet + int index = 0; + int.TryParse(Name, out index); + + if (index > 0) + { + // use sprite sheets + var shipsetSpriteSheet = LoadShipsetSpriteSheet(shipset); + Image spriteSheet; + Point offset; + if (shipsetSpriteSheet != null) + { + // crop shipset sprite sheet + spriteSheet = shipsetSpriteSheet; + offset = ShipsetSpriteOffset; + } + else if (GlobalSpriteSheet != null) + { + // crop global sprite sheet + spriteSheet = GlobalSpriteSheet; + offset = GlobalSpriteOffset; + } + else + { + // no sprite sheets found + return Pictures.GetModImage( + Path.Combine("Pictures", "Races", shipset, Name), + Path.Combine("Pictures", "Races", shipset, shipset + "_" + Name), + Path.Combine("Pictures", "Combat", Name)); + } + + // make sprite + var spritesAcross = (spriteSheet.Width - offset.X) / SpriteSize.Width; + var num = index - 1; + var row = num / spritesAcross; + var col = num % spritesAcross; + var pos = new Point(offset.X + SpriteSize.Width * col, offset.Y + SpriteSize.Height * row); + return spriteSheet.Crop(pos, SpriteSize); + } + else + { + // use individual sprites + return Pictures.GetModImage( + Path.Combine("Pictures", "Races", shipset, Name), + Path.Combine("Pictures", "Races", shipset, shipset + "_" + Name), + Path.Combine("Pictures", "Combat", Name)); + } + } + + public Image LoadShipsetSpriteSheet(string shipset) + { + return Pictures.GetModImage(Path.Combine("Pictures", "Races", shipset, ShipsetSpriteSheetName)); + } +} \ No newline at end of file diff --git a/FrEee/Objects/Combat/WeaponTargets.cs b/FrEee.Core/Processes/Combat/WeaponTargets.cs similarity index 92% rename from FrEee/Objects/Combat/WeaponTargets.cs rename to FrEee.Core/Processes/Combat/WeaponTargets.cs index 89e08d0bf..f542461ad 100644 --- a/FrEee/Objects/Combat/WeaponTargets.cs +++ b/FrEee.Core/Processes/Combat/WeaponTargets.cs @@ -1,7 +1,8 @@ using FrEee.Utility; using System; +using FrEee.Utility; -namespace FrEee.Objects.Combat; +namespace FrEee.Processes.Combat; /// /// Used to limit what a weapon can fire at. diff --git a/FrEee/Objects/Combat/WeaponTypes.cs b/FrEee.Core/Processes/Combat/WeaponTypes.cs similarity index 96% rename from FrEee/Objects/Combat/WeaponTypes.cs rename to FrEee.Core/Processes/Combat/WeaponTypes.cs index 9f62197c3..2dbc74fc0 100644 --- a/FrEee/Objects/Combat/WeaponTypes.cs +++ b/FrEee.Core/Processes/Combat/WeaponTypes.cs @@ -1,6 +1,7 @@ using System; using FrEee.Utility; -namespace FrEee.Objects.Combat; +using FrEee.Utility; +namespace FrEee.Processes.Combat; /// /// Types of weapons. diff --git a/FrEee/Setup/EmpirePlacement.cs b/FrEee.Core/Processes/Setup/EmpirePlacement.cs similarity index 79% rename from FrEee/Setup/EmpirePlacement.cs rename to FrEee.Core/Processes/Setup/EmpirePlacement.cs index 726ee01e0..ecead3ddc 100644 --- a/FrEee/Setup/EmpirePlacement.cs +++ b/FrEee.Core/Processes/Setup/EmpirePlacement.cs @@ -1,5 +1,6 @@ using FrEee.Utility; -namespace FrEee.Setup; +using FrEee.Utility; +namespace FrEee.Processes.Setup; public enum EmpirePlacement { diff --git a/FrEee.Core/Processes/Setup/EmpireTemplate.cs b/FrEee.Core/Processes/Setup/EmpireTemplate.cs new file mode 100644 index 000000000..c08a0c690 --- /dev/null +++ b/FrEee.Core/Processes/Setup/EmpireTemplate.cs @@ -0,0 +1,192 @@ +using FrEee.Objects.Civilization; +using FrEee.Modding; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Serialization; + +namespace FrEee.Processes.Setup; + +/// +/// A template for configuring an empire. +/// +public class EmpireTemplate : ITemplate +{ + public EmpireTemplate() + { + } + + /// + /// The name of the AI used by this empire. + /// + public string AIName { get; set; } + + /// + /// Can random AI empires use this empire template? + /// + public bool AIsCanUse { get; set; } + + /// + /// The color used to represent this empire. + /// + public Color Color { get; set; } + + /// + /// The empire's culture. + /// + [DoNotSerialize] + public Culture Culture + { + get { return Mod.Current.Cultures.SingleOrDefault(c => c.Name == CultureName); } + set { CultureName = value == null ? null : value.Name; } + } + + public string CultureName { get; set; } + + /// + /// The insignia of the empire. + /// + public Image Insignia + { + get + { + return Pictures.GetIcon(this); + } + } + + /// + /// The name of this empire's insignia. + /// + public string InsigniaName { get; set; } + + /// + /// Is this a minor empire? Minor empires cannot use warp points. + /// + public bool IsMinorEmpire { get; set; } + + /// + /// Is this empire controlled by a human player? + /// + public bool IsPlayerEmpire { get; set; } + + /// + /// The name of the leader of this empire. + /// + public string LeaderName { get; set; } + + /// + /// The name of the leader portrait used by this empire. + /// + public string LeaderPortraitName { get; set; } + + /// + /// The name of the empire. + /// + public string Name { get; set; } + + /// + /// Empire setup points spent. + /// + public int PointsSpent + { + get + { + int result = 0; + foreach (var t in PrimaryRace.Traits) + result += t.Cost.Value; + result += PrimaryRace.Aptitudes.Sum(kvp => Aptitude.All.FindByName(kvp.Key).GetCost(kvp.Value)); + return result; + } + } + + /// + /// The native race of this empire. + /// + public Race PrimaryRace { get; set; } + + /// + /// The name of the shipset used by this empire. + /// + public string ShipsetName { get; set; } + + /// + /// The name of the design names file used by this empire. + /// + public string DesignNamesFile { get; set; } + + public static EmpireTemplate Load(string filename) + { + var fs = new FileStream(filename, FileMode.Open); + var race = Serializer.Deserialize(fs); + fs.Close(); fs.Dispose(); + return race; + } + + public IEnumerable GetWarnings(int maxPoints) + { + if (PrimaryRace == null) + yield return "You must specify a primary race for your empire."; + else + { + foreach (var w in PrimaryRace.Warnings) + yield return w; + } + if (string.IsNullOrWhiteSpace(Name)) + yield return "You must specify a name for your empire."; + if (string.IsNullOrWhiteSpace(LeaderName)) + yield return "You must specify a leader name for your empire."; + if (string.IsNullOrWhiteSpace(LeaderPortraitName)) + yield return "You must specify a leader portrait for your empire."; + if (string.IsNullOrWhiteSpace(InsigniaName)) + yield return "You must specify an insignia for your empire."; + if (string.IsNullOrWhiteSpace(ShipsetName)) + yield return "You must specify a shipset for your empire."; + if (Color.R < 85 && Color.G < 85 & Color.B < 85) + yield return "The color you specified for your empire is too dark to be visible. Please make sure that at least one of the RGB values is 85 or more."; + if (Color.A < 255) + yield return "Transparent empire colors are not allowed."; + if (Culture == null) + yield return "You must specify a culture for your empire."; + if (!IsPlayerEmpire && Mod.Current.EmpireAIs.FindByName(AIName) == null) + yield return "AI empires require an AI script."; + if (PointsSpent > maxPoints) + yield return "You have spent too many empire setup points. Only " + maxPoints + " are available."; + } + + public Empire Instantiate() + { + var emp = new Empire(); + emp.Name = Name; + emp.LeaderName = LeaderName; + emp.Color = Color; + emp.PrimaryRace = PrimaryRace; + emp.LeaderPortraitName = LeaderPortraitName; + emp.InsigniaName = InsigniaName ?? PrimaryRace.Name; + emp.ShipsetPath = ShipsetName ?? PrimaryRace.Name; + emp.LeaderPortraitName = LeaderPortraitName ?? PrimaryRace.Name; + emp.Culture = Culture; + emp.IsPlayerEmpire = IsPlayerEmpire; + emp.IsMinorEmpire = IsMinorEmpire; + emp.AI = Mod.Current.EmpireAIs.FindByName(AIName); + emp.DesignNamesFile = DesignNamesFile; + + return emp; + } + + public void Save(string filename) + { + var fs = new FileStream(filename, FileMode.Create); + Serializer.Serialize(this, fs); + fs.Close(); fs.Dispose(); + } + + public override string ToString() + { + return Name; + } +} diff --git a/FrEee.Core/Processes/Setup/GameSetup.cs b/FrEee.Core/Processes/Setup/GameSetup.cs new file mode 100644 index 000000000..d58b03d2d --- /dev/null +++ b/FrEee.Core/Processes/Setup/GameSetup.cs @@ -0,0 +1,696 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using FrEee.Objects.Civilization; +using FrEee.Objects.Space; +using FrEee.Objects.Technology; +using FrEee.Objects.VictoryConditions; +using FrEee.Modding; +using FrEee.Modding.Templates; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Extensions; +using FrEee.Objects.GameState; +using FrEee.Objects.Civilization.Diplomacy; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Serialization; +using FrEee.Processes.Setup.WarpPointPlacementStrategies; + +namespace FrEee.Processes.Setup; + +/// +/// Setup parameters for a game. +/// +[Serializable] +public class GameSetup +{ + public GameSetup() + { + EmpireTemplates = new List(); + ForbiddenTechnologyNames = new List(); + VictoryConditions = new List(); + VictoryConditions.Add(new TotalEliminationVictoryCondition()); + } + + /// + /// Allowed trades in this game. + /// + public AllowedTrades AllowedTrades { get; set; } + + /// + /// Should all systems start explored for all players? + /// + public bool AllSystemsExplored { get; set; } + + public bool CanColonizeOnlyBreathable { get; set; } + + public bool CanColonizeOnlyHomeworldSurface { get; set; } + + public EmpirePlacement EmpirePlacement { get; set; } + + public int EmpirePoints { get; set; } + + /// + /// Empire templates in this game setup. + /// + public IList EmpireTemplates { get; private set; } + + /// + /// Per mille chance of a random event occurring, per turn, per player. + /// + public double EventFrequency { get; set; } + + /// + /// The maximum event severity in this game. + /// + public EventSeverity MaximumEventSeverity { get; set; } + + /// + /// Technologies that are locked at level zero. + /// + public IList ForbiddenTechnologyNames { get; private set; } + + /// + /// The size of the galaxy. + /// + public Size GalaxySize { get; set; } + + /// + /// The galaxy template to use. + /// + [DoNotSerialize] + public GalaxyTemplate GalaxyTemplate + { + get { return Mod.Current.GalaxyTemplates.FindByName(GalaxyTemplateName); } + set { GalaxyTemplateName = value.Name; } + } + + public string GalaxyTemplateName + { + get; + private set; + } + + /// + /// The name of the game. Used in save file names. + /// + public string GameName { get; set; } + + public bool GenerateRandomRuins { get; set; } + + public bool GenerateUniqueRuins { get; set; } + + public StellarObjectSize HomeworldSize { get; set; } + + public int HomeworldsPerEmpire { get; set; } + + public int HomeworldValue { get; set; } + + public bool IsAnalysisAllowed { get; set; } + + /// + /// Is this a "humans vs. AI" game? + /// + public bool IsHumansVsAI { get; set; } + + public bool IsIntelligenceAllowed { get; set; } + + /// + /// Are we setting up a single player game? + /// + public bool IsSinglePlayer { get { return EmpireTemplates.Where(et => et.IsPlayerEmpire).Count() == 1; } } + + public bool IsSurrenderAllowed { get; set; } + + public int MaxHomeworldDispersion { get; set; } + + public int MaxPlanetValue { get; set; } + + public int MaxSpawnedAsteroidValue { get; set; } + + public int MaxSpawnedPlanetValue { get; set; } + + public int MinAsteroidValue { get; set; } + + public int MinorEmpires { get; set; } + + public int MinPlanetValue { get; set; } + + public int MinSpawnedAsteroidValue { get; set; } + + public int MinSpawnedPlanetValue { get; set; } + + /// + /// Should players have an omniscient view of all explored systems? + /// Does not prevent cloaking from working; this is just basic sight. + /// Also does not give battle reports for other empires' battles. + /// + public bool OmniscientView { get; set; } + + public int RandomAIs { get; set; } + + /// + /// Model to use for remote mining. + /// + public MiningModel RemoteMiningModel { get; set; } + + /// + /// The research points granted to empires per unspent empire point. + /// + public decimal ResearchPointsPerUnspentEmpirePoint { get; set; } + + public int ResourceStorage { get; set; } + + public ScoreDisplay ScoreDisplay { get; set; } + + public int Seed { get; set; } + + /// + /// Model to use for standard planetary mining. + /// + public MiningModel StandardMiningModel { get; set; } + + /// + /// How many star systems will be in the galaxy? + /// + public int StarSystemCount { get; set; } + + /// + /// Number of groups of connected star systems to generate. + /// 1 = all warp points connected + /// 2 = 2 distinct groups + /// ... + /// StarSystemCount = no warp points + /// + public int StarSystemGroups { get; set; } + + public int StartingResearch { get; set; } + + public int StartingResources { get; set; } + + /// + /// The starting technology level for empires. + /// TODO - have a separate starting tech level setting for neutrals? + /// + public StartingTechnologyLevel StartingTechnologyLevel { get; set; } + + /// + /// Technology research cost formula. + /// Low = Level * BaseCost + /// Medium = BaseCost for level 1, Level ^ 2 * BaseCost / 2 otherwise + /// Hight = Level ^ 2 * BaseCost + /// + public TechnologyCost TechnologyCost { get; set; } + + /// + /// The technology uniqueness factor. + /// Tech cost is increased if other players know a tech and this factor is positive, or decreased if it's negative. + /// + public int TechnologyUniqueness { get; set; } + + /// + /// Game victory conditions. + /// + public IList VictoryConditions { get; private set; } + + /// + /// Delay in turns before victory conditions take effect. + /// + public int VictoryDelay { get; set; } + + /// + /// Problems with this game setup. + /// + public IEnumerable Warnings + { + get + { + if (string.IsNullOrWhiteSpace(GameName)) + yield return "You must specify a name for the game."; + if (GalaxyTemplate == null) // TODO - default to first galaxy template? + yield return "You must specify a galaxy type."; + if (StarSystemCount > GalaxySize.Width * GalaxySize.Height) + yield return "The galaxy is too small to contain " + StarSystemCount + " star systems."; + if (EmpirePlacement != EmpirePlacement.CanStartInSameSystem && EmpireTemplates.Count + RandomAIs + MinorEmpires > StarSystemCount) + yield return "There are not enough star systems to give " + (EmpireTemplates.Count + RandomAIs + MinorEmpires) + " empires and minor races each their own home system."; + if (HomeworldSize == null) + yield return "You must specify a homeworld size."; + if (!EmpireTemplates.Any() && RandomAIs == 0) + yield return "You must add at least one empire."; + foreach (var et in EmpireTemplates) + { + if (et.PointsSpent > EmpirePoints) + yield return "The " + et + " has spent too many empire points."; + } + } + } + + /// + /// Strategy for placing warp points within systems. + /// + public WarpPointPlacementStrategy WarpPointPlacementStrategy { get; set; } + + public static GameSetup Load(string filename) + { + var fs = new FileStream(filename, FileMode.Open); + var gsu = Serializer.Deserialize(fs); + fs.Close(); fs.Dispose(); + return gsu; + } + + // TODO - status messages for the GUI + public void PopulateGalaxy(Galaxy gal, PRNG dice) + { + gal.Name = GameName; + + gal.CleanGameState(); + + // remove forbidden techs + foreach (var tname in ForbiddenTechnologyNames.Distinct()) + Mod.Current.Technologies.Single(t => t.Name == tname).Dispose(); + + // set omniscient view and all systems seen flags + gal.OmniscientView = OmniscientView; + gal.AllSystemsExploredFromStart = AllSystemsExplored; + + // set up mining models and resource stuff + gal.StandardMiningModel = StandardMiningModel; + gal.RemoteMiningModel = RemoteMiningModel; + gal.MinPlanetValue = MinPlanetValue; + gal.MinSpawnedPlanetValue = MinSpawnedPlanetValue; + gal.MaxSpawnedPlanetValue = MaxSpawnedPlanetValue; + gal.MaxPlanetValue = MaxPlanetValue; + gal.MinAsteroidValue = MinAsteroidValue; + gal.MinSpawnedAsteroidValue = MinSpawnedAsteroidValue; + gal.MaxSpawnedAsteroidValue = MaxSpawnedAsteroidValue; + + // set score display setting + gal.ScoreDisplay = ScoreDisplay; + + // set up victory conditions + foreach (var vc in VictoryConditions) + gal.VictoryConditions.Add(vc); + gal.VictoryDelay = VictoryDelay; + + // set up misc. game options + gal.TechnologyCost = TechnologyCost; + gal.TechnologyUniqueness = TechnologyUniqueness; + gal.IsHumansVsAI = IsHumansVsAI; + gal.AllowedTrades = AllowedTrades; + gal.IsSurrenderAllowed = IsSurrenderAllowed; + gal.IsIntelligenceAllowed = IsIntelligenceAllowed; + gal.CanColonizeOnlyBreathable = CanColonizeOnlyBreathable; + gal.CanColonizeOnlyHomeworldSurface = CanColonizeOnlyHomeworldSurface; + gal.WarpPointPlacementStrategy = WarpPointPlacementStrategy; + + // create player empires + foreach (var et in EmpireTemplates) + { + var emp = et.Instantiate(); + gal.Empires.Add(emp); + } + + // TODO - make sure empires don't reuse colors unless we really have to? + + // create random AI empires + for (int i = 1; i <= RandomAIs; i++) + { + // TODO - load saved EMP files for random AI empires + var surface = Mod.Current.StellarObjectTemplates.OfType().Where(p => !p.Size.IsConstructed).Select(p => p.Surface).Distinct().PickRandom(dice); + var atmosphere = Mod.Current.StellarObjectTemplates.OfType().Where(p => !p.Size.IsConstructed && p.Surface == surface).Select(p => p.Atmosphere).Distinct().PickRandom(dice); + var et = new EmpireTemplate + { + Name = "Random Empire #" + i, + LeaderName = "Random Leader #" + i, + PrimaryRace = new Race + { + Name = "Random Race #" + i, + NativeAtmosphere = atmosphere, + NativeSurface = surface, + }, + IsPlayerEmpire = false, + Color = RandomColor(dice), + Culture = Mod.Current.Cultures.PickRandom(dice), + AIName = Mod.Current.EmpireAIs.PickRandom(dice).Name, + }; + foreach (var apt in Aptitude.All) + et.PrimaryRace.Aptitudes[apt.Name] = 100; + var emp = et.Instantiate(); + gal.Empires.Add(emp); + } + + // create minor empires + for (int i = 1; i <= MinorEmpires; i++) + { + // TODO - load saved EMP files for minor empires + var surface = Mod.Current.StellarObjectTemplates.OfType().Where(p => !p.Size.IsConstructed).Select(p => p.Surface).Distinct().PickRandom(dice); + var atmosphere = Mod.Current.StellarObjectTemplates.OfType().Where(p => !p.Size.IsConstructed && p.Surface == surface).Select(p => p.Atmosphere).Distinct().PickRandom(dice); + var et = new EmpireTemplate + { + Name = "Minor Empire #" + i, + LeaderName = "Minor Leader #" + i, + PrimaryRace = new Race + { + Name = "Minor Race #" + i, + NativeAtmosphere = atmosphere, + NativeSurface = surface, + }, + IsPlayerEmpire = false, + IsMinorEmpire = true, + Color = RandomColor(dice), + Culture = Mod.Current.Cultures.PickRandom(dice), + AIName = Mod.Current.EmpireAIs.PickRandom(dice).Name, + }; + foreach (var apt in Aptitude.All) + et.PrimaryRace.Aptitudes[apt.Name] = 100; + var emp = et.Instantiate(); + gal.Empires.Add(emp); + } + + // place empires + // don't do them in any particular order, so P1 and P2 don't always wind up on opposite sides of the galaxy when using equidistant placement + foreach (var emp in gal.Empires.Shuffle(dice)) + PlaceEmpire(gal, emp, dice); + + + //Enabled AI ministers, so the AI's actually can do stuff. + foreach (var emp in gal.Empires.Where(x => !x.IsPlayerEmpire && x.AI != null)) + emp.EnabledMinisters = emp.AI.MinisterNames; + + // remove ruins if they're not allowed + if (!GenerateRandomRuins) + { + foreach (var p in gal.FindSpaceObjects()) + { + foreach (var abil in p.IntrinsicAbilities.ToArray()) + { + if (abil.Rule.Matches("Ancient Ruins")) + p.IntrinsicAbilities.Remove(abil); + } + } + } + if (!GenerateUniqueRuins) + { + foreach (var p in gal.FindSpaceObjects()) + { + foreach (var abil in p.IntrinsicAbilities.ToArray()) + { + if (abil.Rule.Matches("Ancient Ruins Unique")) + p.IntrinsicAbilities.Remove(abil); + } + } + } + + // also remove ruins from homeworlds, that's just silly :P + foreach (var p in gal.FindSpaceObjects().Where(p => p.Colony != null)) + { + foreach (var abil in p.IntrinsicAbilities.ToArray()) + { + if (abil.Rule.Matches("Ancient Ruins") || abil.Rule.Matches("Ancient Ruins Unique")) + p.IntrinsicAbilities.Remove(abil); + } + } + + // set up omniscient view + if (OmniscientView) + { + foreach (var emp in gal.Empires) + { + foreach (var sys in gal.StarSystemLocations.Select(l => l.Item)) + sys.ExploredByEmpires.Add(emp); + } + } + } + + public void Save(string filename) + { + var fs = new FileStream(filename, FileMode.Create); + Serializer.Serialize(this, fs); + fs.Close(); fs.Dispose(); + } + + /// + /// Makes a suitable homeworld for an empire. + /// + /// + private Planet MakeHomeworld(Empire emp, string hwName, PRNG dice) + { + var hw = Mod.Current.StellarObjectTemplates.OfType().Where(p => + p.Surface == emp.PrimaryRace.NativeSurface && + p.Atmosphere == emp.PrimaryRace.NativeAtmosphere && + p.Size == HomeworldSize) + .PickRandom(dice); + if (hw == null) + throw new Exception("No planets found in SectType.txt with surface " + emp.PrimaryRace.NativeSurface + ", atmosphere " + emp.PrimaryRace.NativeAtmosphere + ", and size " + HomeworldSize + ". Such a planet is required for creating the " + emp + " homeworld."); + hw = hw.Instantiate(); + hw.Name = hwName; + hw.Size = HomeworldSize; + hw.ConditionsAmount = Mod.Current.Settings.HomeworldConditions; + return hw; + } + + // TODO - status messages for the GUI + private void PlaceEmpire(Galaxy gal, Empire emp, PRNG dice) + { + if (AllSystemsExplored) + { + // set all systems explored + foreach (var sys in gal.StarSystemLocations.Select(ssl => ssl.Item)) + sys.ExploredByEmpires.Add(emp); + } + + // give empire starting techs + Galaxy.Current.CleanGameState(); // need to know what the techs in the game are! + foreach (var tech in Mod.Current.Technologies.Where(t => !t.IsRacial || emp.Abilities().Any(a => a.Rule.Matches("Tech Area") && a.Value1 == t.RacialTechID))) + { + switch (StartingTechnologyLevel) + { + case StartingTechnologyLevel.Low: + emp.ResearchedTechnologies[tech] = tech.StartLevel; + break; + + case StartingTechnologyLevel.Medium: + emp.ResearchedTechnologies[tech] = Math.Max(tech.StartLevel, tech.RaiseLevel); + break; + + case StartingTechnologyLevel.High: + emp.ResearchedTechnologies[tech] = tech.MaximumLevel; + break; + } + } + + // give empire starting resources and storage capacity + foreach (var r in Resource.All.Where(r => r.IsGlobal)) + { + emp.StoredResources.Add(r, StartingResources); + emp.IntrinsicResourceStorage.Add(r, ResourceStorage); + } + + // give empire starting research + emp.BonusResearch = StartingResearch + (int)(ResearchPointsPerUnspentEmpirePoint * (EmpirePoints - emp.PrimaryRace.PointsSpent)); + + // TODO - moddable colony techs? + string colonyTechName = null; + if (emp.PrimaryRace.NativeSurface == "Rock") + colonyTechName = "Rock Planet Colonization"; + else if (emp.PrimaryRace.NativeSurface == "Ice") + colonyTechName = "Ice Planet Colonization"; + else if (emp.PrimaryRace.NativeSurface == "Gas Giant") + colonyTechName = "Gas Giant Colonization"; + var colonyTech = Mod.Current.Technologies.SingleOrDefault(t => t.Name == colonyTechName); + if (colonyTech != null && emp.ResearchedTechnologies[colonyTech] < 1) + emp.ResearchedTechnologies[colonyTech] = 1; + + // find facilities to place on homeworlds + var facils = emp.UnlockedItems.OfType(); + var sy = facils.LastOrDefault(facil => facil.HasAbility("Space Yard")); + var sp = facils.LastOrDefault(facil => facil.HasAbility("Spaceport")); + var rd = facils.LastOrDefault(facil => facil.HasAbility("Supply Generation")); + var min = facils.WithMax(facil => facil.GetAbilityValue("Resource Generation - Minerals").ToInt()).LastOrDefault(); + var org = facils.WithMax(facil => facil.GetAbilityValue("Resource Generation - Organics").ToInt()).LastOrDefault(); + var rad = facils.WithMax(facil => facil.GetAbilityValue("Resource Generation - Radioactives").ToInt()).LastOrDefault(); + var res = facils.WithMax(facil => facil.GetAbilityValue("Point Generation - Research").ToInt()).LastOrDefault(); + // TODO - game setup option for intel facilities on homeworlds? HomeworldStartingFacilities.txt ala se5? + + // SY rate, for colonies + var rate = new ResourceQuantity(); + if (sy != null) + { + // TODO - define mappings between SY ability numbers and resource names in a mod file + rate.Add(Resource.Minerals, sy.GetAbilityValue("Space Yard", 2, true, true, a => a.Value1 == "1").ToInt()); + rate.Add(Resource.Organics, sy.GetAbilityValue("Space Yard", 2, true, true, a => a.Value1 == "2").ToInt()); + rate.Add(Resource.Radioactives, sy.GetAbilityValue("Space Yard", 2, true, true, a => a.Value1 == "3").ToInt()); + } + + // build connectivity graph for computing warp distance + var graph = new ConnectivityGraph(); + foreach (var s in Galaxy.Current.StarSystemLocations.Select(ssl => ssl.Item)) + graph.Add(s); + foreach (var s in Galaxy.Current.StarSystemLocations.Select(ssl => ssl.Item)) + { + foreach (var wp in s.FindSpaceObjects()) + graph.Connect(s, wp.TargetStarSystemLocation.Item, true); + } + + for (int i = 0; i < HomeworldsPerEmpire; i++) + { + // TODO - respect Empire Placement and Max Homeworld Dispersion settings + var planets = gal.StarSystemLocations.SelectMany(ssl => ssl.Item.FindSpaceObjects(p => p.Owner == null && p.MoonOf == null)); + var okSystems = gal.StarSystemLocations.Select(ssl => ssl.Item).Where(sys => sys.EmpiresCanStartIn); + if (i > 0) + { + // make sure subsequent homeworlds are placed within a limited number of warps from the first homeworld + okSystems = okSystems.Where(sys => graph.ComputeDistance(sys, emp.OwnedSpaceObjects.OfType().First().FindStarSystem()) <= MaxHomeworldDispersion); + } + switch (EmpirePlacement) + { + case EmpirePlacement.CanStartInSameSystem: + // no further filtering + break; + + case EmpirePlacement.DifferentSystems: + // filter to systems containing no other empires' homeworlds + okSystems = okSystems.Where(sys => !sys.FindSpaceObjects(p => p.Owner != null && p.Owner != emp).Any()); + break; + + case EmpirePlacement.Equidistant: + // filter to systems containing no other empires' homeworlds + okSystems = okSystems.Where(sys => !sys.FindSpaceObjects(p => p.Owner != null && p.Owner != emp).Any()); + // filter to systems that are the maximum distance away from any other empire's homeworlds + var otherEmpireHomeSystems = gal.StarSystemLocations.SelectMany(ssl => ssl.Item.FindSpaceObjects(p => p.Owner != null && p.Owner != emp).Select(p => p.FindStarSystem()).Distinct()).ToArray(); + okSystems = okSystems.WithMax(sys => otherEmpireHomeSystems.Min(o => graph.ComputeDistance(sys, o))); + break; + } + okSystems = okSystems.ToArray(); + if (!okSystems.Any()) + { + // replace an inhospitable system with a hospitable one + var convertSys = gal.StarSystemLocations.Select(ssl => ssl.Item).Where(sys => !sys.EmpiresCanStartIn).PickRandom(dice); + if (convertSys == null) + throw new Exception("No suitable system found to place " + emp + "'s homeworld #" + (i + 1) + ". (Try increasing the number of star systems.)"); + var newSys = Mod.Current.StarSystemTemplates.Where(q => q.EmpiresCanStartIn).PickRandom(dice).Instantiate(); + var sid = convertSys.ID; + newSys.CopyTo(convertSys); + convertSys.ID = sid; + convertSys.Name = Mod.Current.StarSystemNames.Except(gal.StarSystemLocations.Select(q => q.Item.Name)).PickRandom(dice); + foreach (var l in Galaxy.Current.StarSystemLocations) + { + foreach (var wp in l.Item.FindSpaceObjects().Where(q => q.Target.StarSystem == convertSys).ToArray()) + { + wp.Dispose(); + WarpPointPlacementStrategy.PlaceWarpPoints(Galaxy.Current.StarSystemLocations.Single(q => q.Item == convertSys), l); + } + } + GalaxyTemplate.NameStellarObjects(convertSys); + okSystems = new[] { convertSys }; + } + Planet hw; + planets = planets.Where(p => okSystems.Contains(p.FindStarSystem())); + if (!planets.Any()) + { + // make sure we're placing the homeworld in a system with at least one empty sector + okSystems = okSystems.Where(sys2 => sys2.Sectors.Any(sec => !sec.SpaceObjects.Any())); + + if (!okSystems.Any()) + throw new Exception("No suitable system found to place " + emp + "'s homeworld #" + (i + 1) + ". (Try regenerating the map or increasing the number of star systems.)"); + + // make brand new planet in an OK system + var sys = okSystems.PickRandom(dice); + var nextNum = sys.FindSpaceObjects(p => p.MoonOf == null).Count() + 1; + hw = MakeHomeworld(emp, sys.Name + " " + nextNum.ToRomanNumeral(), dice); + var okSectors = sys.Sectors.Where(sector => !sector.SpaceObjects.Any()); + okSectors.PickRandom(dice).Place(hw); + } + else + hw = planets.PickRandom(dice); + if (hw.Surface != emp.PrimaryRace.NativeSurface || hw.Atmosphere != emp.PrimaryRace.NativeAtmosphere || hw.Size != HomeworldSize) + { + var replacementHomeworld = MakeHomeworld(emp, hw.Name, dice); + replacementHomeworld.CopyTo(hw); + } + hw.ResourceValue[Resource.Minerals] = hw.ResourceValue[Resource.Organics] = hw.ResourceValue[Resource.Radioactives] = HomeworldValue; + hw.Colony = new Colony + { + Owner = emp, + ConstructionQueue = new(hw), + IsHomeworld = true, + }; + hw.AddPopulation(emp.PrimaryRace, hw.Size.MaxPopulation); + + // function to create a facility if possible + void TryCreateFacility(FacilityTemplate? template) + { + if (template is not null && hw.Colony.Facilities.Count < hw.MaxFacilities) + { + var facility = template.Instantiate(); + hw.Colony.Facilities.Add(facility); + facility.ConstructionProgress = facility.Cost; + } + } + + // create basic facilities, one each + TryCreateFacility(sy); + if (!emp.PrimaryRace.HasAbility("No Spaceports")) + { + TryCreateFacility(sp); + } + TryCreateFacility(rd); + TryCreateFacility(rad); + TryCreateFacility(org); + + // fill remaining space with half mineral miners and half research facilities + var lastCount = 0; + while (hw.Colony.Facilities.Count < hw.MaxFacilities && hw.Colony.Facilities.Count > lastCount) + { + lastCount = hw.Colony.Facilities.Count; + + TryCreateFacility(min); + + // no research facilities needed at max tech! + if (StartingTechnologyLevel != StartingTechnologyLevel.High) + { + TryCreateFacility(res); + } + } + } + + // mark home systems explored + foreach (var sys in gal.StarSystemLocations.Select(ssl => ssl.Item)) + { + if (!sys.ExploredByEmpires.Contains(emp) && sys.FindSpaceObjects().Any(planet => planet.Owner == emp)) + sys.ExploredByEmpires.Add(emp); + } + + // in case two empires started in the same system + foreach (var x in gal.FindSpaceObjects().Owned().ToArray()) + x.UpdateEmpireMemories(); + } + + /// + /// Picks a random color from a limited palette of 63 colors. + /// + /// + private Color RandomColor(PRNG dice) + { + int r = 0, g = 0, b = 0; + while (r == 0 && g == 0 && b == 0) + { + r = RandomRGB(dice); + g = RandomRGB(dice); + b = RandomRGB(dice); + } + return Color.FromArgb(r, g, b); + } + + /// + /// Generates a random number used to pick a color from a limited palette of 63 colors. + /// + /// + private int RandomRGB(PRNG dice) + { + return RandomHelper.Range(0, 3, dice) * 85; + } +} diff --git a/FrEee/Setup/ScoreDisplay.cs b/FrEee.Core/Processes/Setup/ScoreDisplay.cs similarity index 87% rename from FrEee/Setup/ScoreDisplay.cs rename to FrEee.Core/Processes/Setup/ScoreDisplay.cs index a3a12fe2b..a6c0809bb 100644 --- a/FrEee/Setup/ScoreDisplay.cs +++ b/FrEee.Core/Processes/Setup/ScoreDisplay.cs @@ -1,7 +1,8 @@ using FrEee.Utility; using System; +using FrEee.Utility; -namespace FrEee.Setup; +namespace FrEee.Processes.Setup; [Flags] public enum ScoreDisplay diff --git a/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/ClusteredStarSystemPlacementStrategy.cs b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/ClusteredStarSystemPlacementStrategy.cs new file mode 100644 index 000000000..dded2fd02 --- /dev/null +++ b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/ClusteredStarSystemPlacementStrategy.cs @@ -0,0 +1,64 @@ +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Processes.Setup.StarSystemPlacementStrategies; + +/// +/// Places stars grouped together in tight clusters separated by long distances. +/// +[Serializable] +public class ClusteredStarSystemPlacementStrategy : IStarSystemPlacementStrategy +{ + public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) + { + var openPositions = bounds.GetAllPoints(); + foreach (var sspos in galaxy.StarSystemLocations.Select(sspos => sspos.Location)) + openPositions = openPositions.BlockOut(sspos, buffer); + if (!openPositions.Any()) + return null; + + // sort positions by distance to nearest star + var ordered = openPositions.Select(p => new + { + Position = p, + Distances = galaxy.StarSystemLocations.Select(sspos => sspos.Location.ManhattanDistance(p)).OrderBy(dist => dist) + }).OrderBy(p => p.Distances.MinOrDefault()); + var minDist = ordered.SelectMany(p => p.Distances).MinOrDefault(); + + if (dice.Next(2) == 0) + { + // place a star near other stars, but not near TOO many other stars + var ok = ordered.Where(item => item.Distances.FirstOrDefault() == minDist); + Dictionary dict; + if (ok.Any()) + { + dict = new Dictionary(); + foreach (var p in ok) + dict.Add(p.Position, 1d / p.Distances.Sum(d => Math.Pow(d, 3))); + } + else + { + // place a star off in the middle of nowhere + dict = new Dictionary(); + foreach (var p in ordered) + dict.Add(p.Position, p.Distances.Sum(d => Math.Pow(d, 3))); + } + return dict.PickWeighted(dice); + } + else + { + // place a star off in the middle of nowhere + var dict = new Dictionary(); + foreach (var p in ordered) + dict.Add(p.Position, p.Distances.Sum(d => Math.Pow(d, 3))); + return dict.PickWeighted(dice); + } + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/DiffuseStarSystemPlacementStrategy.cs b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/DiffuseStarSystemPlacementStrategy.cs new file mode 100644 index 000000000..b2d4823e2 --- /dev/null +++ b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/DiffuseStarSystemPlacementStrategy.cs @@ -0,0 +1,32 @@ +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Drawing; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Processes.Setup.StarSystemPlacementStrategies; + +/// +/// Places stars spaced roughly evenly. +/// +[Serializable] +public class DiffuseStarSystemPlacementStrategy : IStarSystemPlacementStrategy +{ + public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) + { + var openPositions = bounds.GetAllPoints(); + foreach (var sspos in galaxy.StarSystemLocations.Select(sspos => sspos.Location)) + openPositions = openPositions.BlockOut(sspos, buffer); + if (!openPositions.Any()) + return null; + + // sort positions by distance to nearest star + var ordered = openPositions.OrderBy(p => galaxy.StarSystemLocations.Select(sspos => sspos.Location).MinOrDefault(p2 => p2.ManhattanDistance(p))); + + // place a star off in the middle of nowhere + return ordered.Last(); + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/GridStarSystemPlacementStrategy.cs b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/GridStarSystemPlacementStrategy.cs new file mode 100644 index 000000000..fe7b365cb --- /dev/null +++ b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/GridStarSystemPlacementStrategy.cs @@ -0,0 +1,50 @@ +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Drawing; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Utility; + +namespace FrEee.Processes.Setup.StarSystemPlacementStrategies; + +/// +/// Places stars in a grid. +/// +[Serializable] +public class GridStarSystemPlacementStrategy : IStarSystemPlacementStrategy +{ + public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) + { + var openPositions = bounds.GetAllPoints(); + foreach (var sspos in galaxy.StarSystemLocations.Select(sspos => sspos.Location)) + openPositions = openPositions.BlockOut(sspos, buffer); + if (!openPositions.Any()) + return null; + + int totalStars = starsLeft + galaxy.StarSystemLocations.Count; + double xfactor = Math.Sqrt(totalStars) * bounds.Height / bounds.Width; + double yfactor = Math.Sqrt(totalStars) * bounds.Width / bounds.Height; + int xstars = (int)(totalStars / xfactor); + int ystars = (int)(totalStars / yfactor); + + if (xstars * ystars <= galaxy.StarSystemLocations.Count) + return null; + + int row = galaxy.StarSystemLocations.Count % xstars; + int col = galaxy.StarSystemLocations.Count / xstars; + int rowsize, colsize; + if (xstars == 1) + rowsize = bounds.Width / 2; + else + rowsize = bounds.Width / (xstars - 1); + if (ystars == 1) + colsize = bounds.Height / 2; + else + colsize = bounds.Height / (ystars - 1); + + var idealPos = new Point(row * rowsize + bounds.Left, col * colsize + bounds.Top); + + return openPositions.OrderBy(p => p.ManhattanDistance(idealPos)).First(); + } +} \ No newline at end of file diff --git a/FrEee/Setup/StarSystemPlacementStrategies/IStarSystemPlacementStrategy.cs b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/IStarSystemPlacementStrategy.cs similarity index 90% rename from FrEee/Setup/StarSystemPlacementStrategies/IStarSystemPlacementStrategy.cs rename to FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/IStarSystemPlacementStrategy.cs index 483ec0dcd..4bfff1f1a 100644 --- a/FrEee/Setup/StarSystemPlacementStrategies/IStarSystemPlacementStrategy.cs +++ b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/IStarSystemPlacementStrategy.cs @@ -1,8 +1,9 @@ using FrEee.Objects.GameState; using FrEee.Utility; using System.Drawing; +using FrEee.Utility; -namespace FrEee.Setup.StarSystemPlacementStrategies; +namespace FrEee.Processes.Setup.StarSystemPlacementStrategies; /// /// Algorithm for placing star systems on the galaxy map. diff --git a/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/RandomStarSystemPlacementStrategy.cs b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/RandomStarSystemPlacementStrategy.cs new file mode 100644 index 000000000..b03936580 --- /dev/null +++ b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/RandomStarSystemPlacementStrategy.cs @@ -0,0 +1,27 @@ +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Drawing; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Processes.Setup.StarSystemPlacementStrategies; + +/// +/// Places stars randomly. +/// +[Serializable] +public class RandomStarSystemPlacementStrategy : IStarSystemPlacementStrategy +{ + public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) + { + var openPositions = bounds.GetAllPoints(); + foreach (var sspos in galaxy.StarSystemLocations) + openPositions = openPositions.BlockOut(sspos.Location, buffer); + if (!openPositions.Any()) + return null; + return openPositions.PickRandom(dice); + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/SpiralStarSystemPlacementStrategy.cs b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/SpiralStarSystemPlacementStrategy.cs new file mode 100644 index 000000000..2b21e73d1 --- /dev/null +++ b/FrEee.Core/Processes/Setup/StarSystemPlacementStrategies/SpiralStarSystemPlacementStrategy.cs @@ -0,0 +1,35 @@ +using FrEee.Utility; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Processes.Setup.StarSystemPlacementStrategies; + +/// +/// Places stars clustered around the center of the galaxy. +/// +[Serializable] +public class SpiralStarSystemPlacementStrategy : IStarSystemPlacementStrategy +{ + public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) + { + var openPositions = bounds.GetAllPoints(); + foreach (var sspos in galaxy.StarSystemLocations.Select(sspos => sspos.Location)) + openPositions = openPositions.BlockOut(sspos, buffer); + if (!openPositions.Any()) + return null; + + // weight locations based on gradient from distance to center + var center = new Point(bounds.X + bounds.Width / 2, bounds.Y + bounds.Height / 2); + var ordered = openPositions.Select(p => new KeyValuePair(p, Math.Pow(p.ManhattanDistance(center), 2))).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); + var max = ordered.Max(kvp => kvp.Value); + foreach (var p in ordered.Keys.ToArray()) + ordered[p] = max / ordered[p]; + return ordered.PickWeighted(dice); + } +} \ No newline at end of file diff --git a/FrEee/Setup/StartingTechnologyLevel.cs b/FrEee.Core/Processes/Setup/StartingTechnologyLevel.cs similarity index 65% rename from FrEee/Setup/StartingTechnologyLevel.cs rename to FrEee.Core/Processes/Setup/StartingTechnologyLevel.cs index e482b710e..fb97fe0a9 100644 --- a/FrEee/Setup/StartingTechnologyLevel.cs +++ b/FrEee.Core/Processes/Setup/StartingTechnologyLevel.cs @@ -1,4 +1,4 @@ -namespace FrEee.Setup; +namespace FrEee.Processes.Setup; public enum StartingTechnologyLevel { diff --git a/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/CenterWarpPointPlacementStrategy.cs b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/CenterWarpPointPlacementStrategy.cs new file mode 100644 index 000000000..8e30ce96d --- /dev/null +++ b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/CenterWarpPointPlacementStrategy.cs @@ -0,0 +1,26 @@ +using FrEee.Objects.Space; + +namespace FrEee.Processes.Setup.WarpPointPlacementStrategies; + +/// +/// Places warp points at the center of the system. Exploration is easy, but so is setting up chokepoints. +/// +public class CenterWarpPointPlacementStrategy : WarpPointPlacementStrategy +{ + static CenterWarpPointPlacementStrategy() + { + Instance = new CenterWarpPointPlacementStrategy(); + } + + private CenterWarpPointPlacementStrategy() + : base("Center", "Places warp points at the center of the system. Exploration is easy, but so is setting up chokepoints.") + { + } + + public static CenterWarpPointPlacementStrategy Instance { get; private set; } + + public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) + { + return here.Item.GetSector(0, 0); + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/EdgeAlignedWarpPointPlacementStrategy.cs b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/EdgeAlignedWarpPointPlacementStrategy.cs new file mode 100644 index 000000000..225e263f4 --- /dev/null +++ b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/EdgeAlignedWarpPointPlacementStrategy.cs @@ -0,0 +1,34 @@ +using FrEee.Objects.Space; +using FrEee.Extensions; +using System; + +namespace FrEee.Processes.Setup.WarpPointPlacementStrategies; + +/// +/// Places warp points along the edge of the system, aligned with the star systems they lead to. +/// +public class EdgeAlignedWarpPointPlacementStrategy : WarpPointPlacementStrategy +{ + static EdgeAlignedWarpPointPlacementStrategy() + { + Instance = new EdgeAlignedWarpPointPlacementStrategy(); + } + + private EdgeAlignedWarpPointPlacementStrategy() + : base("Edge Aligned", "Places warp points along the edge of the system, aligned with the star systems they lead to.") + { + } + + public static EdgeAlignedWarpPointPlacementStrategy Instance { get; private set; } + + public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) + { + var angle = here.Location.AngleTo(there.Location); + var y = Math.Sin(angle / 180d * Math.PI) * here.Item.Radius; + var x = Math.Cos(angle / 180d * Math.PI) * here.Item.Radius; + var multiplier = here.Item.Radius / Math.Max(Math.Abs(x), Math.Abs(y)); + x *= multiplier; + y *= multiplier; + return here.Item.GetSector((int)Math.Round(x), (int)Math.Round(y)); + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/PlanetWarpPointPlacementStrategy.cs b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/PlanetWarpPointPlacementStrategy.cs new file mode 100644 index 000000000..511dca7f1 --- /dev/null +++ b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/PlanetWarpPointPlacementStrategy.cs @@ -0,0 +1,36 @@ +using FrEee.Objects.Space; +using FrEee.Extensions; +using System.Linq; +using FrEee.Extensions; + +namespace FrEee.Processes.Setup.WarpPointPlacementStrategies; + +/// +/// Places warp points at the location of planets. If there are no planets, warp points will be placed randomly. Planets on warp points will be particularly vulnerable to attack. +/// +public class PlanetWarpPointPlacementStrategy : WarpPointPlacementStrategy +{ + static PlanetWarpPointPlacementStrategy() + { + Instance = new PlanetWarpPointPlacementStrategy(); + } + + private PlanetWarpPointPlacementStrategy() + : base("Planet", "Places warp points at the location of planets. If there are no planets, warp points will be placed randomly. Planets on warp points will be particularly vulnerable to attack.") + { + } + + public static PlanetWarpPointPlacementStrategy Instance { get; private set; } + + public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) + { + var planets = here.Item.FindSpaceObjects(); + if (planets.Any()) + { + var planet = planets.PickRandom(); + return planet.Sector; + } + else + return RandomWarpPointPlacementStrategy.Instance.GetWarpPointSector(here, there); + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/RandomAlignedWarpPointPlacementStrategy.cs b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/RandomAlignedWarpPointPlacementStrategy.cs new file mode 100644 index 000000000..daa618bc3 --- /dev/null +++ b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/RandomAlignedWarpPointPlacementStrategy.cs @@ -0,0 +1,36 @@ +using FrEee.Objects.Space; +using FrEee.Utility; +using FrEee.Extensions; +using System; +using FrEee.Utility; + +namespace FrEee.Processes.Setup.WarpPointPlacementStrategies; + +/// +/// Places warp points randomly within a system, but aligned with the star system they lead to. Exploration is difficult due to needing to traverse entire systems. +/// +public class RandomAlignedWarpPointPlacementStrategy : WarpPointPlacementStrategy +{ + static RandomAlignedWarpPointPlacementStrategy() + { + Instance = new RandomAlignedWarpPointPlacementStrategy(); + } + + private RandomAlignedWarpPointPlacementStrategy() + : base("Random Aligned", "Places warp points randomly within a system, but aligned with the star system they lead to. Exploration is difficult due to needing to traverse entire systems.") + { + } + + public static RandomAlignedWarpPointPlacementStrategy Instance { get; private set; } + + public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) + { + var angle = here.Location.AngleTo(there.Location); + var y = Math.Sin(angle / 180d * Math.PI) * here.Item.Radius; + var x = Math.Cos(angle / 180d * Math.PI) * here.Item.Radius; + var multiplier = RandomHelper.Next(here.Item.Radius / Math.Max(Math.Abs(x), Math.Abs(y))); + x *= multiplier; + y *= multiplier; + return here.Item.GetSector((int)Math.Round(x), (int)Math.Round(y)); + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/RandomWarpPointPlacementStrategy.cs b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/RandomWarpPointPlacementStrategy.cs new file mode 100644 index 000000000..5145792d4 --- /dev/null +++ b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/RandomWarpPointPlacementStrategy.cs @@ -0,0 +1,29 @@ +using FrEee.Objects.Space; +using FrEee.Utility; +using FrEee.Utility; +namespace FrEee.Processes.Setup.WarpPointPlacementStrategies; + +/// +/// Places warp points randomly within a system. +/// +public class RandomWarpPointPlacementStrategy : WarpPointPlacementStrategy +{ + static RandomWarpPointPlacementStrategy() + { + Instance = new RandomWarpPointPlacementStrategy(); + } + + private RandomWarpPointPlacementStrategy() + : base("Random", "Places warp points randomly within a system.") + { + } + + public static RandomWarpPointPlacementStrategy Instance { get; private set; } + + public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) + { + var x = RandomHelper.Range(-here.Item.Radius, here.Item.Radius); + var y = RandomHelper.Range(-here.Item.Radius, here.Item.Radius); + return here.Item.GetSector(x, y); + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/StarWarpPointPlacementStrategy.cs b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/StarWarpPointPlacementStrategy.cs new file mode 100644 index 000000000..91a07c5e3 --- /dev/null +++ b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/StarWarpPointPlacementStrategy.cs @@ -0,0 +1,36 @@ +using FrEee.Objects.Space; +using FrEee.Extensions; +using System.Linq; +using FrEee.Extensions; + +namespace FrEee.Processes.Setup.WarpPointPlacementStrategies; + +/// +/// Places warp points at the location of stars. If there are no stars, warp points will be placed randomly. Exploration is easy, but so is setting up chokepoints. +/// +public class StarWarpPointPlacementStrategy : WarpPointPlacementStrategy +{ + static StarWarpPointPlacementStrategy() + { + Instance = new StarWarpPointPlacementStrategy(); + } + + private StarWarpPointPlacementStrategy() + : base("Star", "Places warp points at the location of stars. If there are no stars, warp points will be placed randomly. Exploration is easy, but so is setting up chokepoints.") + { + } + + public static StarWarpPointPlacementStrategy Instance { get; private set; } + + public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) + { + var stars = here.Item.FindSpaceObjects(); + if (stars.Any()) + { + var star = stars.PickRandom(); + return star.Sector; + } + else + return RandomWarpPointPlacementStrategy.Instance.GetWarpPointSector(here, there); + } +} \ No newline at end of file diff --git a/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/WarpPointPlacementStrategy.cs b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/WarpPointPlacementStrategy.cs new file mode 100644 index 000000000..01c8c38ea --- /dev/null +++ b/FrEee.Core/Processes/Setup/WarpPointPlacementStrategies/WarpPointPlacementStrategy.cs @@ -0,0 +1,102 @@ +using FrEee.Objects.Space; +using FrEee.Modding; +using FrEee.Extensions; +using System.Collections.Generic; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Modding.Abilities; + +namespace FrEee.Processes.Setup.WarpPointPlacementStrategies; + +/// +/// Strategy for placing warp points in a star system. +/// +public abstract class WarpPointPlacementStrategy +{ + static WarpPointPlacementStrategy() + { + all.Add(EdgeAlignedWarpPointPlacementStrategy.Instance); + all.Add(RandomAlignedWarpPointPlacementStrategy.Instance); + all.Add(RandomWarpPointPlacementStrategy.Instance); + all.Add(CenterWarpPointPlacementStrategy.Instance); + all.Add(StarWarpPointPlacementStrategy.Instance); + all.Add(PlanetWarpPointPlacementStrategy.Instance); + } + + protected WarpPointPlacementStrategy(string name, string description) + { + Name = name; + Description = description; + } + + public static IEnumerable All { get { return all; } } + public string Description { get; set; } + public string Name { get; set; } + private static ICollection all = new List(); + + /// + /// Gets the sector that a warp point should be placed in. + /// + /// + /// + /// + public abstract Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there); + + public void PlaceWarpPoints(ObjectLocation here, ObjectLocation there) + { + var abil1 = here.Item.WarpPointAbilities.Instantiate(); + var abil2 = there.Item.WarpPointAbilities.Instantiate(); + ITemplate wpTemplate; + if (abil1 != null || abil2 != null) + { + // use unusual warp point templates + wpTemplate = Mod.Current.StellarObjectTemplates.OfType().Where(wp => wp.IsUnusual).PickRandom(); + } + else + { + // use normal warp point templates + wpTemplate = Mod.Current.StellarObjectTemplates.OfType().Where(wp => !wp.IsUnusual).PickRandom(); + } + + Sector sector1, sector2; + // HACK - for sectors with null systems + int retries = 0; + do + { + sector1 = GetWarpPointSector(here, there); + retries++; + } while (sector1.StarSystem == null && retries < 10); + do + { + sector2 = GetWarpPointSector(there, here); + retries++; + } while (sector2.StarSystem == null && retries < 10); + + var wp1 = wpTemplate.Instantiate(); + wp1.IsOneWay = false; + wp1.Name = "Warp Point to " + there.Item; + wp1.Target = sector2; + sector1.Place(wp1); + var wp2 = wpTemplate.Instantiate(); + wp2.IsOneWay = false; + wp2.Name = "Warp Point to " + here.Item; + wp2.Target = sector1; + sector2.Place(wp2); + Ability abil = null; + if (abil1 != null && abil2 != null) + { + var abils = new Ability[] { abil1, abil2 }; + abil = abils.PickRandom(); + } + else if (abil1 != null) + abil = abil1; + else if (abil2 != null) + abil = abil2; + if (abil != null) + { + wp1.IntrinsicAbilities.Add(abil); + wp2.IntrinsicAbilities.Add(abil); + } + } +} \ No newline at end of file diff --git a/FrEee/Processes/TurnProcessor.cs b/FrEee.Core/Processes/TurnProcessor.cs similarity index 99% rename from FrEee/Processes/TurnProcessor.cs rename to FrEee.Core/Processes/TurnProcessor.cs index c07c26f60..54205929e 100644 --- a/FrEee/Processes/TurnProcessor.cs +++ b/FrEee.Core/Processes/TurnProcessor.cs @@ -3,8 +3,7 @@ using System.Linq; using FrEee.Objects.Civilization.Diplomacy.Clauses; using FrEee.Objects.Civilization; -using FrEee.Objects.Combat.Grid; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat.Grid; using FrEee.Objects.LogMessages; using FrEee.Objects.Space; using FrEee.Objects.Vehicles; @@ -17,6 +16,10 @@ using FrEee.Objects.Civilization.Orders; using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Processes.Combat.Grid; namespace FrEee.Processes; diff --git a/FrEee/Properties/DataSources/FrEee.Game.Space.Planet.datasource b/FrEee.Core/Properties/DataSources/FrEee.Game.Space.Planet.datasource similarity index 94% rename from FrEee/Properties/DataSources/FrEee.Game.Space.Planet.datasource rename to FrEee.Core/Properties/DataSources/FrEee.Game.Space.Planet.datasource index 3361b47f4..42a421b48 100644 --- a/FrEee/Properties/DataSources/FrEee.Game.Space.Planet.datasource +++ b/FrEee.Core/Properties/DataSources/FrEee.Game.Space.Planet.datasource @@ -1,10 +1,10 @@ - - - - FrEee.Game.Space.Planet, FrEee, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + + FrEee.Game.Space.Planet, FrEee, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/FrEee/Properties/Resources.Designer.cs b/FrEee.Core/Properties/Resources.Designer.cs similarity index 97% rename from FrEee/Properties/Resources.Designer.cs rename to FrEee.Core/Properties/Resources.Designer.cs index 7e9cc3e89..cef3ed6b4 100644 --- a/FrEee/Properties/Resources.Designer.cs +++ b/FrEee.Core/Properties/Resources.Designer.cs @@ -1,62 +1,62 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace FrEee.Properties; - using System; - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FrEee.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - } +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace FrEee.Properties; + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FrEee.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } diff --git a/FrEee/Properties/Resources.resources b/FrEee.Core/Properties/Resources.resources similarity index 50% rename from FrEee/Properties/Resources.resources rename to FrEee.Core/Properties/Resources.resources index d3f5a12fa..8b1378917 100644 --- a/FrEee/Properties/Resources.resources +++ b/FrEee.Core/Properties/Resources.resources @@ -1 +1 @@ - + diff --git a/FrEee/Properties/Resources.resx b/FrEee.Core/Properties/Resources.resx similarity index 97% rename from FrEee/Properties/Resources.resx rename to FrEee.Core/Properties/Resources.resx index 29dcb1b3a..1af7de150 100644 --- a/FrEee/Properties/Resources.resx +++ b/FrEee.Core/Properties/Resources.resx @@ -1,120 +1,120 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/FrEee/Properties/Settings.Designer.cs b/FrEee.Core/Properties/Settings.Designer.cs similarity index 97% rename from FrEee/Properties/Settings.Designer.cs rename to FrEee.Core/Properties/Settings.Designer.cs index e40a496b8..94714044e 100644 --- a/FrEee/Properties/Settings.Designer.cs +++ b/FrEee.Core/Properties/Settings.Designer.cs @@ -1,25 +1,25 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace FrEee.Properties; - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.8.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - } +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace FrEee.Properties; + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.8.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } diff --git a/FrEee/Properties/Settings.settings b/FrEee.Core/Properties/Settings.settings similarity index 97% rename from FrEee/Properties/Settings.settings rename to FrEee.Core/Properties/Settings.settings index abf36c5d3..39645652a 100644 --- a/FrEee/Properties/Settings.settings +++ b/FrEee.Core/Properties/Settings.settings @@ -1,7 +1,7 @@ - - - - - - - + + + + + + + diff --git a/FrEee/Serialization/DataReference.cs b/FrEee.Core/Serialization/DataReference.cs similarity index 97% rename from FrEee/Serialization/DataReference.cs rename to FrEee.Core/Serialization/DataReference.cs index bb5bebd8b..f0ad0950c 100644 --- a/FrEee/Serialization/DataReference.cs +++ b/FrEee.Core/Serialization/DataReference.cs @@ -3,6 +3,8 @@ using System; using System.Collections.Generic; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Serialization; namespace FrEee.Serialization; diff --git a/FrEee/Serialization/DataScalar.cs b/FrEee.Core/Serialization/DataScalar.cs similarity index 94% rename from FrEee/Serialization/DataScalar.cs rename to FrEee.Core/Serialization/DataScalar.cs index 750df1efd..86af5d645 100644 --- a/FrEee/Serialization/DataScalar.cs +++ b/FrEee.Core/Serialization/DataScalar.cs @@ -1,8 +1,11 @@ using FrEee.Extensions; +using FrEee.Extensions; using FrEee.Utility; using Newtonsoft.Json; using System; using System.Globalization; +using FrEee.Serialization; +using FrEee.Utility; namespace FrEee.Serialization; diff --git a/FrEee/Serialization/JsonSerializer.cs b/FrEee.Core/Serialization/JsonSerializer.cs similarity index 99% rename from FrEee/Serialization/JsonSerializer.cs rename to FrEee.Core/Serialization/JsonSerializer.cs index 626808b0b..cc5be0ede 100644 --- a/FrEee/Serialization/JsonSerializer.cs +++ b/FrEee.Core/Serialization/JsonSerializer.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; +using FrEee.Serialization; namespace FrEee.Serialization; diff --git a/FrEee/Serialization/LegacySerializer.cs b/FrEee.Core/Serialization/LegacySerializer.cs similarity index 99% rename from FrEee/Serialization/LegacySerializer.cs rename to FrEee.Core/Serialization/LegacySerializer.cs index 3cdc923c6..31007a0b1 100644 --- a/FrEee/Serialization/LegacySerializer.cs +++ b/FrEee.Core/Serialization/LegacySerializer.cs @@ -13,6 +13,10 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using FrEee.Utility; +using FrEee.Extensions; +using FrEee.Serialization; +using FrEee.Serialization.Stringifiers; +using FrEee.Utility; namespace FrEee.Serialization; internal static class LegacySerializer diff --git a/FrEee/Serialization/ObjectGraphParser.cs b/FrEee.Core/Serialization/ObjectGraphParser.cs similarity index 94% rename from FrEee/Serialization/ObjectGraphParser.cs rename to FrEee.Core/Serialization/ObjectGraphParser.cs index 29181264d..41d6c7f65 100644 --- a/FrEee/Serialization/ObjectGraphParser.cs +++ b/FrEee.Core/Serialization/ObjectGraphParser.cs @@ -1,3 +1,4 @@ +using FrEee.Serialization; using FrEee.Extensions; using FrEee.Utility; using System; @@ -7,29 +8,10 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; +using FrEee.Utility; namespace FrEee.Serialization; -/// -/// Prevents an property or class's value from being copied when the containing object is copied. -/// Instead, the original value will be used, or the known copy if the value has already been copied. -/// -[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = true, AllowMultiple = false)] -public class DoNotCopyAttribute : Attribute -{ - public DoNotCopyAttribute(bool allowSafeCopy = true) - { - AllowSafeCopy = allowSafeCopy; - } - - /// - /// Is "safe" copying (using the original property value) allowed? - /// If false, even this will not be attempted, and the property will be completely ignored. - /// Setting to false is useful for properties whose setters throw NotSupportedException. - /// - public bool AllowSafeCopy { get; private set; } -} - /// /// Context for object graph operations. /// diff --git a/FrEee/Serialization/Serializer.cs b/FrEee.Core/Serialization/Serializer.cs similarity index 90% rename from FrEee/Serialization/Serializer.cs rename to FrEee.Core/Serialization/Serializer.cs index 6a0e4a4af..8192546d9 100644 --- a/FrEee/Serialization/Serializer.cs +++ b/FrEee.Core/Serialization/Serializer.cs @@ -125,18 +125,6 @@ public static string SerializeToString(object o) } } -/// -/// Prevents a property from being serialized, or copied when the containing object is copied. -/// -[AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)] -public sealed class DoNotSerializeAttribute : DoNotCopyAttribute -{ - public DoNotSerializeAttribute(bool allowSafeCopy = true) - : base(allowSafeCopy) - { - } -} - [AttributeUsage(AttributeTargets.Property, Inherited = true, AllowMultiple = false)] public sealed class SerializationPriorityAttribute : Attribute { diff --git a/FrEee/Serialization/SimpleDataObject.cs b/FrEee.Core/Serialization/SimpleDataObject.cs similarity index 98% rename from FrEee/Serialization/SimpleDataObject.cs rename to FrEee.Core/Serialization/SimpleDataObject.cs index de907ea0f..f097543ec 100644 --- a/FrEee/Serialization/SimpleDataObject.cs +++ b/FrEee.Core/Serialization/SimpleDataObject.cs @@ -1,8 +1,11 @@ using FrEee.Extensions; +using FrEee.Extensions; using FrEee.Utility; using Newtonsoft.Json; using System; using static FrEee.Extensions.CommonExtensions; +using FrEee.Serialization; +using FrEee.Utility; namespace FrEee.Serialization; diff --git a/FrEee/Serialization/Stringifiers/DoubleLiteralFormulaStringifier.cs b/FrEee.Core/Serialization/Stringifiers/DoubleLiteralFormulaStringifier.cs similarity index 91% rename from FrEee/Serialization/Stringifiers/DoubleLiteralFormulaStringifier.cs rename to FrEee.Core/Serialization/Stringifiers/DoubleLiteralFormulaStringifier.cs index 156253633..2d9e67ef9 100644 --- a/FrEee/Serialization/Stringifiers/DoubleLiteralFormulaStringifier.cs +++ b/FrEee.Core/Serialization/Stringifiers/DoubleLiteralFormulaStringifier.cs @@ -1,5 +1,6 @@ using FrEee.Modding; using System.ComponentModel.Composition; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Serialization/Stringifiers/IntLiteralFormulaStringifier.cs b/FrEee.Core/Serialization/Stringifiers/IntLiteralFormulaStringifier.cs similarity index 91% rename from FrEee/Serialization/Stringifiers/IntLiteralFormulaStringifier.cs rename to FrEee.Core/Serialization/Stringifiers/IntLiteralFormulaStringifier.cs index 7e4fd077e..f9953fefe 100644 --- a/FrEee/Serialization/Stringifiers/IntLiteralFormulaStringifier.cs +++ b/FrEee.Core/Serialization/Stringifiers/IntLiteralFormulaStringifier.cs @@ -1,5 +1,6 @@ using FrEee.Modding; using System.ComponentModel.Composition; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Serialization/Stringifiers/PopulationModifierStringifier.cs b/FrEee.Core/Serialization/Stringifiers/PopulationModifierStringifier.cs similarity index 94% rename from FrEee/Serialization/Stringifiers/PopulationModifierStringifier.cs rename to FrEee.Core/Serialization/Stringifiers/PopulationModifierStringifier.cs index 895c56fd3..7d9b53253 100644 --- a/FrEee/Serialization/Stringifiers/PopulationModifierStringifier.cs +++ b/FrEee.Core/Serialization/Stringifiers/PopulationModifierStringifier.cs @@ -1,6 +1,7 @@ using FrEee.Modding; using System.ComponentModel.Composition; using System.Linq; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Serialization/Stringifiers/ResourceQuantityStringifier.cs b/FrEee.Core/Serialization/Stringifiers/ResourceQuantityStringifier.cs similarity index 90% rename from FrEee/Serialization/Stringifiers/ResourceQuantityStringifier.cs rename to FrEee.Core/Serialization/Stringifiers/ResourceQuantityStringifier.cs index 35e89993b..9921493a9 100644 --- a/FrEee/Serialization/Stringifiers/ResourceQuantityStringifier.cs +++ b/FrEee.Core/Serialization/Stringifiers/ResourceQuantityStringifier.cs @@ -1,5 +1,6 @@ using FrEee.Utility; using System.ComponentModel.Composition; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Serialization/Stringifiers/StringLiteralFormulaStringifier.cs b/FrEee.Core/Serialization/Stringifiers/StringLiteralFormulaStringifier.cs similarity index 91% rename from FrEee/Serialization/Stringifiers/StringLiteralFormulaStringifier.cs rename to FrEee.Core/Serialization/Stringifiers/StringLiteralFormulaStringifier.cs index 35dfffe06..589028bf9 100644 --- a/FrEee/Serialization/Stringifiers/StringLiteralFormulaStringifier.cs +++ b/FrEee.Core/Serialization/Stringifiers/StringLiteralFormulaStringifier.cs @@ -1,5 +1,6 @@ using FrEee.Modding; using System.ComponentModel.Composition; +using FrEee.Serialization.Stringifiers; namespace FrEee.Serialization.Stringifiers; diff --git a/FrEee/Utility/ClientSideCache.cs b/FrEee.Core/Utility/ClientSideCache.cs similarity index 93% rename from FrEee/Utility/ClientSideCache.cs rename to FrEee.Core/Utility/ClientSideCache.cs index 3d028cd0a..c72971e24 100644 --- a/FrEee/Utility/ClientSideCache.cs +++ b/FrEee.Core/Utility/ClientSideCache.cs @@ -1,73 +1,73 @@ -using FrEee.Objects.Civilization; -using System; - -namespace FrEee.Utility; - -/// -/// A client side cache for data. -/// Can also cache data server side when a flag is enabled. -/// -/// -public class ClientSideCache -{ - public ClientSideCache(Func compute) - { - this.compute = compute; - IsDirty = true; - } - - public bool IsCacheEnabled - { - get - { - return IsServerSideCacheEnabled || Empire.Current != null; - } - } - - public bool IsDirty { get; private set; } - - public bool IsServerSideCacheEnabled - { - get - { - return isServerSideCacheEnabled; - } - set - { - isServerSideCacheEnabled = value; - if (!isServerSideCacheEnabled) - IsDirty = true; - } - } - - public T Value - { - get - { - if (IsCacheEnabled) - { - if (!IsDirty) - return value; - else - { - value = compute(); - IsDirty = false; - return value; - } - } - else - return compute(); - } - } - - private Func compute; - - private bool isServerSideCacheEnabled; - - private T value; - - public static implicit operator T(ClientSideCache cache) - { - return cache.Value; - } +using FrEee.Objects.Civilization; +using System; + +namespace FrEee.Utility; + +/// +/// A client side cache for data. +/// Can also cache data server side when a flag is enabled. +/// +/// +public class ClientSideCache +{ + public ClientSideCache(Func compute) + { + this.compute = compute; + IsDirty = true; + } + + public bool IsCacheEnabled + { + get + { + return IsServerSideCacheEnabled || Empire.Current != null; + } + } + + public bool IsDirty { get; private set; } + + public bool IsServerSideCacheEnabled + { + get + { + return isServerSideCacheEnabled; + } + set + { + isServerSideCacheEnabled = value; + if (!isServerSideCacheEnabled) + IsDirty = true; + } + } + + public T Value + { + get + { + if (IsCacheEnabled) + { + if (!IsDirty) + return value; + else + { + value = compute(); + IsDirty = false; + return value; + } + } + else + return compute(); + } + } + + private Func compute; + + private bool isServerSideCacheEnabled; + + private T value; + + public static implicit operator T(ClientSideCache cache) + { + return cache.Value; + } } \ No newline at end of file diff --git a/FrEee/Utility/ConnectivityGraph.cs b/FrEee.Core/Utility/ConnectivityGraph.cs similarity index 95% rename from FrEee/Utility/ConnectivityGraph.cs rename to FrEee.Core/Utility/ConnectivityGraph.cs index 2100d484f..704b5e664 100644 --- a/FrEee/Utility/ConnectivityGraph.cs +++ b/FrEee.Core/Utility/ConnectivityGraph.cs @@ -1,413 +1,415 @@ -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Utility; - -/// -/// A connectivity graph. -/// -/// The type of objects being connected. -public class ConnectivityGraph : ISet -{ - public ConnectivityGraph() - { - } - - public ConnectivityGraph(IEnumerable items) - { - foreach (var item in items) - Add(item); - } - - public ConnectivityGraph(ConnectivityGraph sub1, ConnectivityGraph sub2) - { - foreach (var item in sub1.Union(sub2)) - Add(item); - } - - /// - /// Any connections that have been made. - /// - public SafeDictionary> Connections - { - get { return connections; } - } - - public int Count - { - get { return items.Count; } - } - - /// - /// Is the graph connected? That is, are any two nodes connected? Or, is there no more than one subgraph? - /// - public bool IsConnected - { - get - { - return Subgraphs.Count() <= 1; - } - } - - public bool IsReadOnly - { - get { return items.IsReadOnly; } - } - - /// - /// Any discrete connected subgraphs of this graph. - /// - public IEnumerable> Subgraphs - { - get - { - return subgraphs.Concat(singletons.Select(item => - { - var sub = new ConnectivityGraph(); - sub.Add(item); - return sub; - })).Where(sg => sg != null); // HACK - null subgraphs?! - } - } - - private SafeDictionary> connections = new SafeDictionary>(true); - - private ISet items = new HashSet(); - - private List singletons = new List(); - - private List> subgraphs = new List>(); - - public bool Add(T item) - { - singletons.Add(item); - return items.Add(item); - } - - void ICollection.Add(T item) - { - singletons.Add(item); - items.Add(item); - } - - /// - /// Are two nodes connected through the graph? - /// - /// - /// - /// - public bool AreConnected(T node1, T node2, bool eitherWay = true) - { - if (eitherWay) - return ComputeDistance(node1, node2) != null || ComputeDistance(node2, node1) != null; - else - return ComputeDistance(node1, node2) != null; - } - - /// - /// Are two nodes directly connected? - /// - /// - /// - /// - public bool AreDirectlyConnected(T node1, T node2, bool eitherWay = true) - { - if (eitherWay) - return ComputeDistance(node1, node2) <= 1 || ComputeDistance(node2, node1) <= 1; - else - return ComputeDistance(node1, node2) <= 1; - } - - public void Clear() - { - singletons.Clear(); - items.Clear(); - connections.Clear(); - } - - /// - /// Computes the subgraph of nodes that are accessible from the starting location. - /// - /// - /// - public ConnectivityGraph ComputeAccessFrom(T start) - { - var subgraph = new ConnectivityGraph(); - ComputeAccessFromRecursive(start, subgraph); - return subgraph; - } - - /// - /// Computes the subgraph of nodes that can access the starting location. - /// - /// - /// - public ConnectivityGraph ComputeAccessTo(T end) - { - var subgraph = new ConnectivityGraph(); - ComputeAccessToRecursive(end, subgraph); - return subgraph; - } - - /// - /// Computes the distance between two nodes. - /// - /// - /// - /// - /// The distance, or null if either the destination cannot be reached or the start node has already been traversed.. - public int? ComputeDistance(T start, T end, ICollection traversed = null) - { - if (traversed == null) - traversed = new HashSet(); - - if (traversed.Contains(start)) - return null; - - traversed.Add(start); - - if ((object)start == (object)end) - return 0; // we're already there! - - var exits = GetExits(start); - - if (!exits.Any()) - return null; // can't get anywhere from here! - - var path = Pathfinder.Pathfind(start, end, this); - - if (path == null || !path.Any()) - return null; // can't get there from here! - - return path.Count(); - } - - /// - /// Computes the subgraph of nodes that are accessible from the starting location or can access it. - /// - /// - /// - public ConnectivityGraph ComputeSubgraph(T node) - { - var subgraph = new ConnectivityGraph(); - ComputeSubgraphRecursive(node, subgraph); - return subgraph; - } - - /// - /// Connects two nodes. - /// - /// - /// - /// Connect both ways? - public void Connect(T start, T end, bool twoWay = false) - { - if (!connections.ContainsKey(start) || !connections[start].Contains(end)) - { - var sub1 = Subgraphs.Single(s => s.Contains(start)); - var sub2 = Subgraphs.Single(s => s.Contains(end)); - if (sub1 != sub2) - { - var sub3 = new ConnectivityGraph(sub1, sub2); - subgraphs.Remove(sub1); - subgraphs.Remove(sub2); - subgraphs.Add(sub3); - } - connections[start].Add(end); - singletons.Remove(start); - singletons.Remove(end); - } - if (twoWay) - Connect(end, start, false); - } - - public bool Contains(T item) - { - return items.Contains(item); - } - - public void CopyTo(T[] array, int arrayIndex) - { - items.CopyTo(array, arrayIndex); - } - - /// - /// Disconnects two nodes. - /// - /// - /// - /// Disconnect both ways? - public void Disconnect(T start, T end, bool twoWay = false) - { - if (connections.ContainsKey(start) && connections[start].Contains(end)) - { - var sub = Subgraphs.Single(s => s.Contains(start)); - var subs = sub.Subdivide(); - subgraphs.Remove(sub); - subgraphs.AddRange(subs); - connections[start].Remove(end); - if (!GetExits(start).Any() && !GetEntrances(start).Any()) - singletons.Add(start); - if (!GetEntrances(end).Any() && !GetExits(end).Any()) - singletons.Add(end); - } - if (twoWay) - Disconnect(end, start, false); - } - - public void ExceptWith(IEnumerable other) - { - // TODO - reimplement ExceptWith - throw new NotSupportedException(); - } - - /// - /// Finds the entrances to a node. - /// - /// - /// - public IEnumerable GetEntrances(T node) - { - return Connections.Where(kvp => kvp.Value.Contains(node)).Select(kvp => kvp.Key); - } - - public IEnumerator GetEnumerator() - { - return items.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - /// - /// Finds the exits from a node. - /// - /// - /// - public IEnumerable GetExits(T node) - { - return Connections[node]; - } - - public void IntersectWith(IEnumerable other) - { - // TODO - reimplement IntersectWith - throw new NotSupportedException(); - } - - public bool IsProperSubsetOf(IEnumerable other) - { - return items.IsProperSubsetOf(other); - } - - public bool IsProperSupersetOf(IEnumerable other) - { - return items.IsProperSupersetOf(other); - } - - public bool IsSubsetOf(IEnumerable other) - { - return items.IsSupersetOf(other); - } - - public bool IsSupersetOf(IEnumerable other) - { - return items.IsSupersetOf(other); - } - - public bool Overlaps(IEnumerable other) - { - return items.Overlaps(other); - } - - public bool Remove(T item) - { - singletons.Remove(item); - var result = items.Remove(item); - foreach (var kvp in connections.ToArray()) - { - if ((object)kvp.Key == (object)item) - connections.Remove(item); - else if (kvp.Value.Contains(item)) - kvp.Value.Remove(item); - } - return result; - } - - public bool SetEquals(IEnumerable other) - { - return items.SetEquals(other); - } - - public void SymmetricExceptWith(IEnumerable other) - { - // TODO - reimplement SymmetricExceptWith - throw new NotSupportedException(); - } - - public void UnionWith(IEnumerable other) - { - singletons.AddRange(other); - items.UnionWith(other); - } - - private void ComputeAccessFromRecursive(T start, ConnectivityGraph subgraph) - { - foreach (var exit in GetExits(start).Where(exit => !subgraph.Contains(exit))) - { - subgraph.Add(exit); - subgraph.Connect(start, exit); - ComputeAccessFromRecursive(exit, subgraph); - } - } - - private void ComputeAccessToRecursive(T end, ConnectivityGraph subgraph) - { - foreach (var entrance in GetEntrances(end).Where(entrance => !subgraph.Contains(entrance))) - { - subgraph.Add(entrance); - subgraph.Connect(entrance, end); - ComputeAccessFromRecursive(entrance, subgraph); - } - } - - private void ComputeSubgraphRecursive(T node, ConnectivityGraph subgraph) - { - foreach (var exit in GetExits(node).Where(exit => !subgraph.Contains(exit))) - { - subgraph.Add(exit); - subgraph.Connect(node, exit); - ComputeAccessFromRecursive(exit, subgraph); - } - foreach (var entrance in GetEntrances(node).Where(entrance => !subgraph.Contains(entrance))) - { - subgraph.Add(entrance); - subgraph.Connect(entrance, node); - ComputeAccessFromRecursive(entrance, subgraph); - } - } - - /// - /// Subdivides the graph into discrete connected subgraphs. - /// - /// - private IEnumerable> Subdivide() - { - var subgraphs = new List>(); - while (true) - { - // pick a node that we haven't already covered - var nodes = this.Where(n => !subgraphs.Any(sg => sg.Contains(n))); - if (!nodes.Any()) - break; - var node = nodes.PickRandom(); - var subgraph = ComputeSubgraph(node); - subgraphs.Add(subgraph); - } - return subgraphs.ToList(); - } +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Extensions; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// A connectivity graph. +/// +/// The type of objects being connected. +public class ConnectivityGraph : ISet +{ + public ConnectivityGraph() + { + } + + public ConnectivityGraph(IEnumerable items) + { + foreach (var item in items) + Add(item); + } + + public ConnectivityGraph(ConnectivityGraph sub1, ConnectivityGraph sub2) + { + foreach (var item in sub1.Union(sub2)) + Add(item); + } + + /// + /// Any connections that have been made. + /// + public SafeDictionary> Connections + { + get { return connections; } + } + + public int Count + { + get { return items.Count; } + } + + /// + /// Is the graph connected? That is, are any two nodes connected? Or, is there no more than one subgraph? + /// + public bool IsConnected + { + get + { + return Subgraphs.Count() <= 1; + } + } + + public bool IsReadOnly + { + get { return items.IsReadOnly; } + } + + /// + /// Any discrete connected subgraphs of this graph. + /// + public IEnumerable> Subgraphs + { + get + { + return subgraphs.Concat(singletons.Select(item => + { + var sub = new ConnectivityGraph(); + sub.Add(item); + return sub; + })).Where(sg => sg != null); // HACK - null subgraphs?! + } + } + + private SafeDictionary> connections = new SafeDictionary>(true); + + private ISet items = new HashSet(); + + private List singletons = new List(); + + private List> subgraphs = new List>(); + + public bool Add(T item) + { + singletons.Add(item); + return items.Add(item); + } + + void ICollection.Add(T item) + { + singletons.Add(item); + items.Add(item); + } + + /// + /// Are two nodes connected through the graph? + /// + /// + /// + /// + public bool AreConnected(T node1, T node2, bool eitherWay = true) + { + if (eitherWay) + return ComputeDistance(node1, node2) != null || ComputeDistance(node2, node1) != null; + else + return ComputeDistance(node1, node2) != null; + } + + /// + /// Are two nodes directly connected? + /// + /// + /// + /// + public bool AreDirectlyConnected(T node1, T node2, bool eitherWay = true) + { + if (eitherWay) + return ComputeDistance(node1, node2) <= 1 || ComputeDistance(node2, node1) <= 1; + else + return ComputeDistance(node1, node2) <= 1; + } + + public void Clear() + { + singletons.Clear(); + items.Clear(); + connections.Clear(); + } + + /// + /// Computes the subgraph of nodes that are accessible from the starting location. + /// + /// + /// + public ConnectivityGraph ComputeAccessFrom(T start) + { + var subgraph = new ConnectivityGraph(); + ComputeAccessFromRecursive(start, subgraph); + return subgraph; + } + + /// + /// Computes the subgraph of nodes that can access the starting location. + /// + /// + /// + public ConnectivityGraph ComputeAccessTo(T end) + { + var subgraph = new ConnectivityGraph(); + ComputeAccessToRecursive(end, subgraph); + return subgraph; + } + + /// + /// Computes the distance between two nodes. + /// + /// + /// + /// + /// The distance, or null if either the destination cannot be reached or the start node has already been traversed.. + public int? ComputeDistance(T start, T end, ICollection traversed = null) + { + if (traversed == null) + traversed = new HashSet(); + + if (traversed.Contains(start)) + return null; + + traversed.Add(start); + + if ((object)start == (object)end) + return 0; // we're already there! + + var exits = GetExits(start); + + if (!exits.Any()) + return null; // can't get anywhere from here! + + var path = Pathfinder.Pathfind(start, end, this); + + if (path == null || !path.Any()) + return null; // can't get there from here! + + return path.Count(); + } + + /// + /// Computes the subgraph of nodes that are accessible from the starting location or can access it. + /// + /// + /// + public ConnectivityGraph ComputeSubgraph(T node) + { + var subgraph = new ConnectivityGraph(); + ComputeSubgraphRecursive(node, subgraph); + return subgraph; + } + + /// + /// Connects two nodes. + /// + /// + /// + /// Connect both ways? + public void Connect(T start, T end, bool twoWay = false) + { + if (!connections.ContainsKey(start) || !connections[start].Contains(end)) + { + var sub1 = Subgraphs.Single(s => s.Contains(start)); + var sub2 = Subgraphs.Single(s => s.Contains(end)); + if (sub1 != sub2) + { + var sub3 = new ConnectivityGraph(sub1, sub2); + subgraphs.Remove(sub1); + subgraphs.Remove(sub2); + subgraphs.Add(sub3); + } + connections[start].Add(end); + singletons.Remove(start); + singletons.Remove(end); + } + if (twoWay) + Connect(end, start, false); + } + + public bool Contains(T item) + { + return items.Contains(item); + } + + public void CopyTo(T[] array, int arrayIndex) + { + items.CopyTo(array, arrayIndex); + } + + /// + /// Disconnects two nodes. + /// + /// + /// + /// Disconnect both ways? + public void Disconnect(T start, T end, bool twoWay = false) + { + if (connections.ContainsKey(start) && connections[start].Contains(end)) + { + var sub = Subgraphs.Single(s => s.Contains(start)); + var subs = sub.Subdivide(); + subgraphs.Remove(sub); + subgraphs.AddRange(subs); + connections[start].Remove(end); + if (!GetExits(start).Any() && !GetEntrances(start).Any()) + singletons.Add(start); + if (!GetEntrances(end).Any() && !GetExits(end).Any()) + singletons.Add(end); + } + if (twoWay) + Disconnect(end, start, false); + } + + public void ExceptWith(IEnumerable other) + { + // TODO - reimplement ExceptWith + throw new NotSupportedException(); + } + + /// + /// Finds the entrances to a node. + /// + /// + /// + public IEnumerable GetEntrances(T node) + { + return Connections.Where(kvp => kvp.Value.Contains(node)).Select(kvp => kvp.Key); + } + + public IEnumerator GetEnumerator() + { + return items.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + /// Finds the exits from a node. + /// + /// + /// + public IEnumerable GetExits(T node) + { + return Connections[node]; + } + + public void IntersectWith(IEnumerable other) + { + // TODO - reimplement IntersectWith + throw new NotSupportedException(); + } + + public bool IsProperSubsetOf(IEnumerable other) + { + return items.IsProperSubsetOf(other); + } + + public bool IsProperSupersetOf(IEnumerable other) + { + return items.IsProperSupersetOf(other); + } + + public bool IsSubsetOf(IEnumerable other) + { + return items.IsSupersetOf(other); + } + + public bool IsSupersetOf(IEnumerable other) + { + return items.IsSupersetOf(other); + } + + public bool Overlaps(IEnumerable other) + { + return items.Overlaps(other); + } + + public bool Remove(T item) + { + singletons.Remove(item); + var result = items.Remove(item); + foreach (var kvp in connections.ToArray()) + { + if ((object)kvp.Key == (object)item) + connections.Remove(item); + else if (kvp.Value.Contains(item)) + kvp.Value.Remove(item); + } + return result; + } + + public bool SetEquals(IEnumerable other) + { + return items.SetEquals(other); + } + + public void SymmetricExceptWith(IEnumerable other) + { + // TODO - reimplement SymmetricExceptWith + throw new NotSupportedException(); + } + + public void UnionWith(IEnumerable other) + { + singletons.AddRange(other); + items.UnionWith(other); + } + + private void ComputeAccessFromRecursive(T start, ConnectivityGraph subgraph) + { + foreach (var exit in GetExits(start).Where(exit => !subgraph.Contains(exit))) + { + subgraph.Add(exit); + subgraph.Connect(start, exit); + ComputeAccessFromRecursive(exit, subgraph); + } + } + + private void ComputeAccessToRecursive(T end, ConnectivityGraph subgraph) + { + foreach (var entrance in GetEntrances(end).Where(entrance => !subgraph.Contains(entrance))) + { + subgraph.Add(entrance); + subgraph.Connect(entrance, end); + ComputeAccessFromRecursive(entrance, subgraph); + } + } + + private void ComputeSubgraphRecursive(T node, ConnectivityGraph subgraph) + { + foreach (var exit in GetExits(node).Where(exit => !subgraph.Contains(exit))) + { + subgraph.Add(exit); + subgraph.Connect(node, exit); + ComputeAccessFromRecursive(exit, subgraph); + } + foreach (var entrance in GetEntrances(node).Where(entrance => !subgraph.Contains(entrance))) + { + subgraph.Add(entrance); + subgraph.Connect(entrance, node); + ComputeAccessFromRecursive(entrance, subgraph); + } + } + + /// + /// Subdivides the graph into discrete connected subgraphs. + /// + /// + private IEnumerable> Subdivide() + { + var subgraphs = new List>(); + while (true) + { + // pick a node that we haven't already covered + var nodes = this.Where(n => !subgraphs.Any(sg => sg.Contains(n))); + if (!nodes.Any()) + break; + var node = nodes.PickRandom(); + var subgraph = ComputeSubgraph(node); + subgraphs.Add(subgraph); + } + return subgraphs.ToList(); + } } \ No newline at end of file diff --git a/FrEee/Serialization/IReference.cs b/FrEee.Core/Utility/IReference.cs similarity index 100% rename from FrEee/Serialization/IReference.cs rename to FrEee.Core/Utility/IReference.cs diff --git a/FrEee/Serialization/IReferrable.cs b/FrEee.Core/Utility/IReferrable.cs similarity index 100% rename from FrEee/Serialization/IReferrable.cs rename to FrEee.Core/Utility/IReferrable.cs diff --git a/FrEee/Utility/Library.cs b/FrEee.Core/Utility/Library.cs similarity index 96% rename from FrEee/Utility/Library.cs rename to FrEee.Core/Utility/Library.cs index cab2bc949..a0efc0130 100644 --- a/FrEee/Utility/Library.cs +++ b/FrEee.Core/Utility/Library.cs @@ -1,131 +1,132 @@ -using FrEee.Extensions; -using FrEee.Serialization; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Runtime.Serialization; - -namespace FrEee.Utility; - -/// -/// A library of client side objects which can be used between games. -/// -public static class Library -{ - static Library() - { - Items = new HashSet(); - } - - /// - /// The full path to the library file. - /// - public static string FilePath - { - get - { - return Path.Combine(ClientUtilities.ApplicationDataPath, "Library.dat"); - } - } - - /// - /// The items in the library. - /// - private static ISet Items { get; set; } - - /// - /// Deletes objects from the library. - /// - /// The type of object to delete. - /// Condition to apply when selecting objects to delete. - /// Number of objects deleted. - public static int Delete(Func condition = null, bool autosave = true) - { - // defaults to deleting all - if (condition == null) - condition = t => true; - - int count = 0; - foreach (var o in Items.OfType().Where(condition).ToArray()) - { - Items.Remove(o); - count++; - } - - if (autosave) - Save(); - - return count; - } - - /// - /// Exports an object to the library. - /// - /// Anything special to do to the copied object before saving it. - /// - /// - public static void Export(T o, Action cleaner = null, bool autosave = true) - { - var c = o.CopyAndAssignNewID(); - // TODO - unassign ID in galaxy? does it matter? - if (cleaner != null) - cleaner(c); - Items.Add(c); - if (autosave) - Save(); - } - - /// - /// Imports objects from the library into the game. - /// - /// The type of object to import. - /// Condition to apply when selecting objects to import. - /// Copied objects imported. - public static IEnumerable Import(Func condition = null) - { - // defaults to loading all - if (condition == null) - condition = t => true; - - // copy objects so they're distinct from the library versions when importing - return Items.OfType().Where(condition).Select(o => o.CopyAndAssignNewID()).ToArray(); - } - - public static void Load() - { - // load library from disk - try - { - // HACK - move old Library.dat that was in the app folder - if (File.Exists("Library.dat")) - File.Move("Library.dat", FilePath); - - var fs = File.OpenRead(FilePath); - Items = Serializer.Deserialize>(fs); - fs.Close(); fs.Dispose(); - } - catch (IOException) - { - // file not found, leave library empty - // TODO - log somewhere? - Items = new HashSet(); - } - catch (SerializationException) - { - // bad data, leave library empty - // TODO - log somewhere? - Items = new HashSet(); - } - } - - public static void Save() - { - var path = Path.GetDirectoryName(FilePath); - if (!Directory.Exists(path)) - Directory.CreateDirectory(path); - var fs = File.Create(FilePath); - Serializer.Serialize(Items, fs); - fs.Close(); fs.Dispose(); - } -} +using FrEee.Extensions; +using FrEee.Serialization; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.Serialization; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// A library of client side objects which can be used between games. +/// +public static class Library +{ + static Library() + { + Items = new HashSet(); + } + + /// + /// The full path to the library file. + /// + public static string FilePath + { + get + { + return Path.Combine(ClientUtilities.ApplicationDataPath, "Library.dat"); + } + } + + /// + /// The items in the library. + /// + private static ISet Items { get; set; } + + /// + /// Deletes objects from the library. + /// + /// The type of object to delete. + /// Condition to apply when selecting objects to delete. + /// Number of objects deleted. + public static int Delete(Func condition = null, bool autosave = true) + { + // defaults to deleting all + if (condition == null) + condition = t => true; + + int count = 0; + foreach (var o in Items.OfType().Where(condition).ToArray()) + { + Items.Remove(o); + count++; + } + + if (autosave) + Save(); + + return count; + } + + /// + /// Exports an object to the library. + /// + /// Anything special to do to the copied object before saving it. + /// + /// + public static void Export(T o, Action cleaner = null, bool autosave = true) + { + var c = o.CopyAndAssignNewID(); + // TODO - unassign ID in galaxy? does it matter? + if (cleaner != null) + cleaner(c); + Items.Add(c); + if (autosave) + Save(); + } + + /// + /// Imports objects from the library into the game. + /// + /// The type of object to import. + /// Condition to apply when selecting objects to import. + /// Copied objects imported. + public static IEnumerable Import(Func condition = null) + { + // defaults to loading all + if (condition == null) + condition = t => true; + + // copy objects so they're distinct from the library versions when importing + return Items.OfType().Where(condition).Select(o => o.CopyAndAssignNewID()).ToArray(); + } + + public static void Load() + { + // load library from disk + try + { + // HACK - move old Library.dat that was in the app folder + if (File.Exists("Library.dat")) + File.Move("Library.dat", FilePath); + + var fs = File.OpenRead(FilePath); + Items = Serializer.Deserialize>(fs); + fs.Close(); fs.Dispose(); + } + catch (IOException) + { + // file not found, leave library empty + // TODO - log somewhere? + Items = new HashSet(); + } + catch (SerializationException) + { + // bad data, leave library empty + // TODO - log somewhere? + Items = new HashSet(); + } + } + + public static void Save() + { + var path = Path.GetDirectoryName(FilePath); + if (!Directory.Exists(path)) + Directory.CreateDirectory(path); + var fs = File.Create(FilePath); + Serializer.Serialize(Items, fs); + fs.Close(); fs.Dispose(); + } +} diff --git a/FrEee/Utility/MiningModel.cs b/FrEee.Core/Utility/MiningModel.cs similarity index 95% rename from FrEee/Utility/MiningModel.cs rename to FrEee.Core/Utility/MiningModel.cs index 23f05f5af..1f41728bc 100644 --- a/FrEee/Utility/MiningModel.cs +++ b/FrEee.Core/Utility/MiningModel.cs @@ -1,87 +1,88 @@ -namespace FrEee.Utility; - -/// -/// A model for how resources should be mined. -/// -public class MiningModel -{ - /// - /// Does the value percentage bonus apply to the value depletion? - /// - public bool BonusAffectsDepletion { get; set; } - - /// - /// Limit mining rate after all bonuses are applied to value? - /// - public bool LimitRateToValue { get; set; } - - /// - /// The basic rate at which resources are mined. - /// Does not affect abilities which directly generate resources; only mining and remote mining. - /// - public double Rate - { - get { return RatePercentage / 100d; } - set { RatePercentage = value * 100d; } - } - - /// - /// Rate, expressed as a percentage. - /// - public double RatePercentage { get; set; } - - /// - /// Value bonus expressed as a factor. - /// - public double ValueBonus - { - get { return ValuePercentageBonus / 100d; } - set { ValuePercentageBonus = value * 100d; } - } - - /// - /// Depletion of value for each point of resources mined. - /// - public double ValueDepletionPerResource { get; set; } - - /// - /// Depletion of value for each turn that resources are mined. - /// - public int ValueDepletionPerTurn { get; set; } - - /// - /// A percentage bonus to the mining rate for each point of planet/asteroid value. - /// - public double ValuePercentageBonus { get; set; } - - /// - /// Gets the decay rate. - /// - /// The base mining rate. - /// The planet/asteroid value. - /// - public int GetDecay(int baseRate, int value) - { - double rate; - if (BonusAffectsDepletion) - rate = baseRate + baseRate * ValueBonus * value; - else - rate = baseRate; - return (int)(rate * ValueDepletionPerResource) + ValueDepletionPerTurn; - } - - /// - /// Gets the mining rate. - /// - /// The base mining rate. - /// The planet/asteroid value. - /// Any mining rate multipliers from things such as population, e.g. 1.4 for a 40% bonus. - /// - public int GetRate(int baseRate, int value, double factor) - { - var result = (int)((baseRate * Rate + baseRate * ValueBonus * value) * factor); - if (LimitRateToValue && value < result) - return value; - return result; - } -} \ No newline at end of file +using FrEee.Utility; +namespace FrEee.Utility; + +/// +/// A model for how resources should be mined. +/// +public class MiningModel +{ + /// + /// Does the value percentage bonus apply to the value depletion? + /// + public bool BonusAffectsDepletion { get; set; } + + /// + /// Limit mining rate after all bonuses are applied to value? + /// + public bool LimitRateToValue { get; set; } + + /// + /// The basic rate at which resources are mined. + /// Does not affect abilities which directly generate resources; only mining and remote mining. + /// + public double Rate + { + get { return RatePercentage / 100d; } + set { RatePercentage = value * 100d; } + } + + /// + /// Rate, expressed as a percentage. + /// + public double RatePercentage { get; set; } + + /// + /// Value bonus expressed as a factor. + /// + public double ValueBonus + { + get { return ValuePercentageBonus / 100d; } + set { ValuePercentageBonus = value * 100d; } + } + + /// + /// Depletion of value for each point of resources mined. + /// + public double ValueDepletionPerResource { get; set; } + + /// + /// Depletion of value for each turn that resources are mined. + /// + public int ValueDepletionPerTurn { get; set; } + + /// + /// A percentage bonus to the mining rate for each point of planet/asteroid value. + /// + public double ValuePercentageBonus { get; set; } + + /// + /// Gets the decay rate. + /// + /// The base mining rate. + /// The planet/asteroid value. + /// + public int GetDecay(int baseRate, int value) + { + double rate; + if (BonusAffectsDepletion) + rate = baseRate + baseRate * ValueBonus * value; + else + rate = baseRate; + return (int)(rate * ValueDepletionPerResource) + ValueDepletionPerTurn; + } + + /// + /// Gets the mining rate. + /// + /// The base mining rate. + /// The planet/asteroid value. + /// Any mining rate multipliers from things such as population, e.g. 1.4 for a 40% bonus. + /// + public int GetRate(int baseRate, int value, double factor) + { + var result = (int)((baseRate * Rate + baseRate * ValueBonus * value) * factor); + if (LimitRateToValue && value < result) + return value; + return result; + } +} diff --git a/FrEee/Utility/Pathfinder.cs b/FrEee.Core/Utility/Pathfinder.cs similarity index 96% rename from FrEee/Utility/Pathfinder.cs rename to FrEee.Core/Utility/Pathfinder.cs index c2908ccb0..018abaf21 100644 --- a/FrEee/Utility/Pathfinder.cs +++ b/FrEee.Core/Utility/Pathfinder.cs @@ -1,515 +1,517 @@ -using FrEee.Objects.Civilization; -using FrEee.Objects.Space; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using FrEee.Objects.Combat; -using FrEee.Objects.GameState; - -namespace FrEee.Utility; - -/// -/// Finds paths avoiding obstacles. -/// Adapted from http://roguebasin.roguelikedevelopment.org/index.php?title=Pathfinding -/// -public static class Pathfinder -{ - public static IDictionary, ISet>> CreateDijkstraMap(IMobileSpaceObject me, Sector start, Sector end, bool avoidEnemies, bool avoidDamagingSectors) - { - // step 2a (do it here so we can return map if start or end is null): empty map with nodes, their costs, and previous-node references - var map = new Dictionary, ISet>>(); - - // if we are nowhere or we're going nowhere, that's impossible! - if (start == null || end == null) - return map; - - var startSys = start.StarSystem; - - // pathfind! - // step 1: empty priority queue with cost to reach each node - var queue = new Dictionary>>(); - - // step 2b: empty set of previously visited nodes - var visited = new HashSet(); - - // step 3: add start node and cost - queue.Add(0, new HashSet>()); - queue[0].Add(new PathfinderNode(start, 0, null, EstimateDistance(start, end, me == null ? null : me.Owner))); - - // step 4: quit if there are no nodes (all paths exhausted without finding goal) - bool success = false; - while (queue.SelectMany(kvp => kvp.Value).Any() && !success) - { - // step 5: take lowest cost node out of queue - // TODO - also prefer straight line movement to diagonal? - var minCost = queue.Keys.Min(); - while (!queue[minCost].Any()) - { - queue.Remove(minCost); - minCost = queue.Keys.Min(); - } - var node = queue[minCost].First(); - queue[minCost].Remove(node); - map.Add(node, new HashSet>()); - - // step 6: if node is the goal, stop after it's done - success! - if (node.Location == end) - success = true; - - // step 7: check possible moves - var moves = GetPossibleMoves(node.Location, me == null ? true : me.CanWarp, me == null ? null : me.Owner); - - // step 7a: remove blocked points (aka calculate cost) - if (avoidEnemies) - // avoid enemies, except at the destination - moves = moves.Where(m => m == null || m == end || !m.SpaceObjects.Where(sobj => sobj.CheckVisibility(me.Owner) >= Visibility.Visible || sobj.FindMemory(me.Owner)?.Sector == m).OfType().Any(sobj => sobj.IsHostileTo(me == null ? null : me.Owner))); - if (avoidDamagingSectors) - // don't avoid the destination, even if it is a damaging sector - moves = moves.Where(m => m == end || m == null || !m.SpaceObjects.Where(sobj => sobj.CheckVisibility(me.Owner) >= Visibility.Visible || sobj.FindMemory(me.Owner)?.Sector == m).Any(sobj => sobj.GetAbilityValue("Sector - Damage").ToInt() > 0)); - - // step 7b: update priority queue - Action f = move => - { - // When we lock the queue, we do so because it is being checked and modified by other threads, - // and we don't want them stepping on each other's toes. - // e.g. thread 1 is checking for the existence of an item in the queue - // while thread 2 is busy adding that same item! - if (!visited.Contains(move)) - { - // didn't visit yet - var newnode = new PathfinderNode(move, node.Cost + 1, node, EstimateDistance(move, end, me == null ? null : me.Owner)); - lock (queue) - { - if (!queue.ContainsKey(newnode.Cost)) - queue.Add(newnode.Cost, new HashSet>()); - queue[newnode.Cost].Add(newnode); - } - if (!map.ContainsKey(node)) // don't need to lock map, we're only adding a node which should only get added once per run - map.Add(node, new HashSet>()); - map[node].Add(newnode); - visited.Add(move); - } - else - { - // already visited - but is it by a longer path? - var moreCost = queue.Where(kvp => kvp.Key > node.Cost + 1).SelectMany(kvp => kvp.Value); - var items = moreCost.Where(n => n.Location == move && n.Cost > node.Cost + 1); - if (items.Any()) - { - PathfinderNode newnode; - - foreach (var old in items.ToArray()) - { - lock (queue[old.Cost]) queue[old.Cost].Remove(old); - map.Remove(old); - } - newnode = new PathfinderNode(move, node.Cost + 1, node); - lock (queue[newnode.Cost]) queue[newnode.Cost].Add(newnode); - if (!map.ContainsKey(node)) // don't need to lock map, we're only adding a node which should only get added once per run - map.Add(node, new HashSet>()); - map[node].Add(newnode); - } - } - }; - moves.SafeForeach(f); - } - - return map; - } - - public static IEnumerable> CreateDijkstraMap(StarSystem start, StarSystem end) - { - // pathfind! - // step 1: empty priority queue with cost to reach each node - var queue = new List>(); - - // step 2: empty set of previously visited nodes, along with costs and previous-node references - var visited = new SafeDictionary>(); - - // step 3: add start node and cost - queue.Add(new PathfinderNode(start, 0, null)); - - // step 4: quit if there are no nodes (all paths exhausted without finding goal) - bool success = false; - while (queue.Any() && !success) - { - // step 5: take lowest cost node out of queue - // also prefer straight line movement to diagonal - var minCost = queue.Min(n => n.Cost); - var node = queue.Where(n => n.Cost == minCost).OrderBy(n => n.MinimumCostRemaining).First(); - queue.Remove(node); - - // step 6: if node is the goal, stop - success! - if (node.Location == end) - success = true; - - // step 7: check possible moves - var moves = node.Location.FindSpaceObjects().Select(wp => wp.TargetStarSystemLocation.Item); - - // step 7a: remove blocked points (aka calculate cost) - // nothing to do here - - // step 7b: update priority queue - foreach (var move in moves) - { - if (!visited.ContainsKey(move)) - { - // didn't visit yet - var newnode = new PathfinderNode(move, node.Cost + 1, node); - queue.Add(newnode); - visited.Add(move, newnode); - } - else - { - // already visited - but is it by a longer path? - var items = queue.Where(n => n.Location == move && n.Cost > node.Cost + 1); - if (items.Any()) - { - foreach (var old in items.ToArray()) - queue.Remove(old); - var newnode = new PathfinderNode(move, node.Cost + 1, node); - queue.Add(newnode); - visited.Add(move, newnode); - } - } - } - } - - return visited.Values; - } - - public static IEnumerable> CreateDijkstraMap(T start, T end, ConnectivityGraph graph) - { - // pathfind! - // step 1: empty priority queue with cost to reach each node - var queue = new List>(); - - // step 2: empty set of previously visited nodes, along with costs and previous-node references - var visited = new SafeDictionary>(); - - // step 3: add start node and cost - queue.Add(new PathfinderNode(start, 0, null)); - - // step 4: quit if there are no nodes (all paths exhausted without finding goal) - bool success = false; - while (queue.Any() && !success) - { - // step 5: take lowest cost node out of queue - // also prefer straight line movement to diagonal - var minCost = queue.Min(n => n.Cost); - var node = queue.Where(n => n.Cost == minCost).First(); - queue.Remove(node); - - // step 6: if node is the goal, stop - success! - if (node.Location.Equals(end)) - success = true; - - // step 7: check possible moves - var moves = graph.GetExits(node.Location); - - // step 7a: remove blocked points (aka calculate cost) - // nothing to do here - - // step 7b: update priority queue - foreach (var move in moves) - { - if (!visited.ContainsKey(move)) - { - // didn't visit yet - var newnode = new PathfinderNode(move, node.Cost + 1, node); - queue.Add(newnode); - visited.Add(move, newnode); - } - else - { - // already visited - but is it by a longer path? - var items = queue.Where(n => n.Location.Equals(move) && n.Cost > node.Cost + 1); - if (items.Any()) - { - foreach (var old in items.ToArray()) - queue.Remove(old); - var newnode = new PathfinderNode(move, node.Cost + 1, node); - queue.Add(newnode); - visited.Add(move, newnode); - } - } - } - } - - return visited.Values; - } - - /// - /// Makes a minimum estimate of the distance to reach a sector. - /// - /// - /// - /// - public static int EstimateDistance(Sector start, Sector end, Empire emp) - { - if (start == null) - return 0; - - int sublightDistance = int.MaxValue; - int ftlDistance = int.MaxValue; - - // same system? just go along grid, ignoring obstacles - if (start != null && end != null && start.StarSystem == end.StarSystem) - sublightDistance = start.Coordinates.EightWayDistance(end.Coordinates); - - // different system? find nearest warp point in each system, and assume they are connected to each other ("warp nexus") - var wps1 = FindNearestWarpPointSectorInSystem(start, emp, false); - var wps2 = FindNearestWarpPointSectorInSystem(end, emp, true); - if (wps1 != null && wps2 != null) - ftlDistance = start.Coordinates.EightWayDistance(wps1.Coordinates) + end.Coordinates.EightWayDistance(wps2.Coordinates) + 1; - - // check for unexplored warp points - if (wps1 != null && !wps1.IsExploredBy(emp) && !end.IsExploredBy(emp)) - ftlDistance = start.Coordinates.EightWayDistance(wps1.Coordinates) + 1; - if (!start.IsExploredBy(emp) && wps2 != null && !wps2.IsExploredBy(emp)) - ftlDistance = end.Coordinates.EightWayDistance(wps2.Coordinates) + 1; - if (!start.IsExploredBy(emp) && !end.IsExploredBy(emp)) - ftlDistance = 0; - - return Math.Min(sublightDistance, ftlDistance); - } - - public static Sector FindNearestWarpPointSectorInSystem(Sector sector, Empire emp, bool findWarpIn) - { - if (sector == null) - return null; - if (sector.StarSystem == null) - return null; // no guarantee that the warp point to the unexplored system is two-way! - if (emp != null && !emp.HasExplored(sector.StarSystem)) - return null; // no cheating! - if (findWarpIn) // find a warp point leading into the system - return Galaxy.Current.FindSpaceObjects().Where(wp => wp.Target != null && wp.Target.StarSystem == sector.StarSystem && wp.HasVisibility(emp, Visibility.Fogged)).Select(wp => wp.Target).WithMin(s => sector.Coordinates.EightWayDistance(s.Coordinates)).FirstOrDefault(); // use HasVisibility instead of CheckVisibility, it's faster when all we want is visible/invisible and don't care about scanning - else // find a warp point leading out of the system - return sector.StarSystem.FindSpaceObjects().Select(wp => new Sector(sector.StarSystem, wp.FindCoordinates())).WithMin(s => sector.Coordinates.EightWayDistance(s.Coordinates)).FirstOrDefault(); - } - - public static IEnumerable GetPossibleMoves(Sector s, bool canWarp, Empire emp) - { - var moves = new List(); - - // no moving in an unexplored system until we've explored it - if (s == null || !s.IsExploredBy(emp)) - yield break; - - var sys = s.StarSystem; - - // normal moves - foreach (var dx in new int[] { 0, -1, 1 }) - { - foreach (var dy in new int[] { 0, -1, 1 }) - { - if (dx == 0 && dy == 0) - continue; // no need to sit still! - var coords = s.Coordinates; - if (Math.Abs(coords.X + dx) <= sys.Radius && Math.Abs(coords.Y + dy) <= sys.Radius) - yield return sys.GetSector(new Point(coords.X + dx, coords.Y + dy)); - } - } - - if (canWarp) - { - // warp points - foreach (var wp in s.SpaceObjects.OfType()) - yield return wp.Target; - } - } - - /// - /// Navigation for space objects. - /// - /// - /// - /// - /// - /// - public static IEnumerable Pathfind(IMobileSpaceObject me, Sector start, Sector end, bool avoidEnemies, bool avoidDamagingSectors, IDictionary, ISet>> map) - { - bool cacheEnabled = Galaxy.Current.IsAbilityCacheEnabled; - if (!cacheEnabled) - Galaxy.Current.EnableAbilityCache(); - if (end == null || end.StarSystem == null || start == end) - return Enumerable.Empty(); - if (me != null && me.StrategicSpeed < 1) - return Enumerable.Empty(); - - if (map == null) - map = CreateDijkstraMap(me, start, end, avoidEnemies, avoidDamagingSectors); - - if (!map.Any()) - return Enumerable.Empty(); // nowhere to go! - - var nodes = new List>(); - PathfinderNode node; - - if (map.Keys.Any(n => n.Location == end)) - { - // can reach it - node = map.Keys.Where(n => n.Location == end).OrderBy(n => n.Cost).First(); - } - else - { - // can't reach it; get as close as possible - var dist = map.Keys.Min(n => n.MinimumCostRemaining); - node = map.Keys.First(n => n.MinimumCostRemaining == dist); - } - - while (node != null) - { - nodes.Add(node); - node = node.PreviousNode; - } - if (!cacheEnabled) - Galaxy.Current.DisableAbilityCache(); - return nodes.Select(n => n.Location).Where(s => s != start).Reverse(); - } - - /// - /// Navigation via warp points with each jump counting as 1 move. - /// TODO - optimize this algorithm just like the sector algorithm - /// - /// - /// - /// - /// - /// - public static IEnumerable Pathfind(StarSystem start, StarSystem end) - { - if (start == end) - return Enumerable.Empty(); - - var map = CreateDijkstraMap(start, end); - - if (!map.Any()) - return Enumerable.Empty(); // can't go there - - if (map.Any(n => n.Location == end)) - { - // can reach it - var nodes = new List>(); - var node = map.Where(n => n.Location == end).OrderBy(n => n.Cost).First(); - while (node != null) - { - nodes.Add(node); - node = node.PreviousNode; - } - return nodes.Select(n => n.Location).Where(s => s != start).Reverse(); - } - else - { - // can't reach it; get as close as possible - var reverseMap = CreateDijkstraMap(end, start); - var target = reverseMap.Join(map, rev => rev.Location, fwd => fwd.Location, (rev, fwd) => new { Location = rev.Location, ForwardCost = fwd.Cost, ReverseCost = rev.Cost }).WithMin(n => n.ReverseCost).WithMin(n => n.ForwardCost).FirstOrDefault(); - if (target == null) - return Enumerable.Empty(); // can't go there - else - { - // go to the closest point - var nodes = new List>(); - var node = map.Where(n => n.Location == target.Location).OrderBy(n => n.Cost).First(); - while (node != null) - { - nodes.Add(node); - node = node.PreviousNode; - } - return nodes.Select(n => n.Location).Where(s => s != start).Reverse(); - } - } - } - - /// - /// Navigation on an arbitrary connectivity graph. - /// TODO - optimize this algorithm just like the sector algorithm - /// - /// - /// - /// - /// - /// - public static IEnumerable Pathfind(T start, T end, ConnectivityGraph graph) - { - if (start.Equals(end)) - return Enumerable.Empty(); - - var map = CreateDijkstraMap(start, end, graph); - - if (!map.Any()) - return Enumerable.Empty(); // can't go there - - if (map.Any(n => n.Location.Equals(end))) - { - // can reach it - var nodes = new List>(); - var node = map.Where(n => n.Location.Equals(end)).OrderBy(n => n.Cost).First(); - while (node != null) - { - nodes.Add(node); - node = node.PreviousNode; - } - return nodes.Select(n => n.Location).Where(s => !s.Equals(start)).Reverse(); - } - else - { - // can't reach it; get as close as possible - var reverseMap = CreateDijkstraMap(end, start, graph); - var target = reverseMap.Join(map, rev => rev.Location, fwd => fwd.Location, (rev, fwd) => new { Location = rev.Location, ForwardCost = fwd.Cost, ReverseCost = rev.Cost }).WithMin(n => n.ReverseCost).WithMin(n => n.ForwardCost).FirstOrDefault(); - if (target == null) - return Enumerable.Empty(); // can't go there - else - { - // go to the closest point - var nodes = new List>(); - var node = map.Where(n => n.Location.Equals(target.Location)).OrderBy(n => n.Cost).First(); - while (node != null) - { - nodes.Add(node); - node = node.PreviousNode; - } - return nodes.Select(n => n.Location).Where(s => !s.Equals(start)).Reverse(); - } - } - } -} - -public class PathfinderNode -{ - public PathfinderNode(T location, int cost, PathfinderNode previousNode, int minRemaining = 0) - { - Location = location; - Cost = cost; - PreviousNode = previousNode; - MinimumCostRemaining = minRemaining; - } - - /// - /// The cost to reach this node from the start node. - /// - public int Cost { get; set; } - - /// - /// The current location. - /// - public T Location { get; set; } - - /// - /// A minimum estimate on the remaining cost to reach the destination. - /// This must never be an overestimate, or the pathfinding might fail even when it is possible to reach the destination! - /// - public int MinimumCostRemaining { get; set; } - - /// - /// The previous node in the current path. - /// - public PathfinderNode PreviousNode { get; set; } - - public override string ToString() - { - return "From " + PreviousNode.Location + " to " + Location + " (cost=" + Cost + ", minRemaining=" + MinimumCostRemaining + ")"; - } +using FrEee.Objects.Civilization; +using FrEee.Objects.Space; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; + +namespace FrEee.Utility; + +/// +/// Finds paths avoiding obstacles. +/// Adapted from http://roguebasin.roguelikedevelopment.org/index.php?title=Pathfinding +/// +public static class Pathfinder +{ + public static IDictionary, ISet>> CreateDijkstraMap(IMobileSpaceObject me, Sector start, Sector end, bool avoidEnemies, bool avoidDamagingSectors) + { + // step 2a (do it here so we can return map if start or end is null): empty map with nodes, their costs, and previous-node references + var map = new Dictionary, ISet>>(); + + // if we are nowhere or we're going nowhere, that's impossible! + if (start == null || end == null) + return map; + + var startSys = start.StarSystem; + + // pathfind! + // step 1: empty priority queue with cost to reach each node + var queue = new Dictionary>>(); + + // step 2b: empty set of previously visited nodes + var visited = new HashSet(); + + // step 3: add start node and cost + queue.Add(0, new HashSet>()); + queue[0].Add(new PathfinderNode(start, 0, null, EstimateDistance(start, end, me == null ? null : me.Owner))); + + // step 4: quit if there are no nodes (all paths exhausted without finding goal) + bool success = false; + while (queue.SelectMany(kvp => kvp.Value).Any() && !success) + { + // step 5: take lowest cost node out of queue + // TODO - also prefer straight line movement to diagonal? + var minCost = queue.Keys.Min(); + while (!queue[minCost].Any()) + { + queue.Remove(minCost); + minCost = queue.Keys.Min(); + } + var node = queue[minCost].First(); + queue[minCost].Remove(node); + map.Add(node, new HashSet>()); + + // step 6: if node is the goal, stop after it's done - success! + if (node.Location == end) + success = true; + + // step 7: check possible moves + var moves = GetPossibleMoves(node.Location, me is null ? true : me.CanWarp, me == null ? null : me.Owner); + + // step 7a: remove blocked points (aka calculate cost) + if (avoidEnemies) + // avoid enemies, except at the destination + moves = moves.Where(m => m == null || m == end || !m.SpaceObjects.Where(sobj => sobj.CheckVisibility(me.Owner) >= Visibility.Visible || sobj.FindMemory(me.Owner)?.Sector == m).OfType().Any(sobj => sobj.IsHostileTo(me == null ? null : me.Owner))); + if (avoidDamagingSectors) + // don't avoid the destination, even if it is a damaging sector + moves = moves.Where(m => m == end || m == null || !m.SpaceObjects.Where(sobj => sobj.CheckVisibility(me.Owner) >= Visibility.Visible || sobj.FindMemory(me.Owner)?.Sector == m).Any(sobj => sobj.GetAbilityValue("Sector - Damage").ToInt() > 0)); + + // step 7b: update priority queue + Action f = move => + { + // When we lock the queue, we do so because it is being checked and modified by other threads, + // and we don't want them stepping on each other's toes. + // e.g. thread 1 is checking for the existence of an item in the queue + // while thread 2 is busy adding that same item! + if (!visited.Contains(move)) + { + // didn't visit yet + var newnode = new PathfinderNode(move, node.Cost + 1, node, EstimateDistance(move, end, me == null ? null : me.Owner)); + lock (queue) + { + if (!queue.ContainsKey(newnode.Cost)) + queue.Add(newnode.Cost, new HashSet>()); + queue[newnode.Cost].Add(newnode); + } + if (!map.ContainsKey(node)) // don't need to lock map, we're only adding a node which should only get added once per run + map.Add(node, new HashSet>()); + map[node].Add(newnode); + visited.Add(move); + } + else + { + // already visited - but is it by a longer path? + var moreCost = queue.Where(kvp => kvp.Key > node.Cost + 1).SelectMany(kvp => kvp.Value); + var items = moreCost.Where(n => n.Location == move && n.Cost > node.Cost + 1); + if (items.Any()) + { + PathfinderNode newnode; + + foreach (var old in items.ToArray()) + { + lock (queue[old.Cost]) queue[old.Cost].Remove(old); + map.Remove(old); + } + newnode = new PathfinderNode(move, node.Cost + 1, node); + lock (queue[newnode.Cost]) queue[newnode.Cost].Add(newnode); + if (!map.ContainsKey(node)) // don't need to lock map, we're only adding a node which should only get added once per run + map.Add(node, new HashSet>()); + map[node].Add(newnode); + } + } + }; + moves.SafeForeach(f); + } + + return map; + } + + public static IEnumerable> CreateDijkstraMap(StarSystem start, StarSystem end) + { + // pathfind! + // step 1: empty priority queue with cost to reach each node + var queue = new List>(); + + // step 2: empty set of previously visited nodes, along with costs and previous-node references + var visited = new SafeDictionary>(); + + // step 3: add start node and cost + queue.Add(new PathfinderNode(start, 0, null)); + + // step 4: quit if there are no nodes (all paths exhausted without finding goal) + bool success = false; + while (queue.Any() && !success) + { + // step 5: take lowest cost node out of queue + // also prefer straight line movement to diagonal + var minCost = queue.Min(n => n.Cost); + var node = queue.Where(n => n.Cost == minCost).OrderBy(n => n.MinimumCostRemaining).First(); + queue.Remove(node); + + // step 6: if node is the goal, stop - success! + if (node.Location == end) + success = true; + + // step 7: check possible moves + var moves = node.Location.FindSpaceObjects().Select(wp => wp.TargetStarSystemLocation.Item); + + // step 7a: remove blocked points (aka calculate cost) + // nothing to do here + + // step 7b: update priority queue + foreach (var move in moves) + { + if (!visited.ContainsKey(move)) + { + // didn't visit yet + var newnode = new PathfinderNode(move, node.Cost + 1, node); + queue.Add(newnode); + visited.Add(move, newnode); + } + else + { + // already visited - but is it by a longer path? + var items = queue.Where(n => n.Location == move && n.Cost > node.Cost + 1); + if (items.Any()) + { + foreach (var old in items.ToArray()) + queue.Remove(old); + var newnode = new PathfinderNode(move, node.Cost + 1, node); + queue.Add(newnode); + visited.Add(move, newnode); + } + } + } + } + + return visited.Values; + } + + public static IEnumerable> CreateDijkstraMap(T start, T end, ConnectivityGraph graph) + { + // pathfind! + // step 1: empty priority queue with cost to reach each node + var queue = new List>(); + + // step 2: empty set of previously visited nodes, along with costs and previous-node references + var visited = new SafeDictionary>(); + + // step 3: add start node and cost + queue.Add(new PathfinderNode(start, 0, null)); + + // step 4: quit if there are no nodes (all paths exhausted without finding goal) + bool success = false; + while (queue.Any() && !success) + { + // step 5: take lowest cost node out of queue + // also prefer straight line movement to diagonal + var minCost = queue.Min(n => n.Cost); + var node = queue.Where(n => n.Cost == minCost).First(); + queue.Remove(node); + + // step 6: if node is the goal, stop - success! + if (node.Location.Equals(end)) + success = true; + + // step 7: check possible moves + var moves = graph.GetExits(node.Location); + + // step 7a: remove blocked points (aka calculate cost) + // nothing to do here + + // step 7b: update priority queue + foreach (var move in moves) + { + if (!visited.ContainsKey(move)) + { + // didn't visit yet + var newnode = new PathfinderNode(move, node.Cost + 1, node); + queue.Add(newnode); + visited.Add(move, newnode); + } + else + { + // already visited - but is it by a longer path? + var items = queue.Where(n => n.Location.Equals(move) && n.Cost > node.Cost + 1); + if (items.Any()) + { + foreach (var old in items.ToArray()) + queue.Remove(old); + var newnode = new PathfinderNode(move, node.Cost + 1, node); + queue.Add(newnode); + visited.Add(move, newnode); + } + } + } + } + + return visited.Values; + } + + /// + /// Makes a minimum estimate of the distance to reach a sector. + /// + /// + /// + /// + public static int EstimateDistance(Sector start, Sector end, Empire emp) + { + if (start == null) + return 0; + + int sublightDistance = int.MaxValue; + int ftlDistance = int.MaxValue; + + // same system? just go along grid, ignoring obstacles + if (start != null && end != null && start.StarSystem == end.StarSystem) + sublightDistance = start.Coordinates.EightWayDistance(end.Coordinates); + + // different system? find nearest warp point in each system, and assume they are connected to each other ("warp nexus") + var wps1 = FindNearestWarpPointSectorInSystem(start, emp, false); + var wps2 = FindNearestWarpPointSectorInSystem(end, emp, true); + if (wps1 != null && wps2 != null) + ftlDistance = start.Coordinates.EightWayDistance(wps1.Coordinates) + end.Coordinates.EightWayDistance(wps2.Coordinates) + 1; + + // check for unexplored warp points + if (wps1 != null && !wps1.IsExploredBy(emp) && !end.IsExploredBy(emp)) + ftlDistance = start.Coordinates.EightWayDistance(wps1.Coordinates) + 1; + if (!start.IsExploredBy(emp) && wps2 != null && !wps2.IsExploredBy(emp)) + ftlDistance = end.Coordinates.EightWayDistance(wps2.Coordinates) + 1; + if (!start.IsExploredBy(emp) && !end.IsExploredBy(emp)) + ftlDistance = 0; + + return Math.Min(sublightDistance, ftlDistance); + } + + public static Sector FindNearestWarpPointSectorInSystem(Sector sector, Empire emp, bool findWarpIn) + { + if (sector == null) + return null; + if (sector.StarSystem == null) + return null; // no guarantee that the warp point to the unexplored system is two-way! + if (emp != null && !emp.HasExplored(sector.StarSystem)) + return null; // no cheating! + if (findWarpIn) // find a warp point leading into the system + return Galaxy.Current.FindSpaceObjects().Where(wp => wp.Target != null && wp.Target.StarSystem == sector.StarSystem && wp.HasVisibility(emp, Visibility.Fogged)).Select(wp => wp.Target).WithMin(s => sector.Coordinates.EightWayDistance(s.Coordinates)).FirstOrDefault(); // use HasVisibility instead of CheckVisibility, it's faster when all we want is visible/invisible and don't care about scanning + else // find a warp point leading out of the system + return sector.StarSystem.FindSpaceObjects().Select(wp => new Sector(sector.StarSystem, wp.FindCoordinates())).WithMin(s => sector.Coordinates.EightWayDistance(s.Coordinates)).FirstOrDefault(); + } + + public static IEnumerable GetPossibleMoves(Sector s, bool canWarp, Empire emp) + { + var moves = new List(); + + // no moving in an unexplored system until we've explored it + if (s == null || !s.IsExploredBy(emp)) + yield break; + + var sys = s.StarSystem; + + // normal moves + foreach (var dx in new int[] { 0, -1, 1 }) + { + foreach (var dy in new int[] { 0, -1, 1 }) + { + if (dx == 0 && dy == 0) + continue; // no need to sit still! + var coords = s.Coordinates; + if (Math.Abs(coords.X + dx) <= sys.Radius && Math.Abs(coords.Y + dy) <= sys.Radius) + yield return sys.GetSector(new Point(coords.X + dx, coords.Y + dy)); + } + } + + if (canWarp) + { + // warp points + foreach (var wp in s.SpaceObjects.OfType()) + yield return wp.Target; + } + } + + /// + /// Navigation for space objects. + /// + /// + /// + /// + /// + /// + public static IEnumerable Pathfind(IMobileSpaceObject me, Sector start, Sector end, bool avoidEnemies, bool avoidDamagingSectors, IDictionary, ISet>> map) + { + bool cacheEnabled = Galaxy.Current.IsAbilityCacheEnabled; + if (!cacheEnabled) + Galaxy.Current.EnableAbilityCache(); + if (end == null || end.StarSystem == null || start == end) + return Enumerable.Empty(); + if (me != null && me.StrategicSpeed < 1) + return Enumerable.Empty(); + + if (map == null) + map = CreateDijkstraMap(me, start, end, avoidEnemies, avoidDamagingSectors); + + if (!map.Any()) + return Enumerable.Empty(); // nowhere to go! + + var nodes = new List>(); + PathfinderNode node; + + if (map.Keys.Any(n => n.Location == end)) + { + // can reach it + node = map.Keys.Where(n => n.Location == end).OrderBy(n => n.Cost).First(); + } + else + { + // can't reach it; get as close as possible + var dist = map.Keys.Min(n => n.MinimumCostRemaining); + node = map.Keys.First(n => n.MinimumCostRemaining == dist); + } + + while (node != null) + { + nodes.Add(node); + node = node.PreviousNode; + } + if (!cacheEnabled) + Galaxy.Current.DisableAbilityCache(); + return nodes.Select(n => n.Location).Where(s => s != start).Reverse(); + } + + /// + /// Navigation via warp points with each jump counting as 1 move. + /// TODO - optimize this algorithm just like the sector algorithm + /// + /// + /// + /// + /// + /// + public static IEnumerable Pathfind(StarSystem start, StarSystem end) + { + if (start == end) + return Enumerable.Empty(); + + var map = CreateDijkstraMap(start, end); + + if (!map.Any()) + return Enumerable.Empty(); // can't go there + + if (map.Any(n => n.Location == end)) + { + // can reach it + var nodes = new List>(); + var node = map.Where(n => n.Location == end).OrderBy(n => n.Cost).First(); + while (node != null) + { + nodes.Add(node); + node = node.PreviousNode; + } + return nodes.Select(n => n.Location).Where(s => s != start).Reverse(); + } + else + { + // can't reach it; get as close as possible + var reverseMap = CreateDijkstraMap(end, start); + var target = reverseMap.Join(map, rev => rev.Location, fwd => fwd.Location, (rev, fwd) => new { Location = rev.Location, ForwardCost = fwd.Cost, ReverseCost = rev.Cost }).WithMin(n => n.ReverseCost).WithMin(n => n.ForwardCost).FirstOrDefault(); + if (target == null) + return Enumerable.Empty(); // can't go there + else + { + // go to the closest point + var nodes = new List>(); + var node = map.Where(n => n.Location == target.Location).OrderBy(n => n.Cost).First(); + while (node != null) + { + nodes.Add(node); + node = node.PreviousNode; + } + return nodes.Select(n => n.Location).Where(s => s != start).Reverse(); + } + } + } + + /// + /// Navigation on an arbitrary connectivity graph. + /// TODO - optimize this algorithm just like the sector algorithm + /// + /// + /// + /// + /// + /// + public static IEnumerable Pathfind(T start, T end, ConnectivityGraph graph) + { + if (start.Equals(end)) + return Enumerable.Empty(); + + var map = CreateDijkstraMap(start, end, graph); + + if (!map.Any()) + return Enumerable.Empty(); // can't go there + + if (map.Any(n => n.Location.Equals(end))) + { + // can reach it + var nodes = new List>(); + var node = map.Where(n => n.Location.Equals(end)).OrderBy(n => n.Cost).First(); + while (node != null) + { + nodes.Add(node); + node = node.PreviousNode; + } + return nodes.Select(n => n.Location).Where(s => !s.Equals(start)).Reverse(); + } + else + { + // can't reach it; get as close as possible + var reverseMap = CreateDijkstraMap(end, start, graph); + var target = reverseMap.Join(map, rev => rev.Location, fwd => fwd.Location, (rev, fwd) => new { Location = rev.Location, ForwardCost = fwd.Cost, ReverseCost = rev.Cost }).WithMin(n => n.ReverseCost).WithMin(n => n.ForwardCost).FirstOrDefault(); + if (target == null) + return Enumerable.Empty(); // can't go there + else + { + // go to the closest point + var nodes = new List>(); + var node = map.Where(n => n.Location.Equals(target.Location)).OrderBy(n => n.Cost).First(); + while (node != null) + { + nodes.Add(node); + node = node.PreviousNode; + } + return nodes.Select(n => n.Location).Where(s => !s.Equals(start)).Reverse(); + } + } + } +} + +public class PathfinderNode +{ + public PathfinderNode(T location, int cost, PathfinderNode previousNode, int minRemaining = 0) + { + Location = location; + Cost = cost; + PreviousNode = previousNode; + MinimumCostRemaining = minRemaining; + } + + /// + /// The cost to reach this node from the start node. + /// + public int Cost { get; set; } + + /// + /// The current location. + /// + public T Location { get; set; } + + /// + /// A minimum estimate on the remaining cost to reach the destination. + /// This must never be an overestimate, or the pathfinding might fail even when it is possible to reach the destination! + /// + public int MinimumCostRemaining { get; set; } + + /// + /// The previous node in the current path. + /// + public PathfinderNode PreviousNode { get; set; } + + public override string ToString() + { + return "From " + PreviousNode.Location + " to " + Location + " (cost=" + Cost + ", minRemaining=" + MinimumCostRemaining + ")"; + } } \ No newline at end of file diff --git a/FrEee/Utility/Pictures.cs b/FrEee.Core/Utility/Pictures.cs similarity index 97% rename from FrEee/Utility/Pictures.cs rename to FrEee.Core/Utility/Pictures.cs index f589c43b2..91214262e 100644 --- a/FrEee/Utility/Pictures.cs +++ b/FrEee.Core/Utility/Pictures.cs @@ -1,1069 +1,1070 @@ -using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; -using FrEee.Objects.Space; -using FrEee.Objects.Technology; -using FrEee.Objects.Vehicles; -using FrEee.Setup; -using FrEee.Modding; -using FrEee.Modding.Templates; -using FrEee.Extensions; -using Svg; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Reflection; - -namespace FrEee.Utility; - -/// -/// Utility methods for handling pictures. -/// -public static class Pictures -{ - static Pictures() - { - // Set up the generic images - Image img; - Graphics g; - - // TODO - moddable generic pics - - // star - img = new Bitmap(128, 128); - g = Graphics.FromImage(img); - g.FillEllipse(new SolidBrush(Color.Yellow), 10, 10, 108, 108); - g.DrawEllipse(new Pen(Color.White, 3), 10, 10, 108, 108); - genericPictures.Add(typeof(Star), img); - - // planet - img = new Bitmap(128, 128); - g = Graphics.FromImage(img); - g.FillEllipse(new SolidBrush(Color.Blue), 10, 10, 108, 108); - g.DrawEllipse(new Pen(Color.White, 3), 10, 10, 108, 108); - genericPictures.Add(typeof(Planet), img); - - // asteroid field - img = new Bitmap(128, 128); - g = Graphics.FromImage(img); - g.FillEllipse(new SolidBrush(Color.Gray), 10, 10, 25, 25); - g.FillEllipse(new SolidBrush(Color.Gray), 45, 15, 25, 25); - g.FillEllipse(new SolidBrush(Color.Gray), 75, 90, 25, 25); - g.FillEllipse(new SolidBrush(Color.Gray), 30, 70, 25, 25); - g.FillEllipse(new SolidBrush(Color.Gray), 15, 60, 25, 25); - genericPictures.Add(typeof(AsteroidField), img); - - // storm - img = new Bitmap(128, 128); - g = Graphics.FromImage(img); - g.Clear(Color.Purple); - genericPictures.Add(typeof(Storm), img); - - // warp point - img = new Bitmap(128, 128); - g = Graphics.FromImage(img); - g.DrawEllipse(new Pen(Color.Blue, 3), 10, 10, 108, 108); - g.DrawEllipse(new Pen(Color.Blue, 3), 20, 20, 88, 88); - g.DrawEllipse(new Pen(Color.Blue, 3), 30, 20, 68, 68); - genericPictures.Add(typeof(WarpPoint), img); - - // facility - img = new Bitmap(128, 128); - g = Graphics.FromImage(img); - g.FillRectangle(new SolidBrush(Color.Silver), 10, 10, 108, 108); - genericPictures.Add(typeof(FacilityTemplate), img); - - // component - img = new Bitmap(128, 128); - g = Graphics.FromImage(img); - g.FillEllipse(new SolidBrush(Color.Silver), 10, 10, 108, 108); - genericPictures.Add(typeof(ComponentTemplate), img); - - // hull/design/vehicle - img = new Bitmap(128, 128); - g = Graphics.FromImage(img); - var top = new Point(64, 0); - var bottomLeft = new Point(0, 128); - var bottomRight = new Point(128, 128); - var pts = new Point[] { top, bottomLeft, bottomRight }; - g.FillPolygon(Brushes.Gray, pts); - genericPictures.Add(typeof(IHull), img); - genericPictures.Add(typeof(IDesign), img); - genericPictures.Add(typeof(IVehicle), img); - genericPictures.Add(typeof(Seeker), img); - - // fleet - img = new Bitmap(128, 128); - g = Graphics.FromImage(img); - top = new Point(64, 0); - bottomLeft = new Point(32, 64); - bottomRight = new Point(96, 64); - pts = new Point[] { top, bottomLeft, bottomRight }; - g.FillPolygon(Brushes.Gray, pts); - top = new Point(32, 128); - bottomLeft = new Point(0, 192); - bottomRight = new Point(64, 192); - pts = new Point[] { top, bottomLeft, bottomRight }; - g.FillPolygon(Brushes.Gray, pts); - top = new Point(96, 128); - bottomLeft = new Point(64, 192); - bottomRight = new Point(128, 192); - pts = new Point[] { top, bottomLeft, bottomRight }; - g.FillPolygon(Brushes.Gray, pts); - genericPictures.Add(typeof(Fleet), img); - - // TODO - mount, race, empire, seeker generic pics - } - - /// - /// Picture cache for raw images on disk. - /// - private static IDictionary fileCache = new Dictionary(); - - /// - /// Generic pictures to use for space objects with missing pictures. - /// - private static IDictionary genericPictures = new Dictionary(); - - /// - /// Picture cache for objects. - /// - private static IDictionary objectPortraits = new Dictionary(); - - /// - /// Crops an image to a specific size at a specific position. - /// - /// The source image. - /// The upper left corner of the crop rectangle. - /// The size of the crop rectangle. - /// The cropped image. - public static Image Crop(this Image src, Point upperLeft, Size size) - { - // http://stackoverflow.com/questions/734930/how-to-crop-an-image-using-c - var rect = new Rectangle(upperLeft, size); - var bmp = new Bitmap(size.Width, size.Height); - var g = Graphics.FromImage(bmp); - g.DrawImage(src, new Rectangle(0, 0, size.Width, size.Height), rect, GraphicsUnit.Pixel); - return bmp; - } - - /// - /// Crops an image to a size relative to the source image's size with (1,1) being the full size of the image. - /// - /// - /// - /// - /// - public static Image CropRelative(this Image src, PointF upperLeft, SizeF size) - { - var ul = new Point((int)(upperLeft.X * src.Width), (int)(upperLeft.Y * src.Height)); - var sz = new Size((int)(size.Width * src.Width), (int)(size.Height * src.Height)); - return src.Crop(ul, sz); - } - - /// - /// Draws a red X across an image. - /// - /// - /// - public static Image CrossOut(Image img) - { - var img2 = (Image)img.Clone(); - var thickness = (img2.Width + img2.Height) / 16f; - var g = Graphics.FromImage(img2); - var pen = new Pen(Color.Red, thickness); - g.DrawLine(pen, 0, 0, img2.Width, img2.Height); - g.DrawLine(pen, 0, img2.Height, img2.Width, 0); - return img2; - } - - /// - /// Scales an image and frames it in blank space. - /// The image should be square. - /// - /// The source image. - /// The scale factor. - /// - public static Image Frame(this Image src, double scale) - { - if (src == null) - return null; - if (scale == 1d) - return (Image)src.Clone(); - var scaled = src.Resize((int)Math.Ceiling(Math.Max(src.Width, src.Height) * scale)); - var result = new Bitmap(src.Width, src.Height); - var g = Graphics.FromImage(result); - g.DrawImage(scaled, (result.Width - scaled.Width) / 2, (result.Height - scaled.Height) / 2); - return result; - } - - public static Image GetCachedImage(IEnumerable paths, double scale = 1d) - { - foreach (var path in paths) - { - var img = GetCachedImage(path, scale); - if (img != null) - return img; - } - return null; - } - - public static Image GetCachedImage(string path, double scale = 1d) - { - if (string.IsNullOrEmpty(Path.GetExtension(path))) - { - // check SVG, then PNG, then BMP, if no extension specified - // don't scale BMP files (unless they're specifically requested as BMP with a scale factor) - return GetCachedImage(path + ".svg", scale) ?? GetCachedImage(path + ".png", scale) ?? GetCachedImage(path + ".bmp"); - } - - if (!fileCache.ContainsKey(path)) - { - // make sure relative paths are relative to the executable, not some random working directory we might have started in (e.g. AutoPBW) - if (path != Path.GetFullPath(path)) - path = Path.Combine(Path.GetFullPath(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)), path); - - if (File.Exists(path)) - { - try - { - if (path.ToLower().EndsWith(".svg")) - { - var svg = SvgDocument.Open(path); - fileCache[path] = svg.Draw(512, 512); - } - else - { - var bmp = new Bitmap(path); - if (Path.GetExtension(path).ToLower() == ".bmp") - bmp.MakeTransparent(Color.Black); - fileCache[path] = bmp; - } - } - catch (Exception ex) - { - Console.Error.WriteLine("Could not load " + Path.GetFullPath(path) + ": " + ex.Message); - fileCache[path] = null; - } - } - else - { - Console.Error.WriteLine("Could not find " + Path.GetFullPath(path) + "."); - fileCache[path] = null; - } - } - return fileCache[path].Frame(scale); - } - - public static Image GetGenericImage(double scale = 1.0) - { - return GetGenericImage(typeof(T), scale); - } - - /// - /// Gets a generic image for a type of object. - /// - /// The type of object. - /// The scale factor. If less than 1, the image will be shrunk and "framed" with blank space. - /// - public static Image GetGenericImage(Type type, double scale = 1d) - { - if (genericPictures.ContainsKey(type)) - return genericPictures[type].Frame(scale); - else - { - // check base type and interfaces - if (type.BaseType != null && genericPictures.ContainsKey(type.BaseType)) - return genericPictures[type.BaseType].Frame(scale); - - foreach (var i in type.GetInterfaces()) - { - if (genericPictures.ContainsKey(i)) - return genericPictures[i].Frame(scale); - } - - // yay recursion - Image img = null; - if (type.BaseType != null) - img = GetGenericImage(type.BaseType, scale); - if (img != null) - return img; - foreach (var i in type.GetInterfaces()) - { - img = GetGenericImage(i, scale); - if (img != null) - return img; - } - } - return GetSolidColorImage(Color.Transparent); - } - - /// - /// Gets the icon image for a stellar object. - /// - /// - /// - public static Image GetIcon(StellarObject sobj) - { - var portrait = GetPortrait(sobj); - if (portrait == null) - return null; - var img = portrait.GetThumbnailImage(32, 32, () => false, IntPtr.Zero); - - if (sobj is Planet) - { - var p = (Planet)sobj; - if (p.Colony == null) - p.DrawStatusIcons(img); - else - p.DrawPopulationBars(img); - } - - return img; - } - - /// - /// Gets the icon image for a facility. - /// - /// - /// - public static Image GetIcon(FacilityTemplate f) - { - var portrait = GetPortrait(f); - if (portrait == null) - return null; - var thumb = portrait.GetThumbnailImage(32, 32, () => false, IntPtr.Zero); - var g = Graphics.FromImage(thumb); - var font = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Regular); - var brush = Brushes.White; - var sf = new StringFormat(); - sf.Alignment = StringAlignment.Far; - sf.LineAlignment = StringAlignment.Far; - if (f.RomanNumeral != null && f.RomanNumeral != 0) - g.DrawString(f.RomanNumeral.Value.ToRomanNumeral(), font, brush, new Point(32, 32), sf); - return thumb; - } - - /// - /// Gets the icon image for a component. - /// - public static Image GetIcon(ComponentTemplate c) - { - var portrait = GetPortrait(c); - if (portrait == null) - return null; - var thumb = portrait.GetThumbnailImage(32, 32, () => false, IntPtr.Zero); - var g = Graphics.FromImage(thumb); - var font = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Regular); - var brush = Brushes.White; - var sf = new StringFormat(); - sf.Alignment = StringAlignment.Far; - sf.LineAlignment = StringAlignment.Far; - if (c.RomanNumeral != 0) - g.DrawString(c.RomanNumeral.Value.ToRomanNumeral(), font, brush, new Point(32, 32), sf); - return thumb; - } - - /// - /// Gets the icon image for a mount. - /// - public static Image GetIcon(Mount m) - { - var portrait = GetPortrait(m); - if (portrait == null) - return null; - return portrait.GetThumbnailImage(32, 32, () => false, IntPtr.Zero); - } - - public static Image GetIcon(IHull hull, string shipsetPath) - { - // allow for practically infinite variation in hull sizes within a confined range of image sizes using a log function - var maxSize = (double)Mod.Current.Hulls.Max(h => h.Size); - var ratio = maxSize / hull.Size; - var scale = 1d / (1d + Math.Log10(ratio)); - - if (shipsetPath == null) - return GetGenericImage(hull.GetType()).Frame(scale); - if (!hull.PictureNames.Any()) - return GetGenericImage(hull.GetType()).Frame(scale); - var paths = new List(); - foreach (var s in hull.PictureNames) - { - if (Mod.Current.RootPath != null) - { - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Mini_" + s)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Mini_" + s)); // for SE4 shipset compatibility - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, s)); - } - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Mini_" + s)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Mini_" + s)); // for SE4 shipset compatibility - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, s)); - } - return (GetCachedImage(paths) ?? GetGenericImage(hull.GetType(), scale)); - } - - /// - /// Gets the icon image for a fleet. - /// - /// - /// - /// - public static Image GetIcon(Fleet fleet, string shipsetPath, int size = 32) - { - if (shipsetPath == null) - return GetGenericImage(fleet.GetType()); - var paths = new List(); - - string imageName = "Fleet"; - if (fleet.LeafVehicles.All(v => v is Fighter)) - imageName = "FighterGroup"; - else if (fleet.LeafVehicles.All(v => v is Satellite)) - imageName = "SatelliteGroup"; - else if (fleet.LeafVehicles.All(v => v is Drone)) - imageName = "DroneGroup"; - else if (fleet.LeafVehicles.All(v => v is Mine)) - imageName = "MineGroup"; - - if (Mod.Current.RootPath != null) - { - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Mini_" + imageName)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Mini_" + imageName)); // for SE4 shipset compatibility - } - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Mini_" + imageName)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Mini_" + imageName)); // for SE4 shipset compatibility - - return (GetCachedImage(paths) ?? GetGenericImage(fleet.GetType())).Resize(size); - } - - /// - /// Gets the icon image for a resource. - /// - /// - /// - public static Image GetIcon(Resource res) - { - if (Mod.Current.RootPath != null) - { - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "UI", "Resources", res.PictureName)) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "UI", "Resources", res.PictureName)) ?? - GetSolidColorImage(res.Color, 20); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "UI", "Resources", res.PictureName)) ?? - GetSolidColorImage(res.Color, 20); - } - } - - /// - /// Gets the population icon image for a race. - /// - /// - /// - public static Image GetIcon(this Race race) - { - if (race is null) - return null; - if (race.PopulationIconName == null) - return GetGenericImage(typeof(Race)); - - if (Mod.Current.RootPath != null) - { - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", race.PopulationIconName, "Pop_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Pop_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, "Pop_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Pop_Portrait")) ?? - // fall back on portrait if icon not found - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", race.PopulationIconName, "Race_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Race_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, "Race_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Race_Portrait")) ?? - GetGenericImage(race.GetType()); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, "Pop_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Pop_Portrait")) ?? - // fall back on portrait if icon not found - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, "Race_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Race_Portrait")) ?? - GetGenericImage(race.GetType()); - } - } - - /// - /// Gets the insignia icon for an empire. - /// - /// - /// - public static Image GetIcon(Empire emp) - { - if (Mod.Current.RootPath != null) - { - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.InsigniaName, "Insignia")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Insignia")) ?? - Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, "Insignia")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Insignia")) ?? - Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? - GetSolidColorImage(emp.Color); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, "Insignia")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Insignia")) ?? - Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? - GetSolidColorImage(emp.Color); - } - } - - /// - /// Gets the insignia icon for an empire template. - /// - /// - /// - public static Image GetIcon(EmpireTemplate emp) - { - var insigniaName = emp.InsigniaName; - if (insigniaName == null) - GetSolidColorImage(emp.Color); - if (Mod.Current.RootPath != null) - { - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", insigniaName, "Insignia")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", insigniaName, insigniaName + "_Insignia")) ?? - Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", insigniaName, insigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, "Insignia")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, insigniaName + "_Insignia")) ?? - Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, insigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? - GetSolidColorImage(emp.Color); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, "Insignia")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, insigniaName + "_Insignia")) ?? - Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, insigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? - GetSolidColorImage(emp.Color); - } - } - - public static Image GetModImage(string path) - { - if (Mod.Current.RootPath == null) - return GetCachedImage(path); - return GetCachedImage(new string[] - { - Path.Combine("Mods", Mod.Current.RootPath, path), - path - }); - } - - public static Image GetModImage(params string[] paths) - { - if (Mod.Current.RootPath == null) - return GetCachedImage(paths); - var allpaths = new List(); - foreach (var p in paths) - { - allpaths.Add(Path.Combine("Mods", Mod.Current.RootPath, p)); - allpaths.Add(p); - } - return GetCachedImage(allpaths); - } - - /// - /// Gets the portrait image for a stellar object. - /// - /// - /// - public static Image GetPortrait(StellarObject sobj) - { - if (!objectPortraits.ContainsKey(sobj)) - { - Image portrait; - double scale = 1d; - if (sobj.StellarSize == StellarSize.Huge) - scale = 1d; - else if (sobj.StellarSize == StellarSize.Large) - scale = 0.875d; - else if (sobj.StellarSize == StellarSize.Medium) - scale = 0.75d; - else if (sobj.StellarSize == StellarSize.Small) - scale = 0.625d; - else if (sobj.StellarSize == StellarSize.Tiny) - scale = 0.5d; - - if (sobj.PictureName == null) - return GetGenericImage(sobj.GetType(), scale); - - if (Mod.Current.RootPath != null) - { - portrait = - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Planets", sobj.PictureName), scale) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Planets", sobj.PictureName), scale) ?? - GetFallbackImage(sobj, scale) ?? - GetGenericImage(sobj.GetType(), scale); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - portrait = - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Planets", sobj.PictureName), scale) ?? - GetFallbackImage(sobj, scale) ?? - GetGenericImage(sobj.GetType(), scale); - } - - // clone the image so we don't mess up the original cached version - portrait = (Image)portrait.Clone(); - - objectPortraits.Add(sobj, portrait); - } - - return objectPortraits[sobj]; - } - - public static Image GetFallbackImage(StellarObject sobj, double scale = 1.0) - { - var path = Path.Combine("Pictures", "Planets"); - if (sobj is Planet p) - { - // deal with spaces in Gas Giant and Carbon Dioxide - var surface = p.Surface; - if (surface.Contains(" ")) - surface = surface.Substring(0, surface.IndexOf(' ')); - return (GetModImage(Path.Combine(path, $"Planet_{surface}_{p.Atmosphere.Replace(" ", "")}")) ?? GetModImage(Path.Combine(path, "Planet"))).Frame(scale); - } - else if (sobj is Star star) - { - return (GetModImage(Path.Combine(path, $"Star_{star.Color}")) ?? GetModImage(Path.Combine(path, "Star"))).Frame(scale); - } - else if (sobj is WarpPoint wp) - { - return GetModImage(Path.Combine(path, "WarpPoint")).Frame(scale); - } - else if (sobj is Storm storm) - { - return GetModImage(Path.Combine(path, "Storm")).Frame(scale); - } - else if (sobj is AsteroidField af) - { - return GetModImage(Path.Combine(path, "AsteroidField")).Frame(scale); - } - return null; - } - - /// - /// Gets the portrait image for a facility. - /// - /// - /// - public static Image GetPortrait(FacilityTemplate f) - { - if (f.PictureName == null) - return GetGenericImage(f.GetType()); - if (Mod.Current.RootPath != null) - { - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Facilities", f.PictureName)) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Facilities", f.PictureName)) ?? - GetGenericImage(f.GetType()); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Facilities", f.PictureName)) ?? - GetGenericImage(f.GetType()); - } - } - - /// - /// Gets the portrait image for a component. - /// - public static Image GetPortrait(ComponentTemplate c) - { - if (c.PictureName == null) - return GetGenericImage(c.GetType()); - if (Mod.Current.RootPath != null) - { - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Components", c.PictureName)) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Components", c.PictureName)) ?? - GetGenericImage(c.GetType()); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Components", c.PictureName)) ?? - GetGenericImage(c.GetType()); - } - } - - /// - /// Gets the portrait image for a mount. - /// - public static Image GetPortrait(Mount m) - { - if (m.PictureName == null) - return GetGenericImage(m.GetType()); - if (Mod.Current.RootPath != null) - { - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Mounts", m.PictureName)) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Mounts", m.PictureName)) ?? - GetGenericImage(m.GetType()); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Mounts", m.PictureName)) ?? - GetGenericImage(m.GetType()); - } - } - - public static Image GetPortrait(IHull hull, string shipsetPath) - { - if (shipsetPath == null) - return GetGenericImage(hull.GetType()); - if (!hull.PictureNames.Any()) - return GetGenericImage(hull.GetType()); - var paths = new List(); - - // allow for practically infinite variation in hull sizes within a confined range of image sizes using a log function - var maxSize = (double)Mod.Current.Hulls.Max(h => h.Size); - var ratio = maxSize / hull.Size; - var scale = 1d / (1d + Math.Log10(ratio)); - - foreach (var s in hull.PictureNames) - { - if (Mod.Current.RootPath != null) - { - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Portrait_" + s)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + s)); // for SE4 shipset compatibility - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, s)); - } - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Portrait_" + s)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + s)); // for SE4 shipset compatibility - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, s)); - } - return GetCachedImage(paths) ?? GetGenericImage(hull.GetType(), scale); - } - - /// - /// Gets the portrait image for a fleet. - /// - /// - /// - /// - public static Image GetPortrait(Fleet fleet, string shipsetPath) - { - if (shipsetPath == null) - return GetGenericImage(fleet.GetType()); - var paths = new List(); - - string imageName = "Fleet"; - if (fleet.LeafVehicles.All(v => v is Fighter)) - imageName = "FighterGroup"; - else if (fleet.LeafVehicles.All(v => v is Satellite)) - imageName = "SatelliteGroup"; - else if (fleet.LeafVehicles.All(v => v is Drone)) - imageName = "DroneGroup"; - else if (fleet.LeafVehicles.All(v => v is Mine)) - imageName = "MineGroup"; - - if (Mod.Current.RootPath != null) - { - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Portrait_" + imageName)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + imageName)); // for SE4 shipset compatibility - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, imageName)); - } - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Portrait_" + imageName)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + imageName)); // for SE4 shipset compatibility - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, imageName)); - - return GetCachedImage(paths) ?? GetGenericImage(fleet.GetType()); - } - - /// - /// Gets the population portrait image for a race. - /// - /// - /// - public static Image GetPortrait(Race race) - { - return GetIcon(race); - } - - /// - /// Gets the leader portrait for an empire. - /// - /// - /// - public static Image GetPortrait(Empire emp) - { - if (Mod.Current.RootPath != null) - { - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.LeaderPortraitName, "Race_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Race_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, "Race_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Race_Portrait")) ?? - // fall back on icon if portrait not found - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.LeaderPortraitName, "Pop_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Pop_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, "Pop_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Pop_Portrait")) ?? - GetGenericImage(emp.GetType()); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, "Race_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Race_Portrait")) ?? - // fall back on icon if portrait not found - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, "Pop_Portrait")) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Pop_Portrait")) ?? - GetGenericImage(emp.GetType()); - } - } - - public static Image GetSolidColorImage(Color color, int size = 32) - { - var img = new Bitmap(size, size); - var g = Graphics.FromImage(img); - g.Clear(color); - return img; - } - - /// - /// Gets a generic vehicle type image for a shipset. - /// - /// - /// - public static Image GetVehicleTypeImage(string shipsetPath, VehicleTypes vt = VehicleTypes.Fighter) - { - if (shipsetPath == null) - return GetGenericImage(typeof(IUnit)); - var paths = new List(); - - string hullname; - Type hulltype; - switch (vt) - { - case VehicleTypes.Base: - hullname = "BattleStation"; - hulltype = typeof(Base); - break; - - case VehicleTypes.Drone: - hullname = "Drone"; - hulltype = typeof(Drone); - break; - - case VehicleTypes.Fighter: - hullname = "FighterMedium"; - hulltype = typeof(Fighter); - break; - - case VehicleTypes.Mine: - hullname = "Mine"; - hulltype = typeof(Mine); - break; - - case VehicleTypes.Satellite: - hullname = "Satellite"; - hulltype = typeof(Satellite); - break; - - case VehicleTypes.Ship: - hullname = "Cruiser"; - hulltype = typeof(Ship); - break; - - case VehicleTypes.Troop: - hullname = "TroopMedium"; - hulltype = typeof(Troop); - break; - - case VehicleTypes.WeaponPlatform: - hullname = "WeapPlatformMedium"; - hulltype = typeof(WeaponPlatform); - break; - - default: - hullname = "Fighter"; - hulltype = typeof(Fighter); - break; - } - - if (Mod.Current.RootPath != null) - { - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Portrait_" + hullname)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + hullname)); // for SE4 shipset compatibility - } - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Portrait_" + hullname)); - paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + hullname)); // for SE4 shipset compatibility - - return GetCachedImage(paths) ?? GetGenericImage(hulltype); - } - - /// - /// Lists available empire insignia. - /// - /// - public static IEnumerable ListInsignia() - { - var list = new List(); - if (Mod.Current.RootPath != null) - { - if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) - return list; - foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) - { - var name = Path.GetFileNameWithoutExtension(d); - if (File.Exists(Path.Combine(d, "Insignia.png")) || - File.Exists(Path.Combine(d, "Insignia.bmp")) || - File.Exists(Path.Combine(d, name + "_Insignia.png")) || - File.Exists(Path.Combine(d, name + "_Insignia.bmp")) || - File.Exists(Path.Combine(d, name + "_Main.bmp"))) - list.Add(name); - } - } - if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) - return list.Distinct(); - foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) - { - var name = Path.GetFileNameWithoutExtension(d); - if (File.Exists(Path.Combine(d, "Insignia.png")) || - File.Exists(Path.Combine(d, "Insignia.bmp")) || - File.Exists(Path.Combine(d, name + "_Insignia.png")) || - File.Exists(Path.Combine(d, name + "_Main.bmp"))) - list.Add(name); - } - return list.OrderBy(q => q).Distinct(); - } - - /// - /// Lists available leader portraits. - /// - /// - public static IEnumerable ListLeaderPortraits() - { - var list = new List(); - if (Mod.Current.RootPath != null) - { - if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) - return list; - foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) - { - var name = Path.GetFileNameWithoutExtension(d); - if (File.Exists(Path.Combine(d, "Race_Portrait.png")) || - File.Exists(Path.Combine(d, "Race_Portrait.bmp")) || - File.Exists(Path.Combine(d, "Pop_Portrait.png")) || - File.Exists(Path.Combine(d, "Pop_Portrait.bmp")) || - File.Exists(Path.Combine(d, name + "_Race_Portrait.png")) || - File.Exists(Path.Combine(d, name + "_Race_Portrait.bmp")) || - File.Exists(Path.Combine(d, name + "_Pop_Portrait.png")) || - File.Exists(Path.Combine(d, name + "_Pop_Portrait.bmp"))) - list.Add(name); - } - } - if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) - return list.Distinct(); - foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) - { - var name = Path.GetFileNameWithoutExtension(d); - if (File.Exists(Path.Combine(d, "Race_Portrait.png")) || - File.Exists(Path.Combine(d, "Race_Portrait.bmp")) || - File.Exists(Path.Combine(d, "Pop_Portrait.png")) || - File.Exists(Path.Combine(d, "Pop_Portrait.bmp")) || - File.Exists(Path.Combine(d, name + "_Race_Portrait.png")) || - File.Exists(Path.Combine(d, name + "_Race_Portrait.bmp")) || - File.Exists(Path.Combine(d, name + "_Pop_Portrait.png")) || - File.Exists(Path.Combine(d, name + "_Pop_Portrait.bmp"))) - list.Add(name); - } - return list.OrderBy(q => q).Distinct(); - } - - /// - /// Lists available population icons. - /// - /// - public static IEnumerable ListPopulationIcons() - { - // they use the same sources - return ListLeaderPortraits(); - } - - /// - /// Lists available shipsets. - /// - /// - public static IEnumerable ListShipsets() - { - var list = new List(); - if (Mod.Current.RootPath != null) - { - if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) - return list; - foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) - list.Add(Path.GetFileNameWithoutExtension(d)); - } - if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) - return list.Distinct(); - foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) - list.Add(Path.GetFileNameWithoutExtension(d)); - return list.OrderBy(q => q).Distinct(); - } - - /// - /// Crops the specified image. - /// - /// The image. - /// The crop area. - /// The cropped image. - private static Image Crop(Image img, Rectangle cropArea) - { - if (img == null) - return null; - Bitmap bmpImage = new Bitmap(img); - Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); - return (bmpCrop); - } - - /*public static Image GetIcon(Seeker seeker) - { - if (Mod.Current.RootPath != null) - { - var fx = (SeekerWeaponDisplayEffect)seeker.WeaponInfo.DisplayEffect; - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", seeker.Owner.ShipsetPath, fx.Name)) ?? - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", seeker.Owner.ShipsetPath)) ?? - GetGenericImage(seeker.GetType()); - } - else - { - // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine - var fx = (SeekerWeaponDisplayEffect)seeker.WeaponInfo.DisplayEffect; - return - GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", seeker.Owner.ShipsetPath, fx.Name)) ?? - GetGenericImage(seeker.GetType()); - } - }*/ +using FrEee.Objects.Civilization; +using FrEee.Objects.Space; +using FrEee.Objects.Technology; +using FrEee.Objects.Vehicles; +using FrEee.Modding; +using FrEee.Modding.Templates; +using FrEee.Extensions; +using Svg; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; +using FrEee.Extensions; +using FrEee.Processes.Combat; +using FrEee.Processes.Setup; + +namespace FrEee.Utility; + +/// +/// Utility methods for handling pictures. +/// +public static class Pictures +{ + static Pictures() + { + // Set up the generic images + Image img; + Graphics g; + + // TODO - moddable generic pics + + // star + img = new Bitmap(128, 128); + g = Graphics.FromImage(img); + g.FillEllipse(new SolidBrush(Color.Yellow), 10, 10, 108, 108); + g.DrawEllipse(new Pen(Color.White, 3), 10, 10, 108, 108); + genericPictures.Add(typeof(Star), img); + + // planet + img = new Bitmap(128, 128); + g = Graphics.FromImage(img); + g.FillEllipse(new SolidBrush(Color.Blue), 10, 10, 108, 108); + g.DrawEllipse(new Pen(Color.White, 3), 10, 10, 108, 108); + genericPictures.Add(typeof(Planet), img); + + // asteroid field + img = new Bitmap(128, 128); + g = Graphics.FromImage(img); + g.FillEllipse(new SolidBrush(Color.Gray), 10, 10, 25, 25); + g.FillEllipse(new SolidBrush(Color.Gray), 45, 15, 25, 25); + g.FillEllipse(new SolidBrush(Color.Gray), 75, 90, 25, 25); + g.FillEllipse(new SolidBrush(Color.Gray), 30, 70, 25, 25); + g.FillEllipse(new SolidBrush(Color.Gray), 15, 60, 25, 25); + genericPictures.Add(typeof(AsteroidField), img); + + // storm + img = new Bitmap(128, 128); + g = Graphics.FromImage(img); + g.Clear(Color.Purple); + genericPictures.Add(typeof(Storm), img); + + // warp point + img = new Bitmap(128, 128); + g = Graphics.FromImage(img); + g.DrawEllipse(new Pen(Color.Blue, 3), 10, 10, 108, 108); + g.DrawEllipse(new Pen(Color.Blue, 3), 20, 20, 88, 88); + g.DrawEllipse(new Pen(Color.Blue, 3), 30, 20, 68, 68); + genericPictures.Add(typeof(WarpPoint), img); + + // facility + img = new Bitmap(128, 128); + g = Graphics.FromImage(img); + g.FillRectangle(new SolidBrush(Color.Silver), 10, 10, 108, 108); + genericPictures.Add(typeof(FacilityTemplate), img); + + // component + img = new Bitmap(128, 128); + g = Graphics.FromImage(img); + g.FillEllipse(new SolidBrush(Color.Silver), 10, 10, 108, 108); + genericPictures.Add(typeof(ComponentTemplate), img); + + // hull/design/vehicle + img = new Bitmap(128, 128); + g = Graphics.FromImage(img); + var top = new Point(64, 0); + var bottomLeft = new Point(0, 128); + var bottomRight = new Point(128, 128); + var pts = new Point[] { top, bottomLeft, bottomRight }; + g.FillPolygon(Brushes.Gray, pts); + genericPictures.Add(typeof(IHull), img); + genericPictures.Add(typeof(IDesign), img); + genericPictures.Add(typeof(IVehicle), img); + genericPictures.Add(typeof(Seeker), img); + + // fleet + img = new Bitmap(128, 128); + g = Graphics.FromImage(img); + top = new Point(64, 0); + bottomLeft = new Point(32, 64); + bottomRight = new Point(96, 64); + pts = new Point[] { top, bottomLeft, bottomRight }; + g.FillPolygon(Brushes.Gray, pts); + top = new Point(32, 128); + bottomLeft = new Point(0, 192); + bottomRight = new Point(64, 192); + pts = new Point[] { top, bottomLeft, bottomRight }; + g.FillPolygon(Brushes.Gray, pts); + top = new Point(96, 128); + bottomLeft = new Point(64, 192); + bottomRight = new Point(128, 192); + pts = new Point[] { top, bottomLeft, bottomRight }; + g.FillPolygon(Brushes.Gray, pts); + genericPictures.Add(typeof(Fleet), img); + + // TODO - mount, race, empire, seeker generic pics + } + + /// + /// Picture cache for raw images on disk. + /// + private static IDictionary fileCache = new Dictionary(); + + /// + /// Generic pictures to use for space objects with missing pictures. + /// + private static IDictionary genericPictures = new Dictionary(); + + /// + /// Picture cache for objects. + /// + private static IDictionary objectPortraits = new Dictionary(); + + /// + /// Crops an image to a specific size at a specific position. + /// + /// The source image. + /// The upper left corner of the crop rectangle. + /// The size of the crop rectangle. + /// The cropped image. + public static Image Crop(this Image src, Point upperLeft, Size size) + { + // http://stackoverflow.com/questions/734930/how-to-crop-an-image-using-c + var rect = new Rectangle(upperLeft, size); + var bmp = new Bitmap(size.Width, size.Height); + var g = Graphics.FromImage(bmp); + g.DrawImage(src, new Rectangle(0, 0, size.Width, size.Height), rect, GraphicsUnit.Pixel); + return bmp; + } + + /// + /// Crops an image to a size relative to the source image's size with (1,1) being the full size of the image. + /// + /// + /// + /// + /// + public static Image CropRelative(this Image src, PointF upperLeft, SizeF size) + { + var ul = new Point((int)(upperLeft.X * src.Width), (int)(upperLeft.Y * src.Height)); + var sz = new Size((int)(size.Width * src.Width), (int)(size.Height * src.Height)); + return src.Crop(ul, sz); + } + + /// + /// Draws a red X across an image. + /// + /// + /// + public static Image CrossOut(Image img) + { + var img2 = (Image)img.Clone(); + var thickness = (img2.Width + img2.Height) / 16f; + var g = Graphics.FromImage(img2); + var pen = new Pen(Color.Red, thickness); + g.DrawLine(pen, 0, 0, img2.Width, img2.Height); + g.DrawLine(pen, 0, img2.Height, img2.Width, 0); + return img2; + } + + /// + /// Scales an image and frames it in blank space. + /// The image should be square. + /// + /// The source image. + /// The scale factor. + /// + public static Image Frame(this Image src, double scale) + { + if (src == null) + return null; + if (scale == 1d) + return (Image)src.Clone(); + var scaled = src.Resize((int)Math.Ceiling(Math.Max(src.Width, src.Height) * scale)); + var result = new Bitmap(src.Width, src.Height); + var g = Graphics.FromImage(result); + g.DrawImage(scaled, (result.Width - scaled.Width) / 2, (result.Height - scaled.Height) / 2); + return result; + } + + public static Image GetCachedImage(IEnumerable paths, double scale = 1d) + { + foreach (var path in paths) + { + var img = GetCachedImage(path, scale); + if (img != null) + return img; + } + return null; + } + + public static Image GetCachedImage(string path, double scale = 1d) + { + if (string.IsNullOrEmpty(Path.GetExtension(path))) + { + // check SVG, then PNG, then BMP, if no extension specified + // don't scale BMP files (unless they're specifically requested as BMP with a scale factor) + return GetCachedImage(path + ".svg", scale) ?? GetCachedImage(path + ".png", scale) ?? GetCachedImage(path + ".bmp"); + } + + if (!fileCache.ContainsKey(path)) + { + // make sure relative paths are relative to the executable, not some random working directory we might have started in (e.g. AutoPBW) + if (path != Path.GetFullPath(path)) + path = Path.Combine(Path.GetFullPath(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)), path); + + if (File.Exists(path)) + { + try + { + if (path.ToLower().EndsWith(".svg")) + { + var svg = SvgDocument.Open(path); + fileCache[path] = svg.Draw(512, 512); + } + else + { + var bmp = new Bitmap(path); + if (Path.GetExtension(path).ToLower() == ".bmp") + bmp.MakeTransparent(Color.Black); + fileCache[path] = bmp; + } + } + catch (Exception ex) + { + Console.Error.WriteLine("Could not load " + Path.GetFullPath(path) + ": " + ex.Message); + fileCache[path] = null; + } + } + else + { + Console.Error.WriteLine("Could not find " + Path.GetFullPath(path) + "."); + fileCache[path] = null; + } + } + return fileCache[path].Frame(scale); + } + + public static Image GetGenericImage(double scale = 1.0) + { + return GetGenericImage(typeof(T), scale); + } + + /// + /// Gets a generic image for a type of object. + /// + /// The type of object. + /// The scale factor. If less than 1, the image will be shrunk and "framed" with blank space. + /// + public static Image GetGenericImage(Type type, double scale = 1d) + { + if (genericPictures.ContainsKey(type)) + return genericPictures[type].Frame(scale); + else + { + // check base type and interfaces + if (type.BaseType != null && genericPictures.ContainsKey(type.BaseType)) + return genericPictures[type.BaseType].Frame(scale); + + foreach (var i in type.GetInterfaces()) + { + if (genericPictures.ContainsKey(i)) + return genericPictures[i].Frame(scale); + } + + // yay recursion + Image img = null; + if (type.BaseType != null) + img = GetGenericImage(type.BaseType, scale); + if (img != null) + return img; + foreach (var i in type.GetInterfaces()) + { + img = GetGenericImage(i, scale); + if (img != null) + return img; + } + } + return GetSolidColorImage(Color.Transparent); + } + + /// + /// Gets the icon image for a stellar object. + /// + /// + /// + public static Image GetIcon(StellarObject sobj) + { + var portrait = GetPortrait(sobj); + if (portrait == null) + return null; + var img = portrait.GetThumbnailImage(32, 32, () => false, IntPtr.Zero); + + if (sobj is Planet) + { + var p = (Planet)sobj; + if (p.Colony == null) + p.DrawStatusIcons(img); + else + p.DrawPopulationBars(img); + } + + return img; + } + + /// + /// Gets the icon image for a facility. + /// + /// + /// + public static Image GetIcon(FacilityTemplate f) + { + var portrait = GetPortrait(f); + if (portrait == null) + return null; + var thumb = portrait.GetThumbnailImage(32, 32, () => false, IntPtr.Zero); + var g = Graphics.FromImage(thumb); + var font = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Regular); + var brush = Brushes.White; + var sf = new StringFormat(); + sf.Alignment = StringAlignment.Far; + sf.LineAlignment = StringAlignment.Far; + if (f.RomanNumeral != null && f.RomanNumeral != 0) + g.DrawString(f.RomanNumeral.Value.ToRomanNumeral(), font, brush, new Point(32, 32), sf); + return thumb; + } + + /// + /// Gets the icon image for a component. + /// + public static Image GetIcon(ComponentTemplate c) + { + var portrait = GetPortrait(c); + if (portrait == null) + return null; + var thumb = portrait.GetThumbnailImage(32, 32, () => false, IntPtr.Zero); + var g = Graphics.FromImage(thumb); + var font = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Regular); + var brush = Brushes.White; + var sf = new StringFormat(); + sf.Alignment = StringAlignment.Far; + sf.LineAlignment = StringAlignment.Far; + if (c.RomanNumeral != 0) + g.DrawString(c.RomanNumeral.Value.ToRomanNumeral(), font, brush, new Point(32, 32), sf); + return thumb; + } + + /// + /// Gets the icon image for a mount. + /// + public static Image GetIcon(Mount m) + { + var portrait = GetPortrait(m); + if (portrait == null) + return null; + return portrait.GetThumbnailImage(32, 32, () => false, IntPtr.Zero); + } + + public static Image GetIcon(IHull hull, string shipsetPath) + { + // allow for practically infinite variation in hull sizes within a confined range of image sizes using a log function + var maxSize = (double)Mod.Current.Hulls.Max(h => h.Size); + var ratio = maxSize / hull.Size; + var scale = 1d / (1d + Math.Log10(ratio)); + + if (shipsetPath == null) + return GetGenericImage(hull.GetType()).Frame(scale); + if (!hull.PictureNames.Any()) + return GetGenericImage(hull.GetType()).Frame(scale); + var paths = new List(); + foreach (var s in hull.PictureNames) + { + if (Mod.Current.RootPath != null) + { + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Mini_" + s)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Mini_" + s)); // for SE4 shipset compatibility + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, s)); + } + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Mini_" + s)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Mini_" + s)); // for SE4 shipset compatibility + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, s)); + } + return (GetCachedImage(paths) ?? GetGenericImage(hull.GetType(), scale)); + } + + /// + /// Gets the icon image for a fleet. + /// + /// + /// + /// + public static Image GetIcon(Fleet fleet, string shipsetPath, int size = 32) + { + if (shipsetPath == null) + return GetGenericImage(fleet.GetType()); + var paths = new List(); + + string imageName = "Fleet"; + if (fleet.LeafVehicles.All(v => v is Fighter)) + imageName = "FighterGroup"; + else if (fleet.LeafVehicles.All(v => v is Satellite)) + imageName = "SatelliteGroup"; + else if (fleet.LeafVehicles.All(v => v is Drone)) + imageName = "DroneGroup"; + else if (fleet.LeafVehicles.All(v => v is Mine)) + imageName = "MineGroup"; + + if (Mod.Current.RootPath != null) + { + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Mini_" + imageName)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Mini_" + imageName)); // for SE4 shipset compatibility + } + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Mini_" + imageName)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Mini_" + imageName)); // for SE4 shipset compatibility + + return (GetCachedImage(paths) ?? GetGenericImage(fleet.GetType())).Resize(size); + } + + /// + /// Gets the icon image for a resource. + /// + /// + /// + public static Image GetIcon(Resource res) + { + if (Mod.Current.RootPath != null) + { + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "UI", "Resources", res.PictureName)) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "UI", "Resources", res.PictureName)) ?? + GetSolidColorImage(res.Color, 20); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "UI", "Resources", res.PictureName)) ?? + GetSolidColorImage(res.Color, 20); + } + } + + /// + /// Gets the population icon image for a race. + /// + /// + /// + public static Image GetIcon(this Race race) + { + if (race is null) + return null; + if (race.PopulationIconName == null) + return GetGenericImage(typeof(Race)); + + if (Mod.Current.RootPath != null) + { + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", race.PopulationIconName, "Pop_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Pop_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, "Pop_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Pop_Portrait")) ?? + // fall back on portrait if icon not found + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", race.PopulationIconName, "Race_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Race_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, "Race_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Race_Portrait")) ?? + GetGenericImage(race.GetType()); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, "Pop_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Pop_Portrait")) ?? + // fall back on portrait if icon not found + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, "Race_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", race.PopulationIconName, race.PopulationIconName + "_Race_Portrait")) ?? + GetGenericImage(race.GetType()); + } + } + + /// + /// Gets the insignia icon for an empire. + /// + /// + /// + public static Image GetIcon(Empire emp) + { + if (Mod.Current.RootPath != null) + { + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.InsigniaName, "Insignia")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Insignia")) ?? + Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, "Insignia")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Insignia")) ?? + Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? + GetSolidColorImage(emp.Color); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, "Insignia")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Insignia")) ?? + Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.InsigniaName, emp.InsigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? + GetSolidColorImage(emp.Color); + } + } + + /// + /// Gets the insignia icon for an empire template. + /// + /// + /// + public static Image GetIcon(EmpireTemplate emp) + { + var insigniaName = emp.InsigniaName; + if (insigniaName == null) + GetSolidColorImage(emp.Color); + if (Mod.Current.RootPath != null) + { + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", insigniaName, "Insignia")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", insigniaName, insigniaName + "_Insignia")) ?? + Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", insigniaName, insigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, "Insignia")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, insigniaName + "_Insignia")) ?? + Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, insigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? + GetSolidColorImage(emp.Color); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, "Insignia")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, insigniaName + "_Insignia")) ?? + Crop(GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", insigniaName, insigniaName + "_Main")), new Rectangle(0, 0, 26, 18)) ?? + GetSolidColorImage(emp.Color); + } + } + + public static Image GetModImage(string path) + { + if (Mod.Current.RootPath == null) + return GetCachedImage(path); + return GetCachedImage(new string[] + { + Path.Combine("Mods", Mod.Current.RootPath, path), + path + }); + } + + public static Image GetModImage(params string[] paths) + { + if (Mod.Current.RootPath == null) + return GetCachedImage(paths); + var allpaths = new List(); + foreach (var p in paths) + { + allpaths.Add(Path.Combine("Mods", Mod.Current.RootPath, p)); + allpaths.Add(p); + } + return GetCachedImage(allpaths); + } + + /// + /// Gets the portrait image for a stellar object. + /// + /// + /// + public static Image GetPortrait(StellarObject sobj) + { + if (!objectPortraits.ContainsKey(sobj)) + { + Image portrait; + double scale = 1d; + if (sobj.StellarSize == StellarSize.Huge) + scale = 1d; + else if (sobj.StellarSize == StellarSize.Large) + scale = 0.875d; + else if (sobj.StellarSize == StellarSize.Medium) + scale = 0.75d; + else if (sobj.StellarSize == StellarSize.Small) + scale = 0.625d; + else if (sobj.StellarSize == StellarSize.Tiny) + scale = 0.5d; + + if (sobj.PictureName == null) + return GetGenericImage(sobj.GetType(), scale); + + if (Mod.Current.RootPath != null) + { + portrait = + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Planets", sobj.PictureName), scale) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Planets", sobj.PictureName), scale) ?? + GetFallbackImage(sobj, scale) ?? + GetGenericImage(sobj.GetType(), scale); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + portrait = + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Planets", sobj.PictureName), scale) ?? + GetFallbackImage(sobj, scale) ?? + GetGenericImage(sobj.GetType(), scale); + } + + // clone the image so we don't mess up the original cached version + portrait = (Image)portrait.Clone(); + + objectPortraits.Add(sobj, portrait); + } + + return objectPortraits[sobj]; + } + + public static Image GetFallbackImage(StellarObject sobj, double scale = 1.0) + { + var path = Path.Combine("Pictures", "Planets"); + if (sobj is Planet p) + { + // deal with spaces in Gas Giant and Carbon Dioxide + var surface = p.Surface; + if (surface.Contains(" ")) + surface = surface.Substring(0, surface.IndexOf(' ')); + return (GetModImage(Path.Combine(path, $"Planet_{surface}_{p.Atmosphere.Replace(" ", "")}")) ?? GetModImage(Path.Combine(path, "Planet"))).Frame(scale); + } + else if (sobj is Star star) + { + return (GetModImage(Path.Combine(path, $"Star_{star.Color}")) ?? GetModImage(Path.Combine(path, "Star"))).Frame(scale); + } + else if (sobj is WarpPoint wp) + { + return GetModImage(Path.Combine(path, "WarpPoint")).Frame(scale); + } + else if (sobj is Storm storm) + { + return GetModImage(Path.Combine(path, "Storm")).Frame(scale); + } + else if (sobj is AsteroidField af) + { + return GetModImage(Path.Combine(path, "AsteroidField")).Frame(scale); + } + return null; + } + + /// + /// Gets the portrait image for a facility. + /// + /// + /// + public static Image GetPortrait(FacilityTemplate f) + { + if (f.PictureName == null) + return GetGenericImage(f.GetType()); + if (Mod.Current.RootPath != null) + { + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Facilities", f.PictureName)) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Facilities", f.PictureName)) ?? + GetGenericImage(f.GetType()); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Facilities", f.PictureName)) ?? + GetGenericImage(f.GetType()); + } + } + + /// + /// Gets the portrait image for a component. + /// + public static Image GetPortrait(ComponentTemplate c) + { + if (c.PictureName == null) + return GetGenericImage(c.GetType()); + if (Mod.Current.RootPath != null) + { + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Components", c.PictureName)) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Components", c.PictureName)) ?? + GetGenericImage(c.GetType()); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Components", c.PictureName)) ?? + GetGenericImage(c.GetType()); + } + } + + /// + /// Gets the portrait image for a mount. + /// + public static Image GetPortrait(Mount m) + { + if (m.PictureName == null) + return GetGenericImage(m.GetType()); + if (Mod.Current.RootPath != null) + { + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Mounts", m.PictureName)) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Mounts", m.PictureName)) ?? + GetGenericImage(m.GetType()); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Mounts", m.PictureName)) ?? + GetGenericImage(m.GetType()); + } + } + + public static Image GetPortrait(IHull hull, string shipsetPath) + { + if (shipsetPath == null) + return GetGenericImage(hull.GetType()); + if (!hull.PictureNames.Any()) + return GetGenericImage(hull.GetType()); + var paths = new List(); + + // allow for practically infinite variation in hull sizes within a confined range of image sizes using a log function + var maxSize = (double)Mod.Current.Hulls.Max(h => h.Size); + var ratio = maxSize / hull.Size; + var scale = 1d / (1d + Math.Log10(ratio)); + + foreach (var s in hull.PictureNames) + { + if (Mod.Current.RootPath != null) + { + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Portrait_" + s)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + s)); // for SE4 shipset compatibility + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, s)); + } + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Portrait_" + s)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + s)); // for SE4 shipset compatibility + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, s)); + } + return GetCachedImage(paths) ?? GetGenericImage(hull.GetType(), scale); + } + + /// + /// Gets the portrait image for a fleet. + /// + /// + /// + /// + public static Image GetPortrait(Fleet fleet, string shipsetPath) + { + if (shipsetPath == null) + return GetGenericImage(fleet.GetType()); + var paths = new List(); + + string imageName = "Fleet"; + if (fleet.LeafVehicles.All(v => v is Fighter)) + imageName = "FighterGroup"; + else if (fleet.LeafVehicles.All(v => v is Satellite)) + imageName = "SatelliteGroup"; + else if (fleet.LeafVehicles.All(v => v is Drone)) + imageName = "DroneGroup"; + else if (fleet.LeafVehicles.All(v => v is Mine)) + imageName = "MineGroup"; + + if (Mod.Current.RootPath != null) + { + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Portrait_" + imageName)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + imageName)); // for SE4 shipset compatibility + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, imageName)); + } + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Portrait_" + imageName)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + imageName)); // for SE4 shipset compatibility + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, imageName)); + + return GetCachedImage(paths) ?? GetGenericImage(fleet.GetType()); + } + + /// + /// Gets the population portrait image for a race. + /// + /// + /// + public static Image GetPortrait(Race race) + { + return GetIcon(race); + } + + /// + /// Gets the leader portrait for an empire. + /// + /// + /// + public static Image GetPortrait(Empire emp) + { + if (Mod.Current.RootPath != null) + { + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.LeaderPortraitName, "Race_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Race_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, "Race_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Race_Portrait")) ?? + // fall back on icon if portrait not found + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.LeaderPortraitName, "Pop_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Pop_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, "Pop_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Pop_Portrait")) ?? + GetGenericImage(emp.GetType()); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, "Race_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Race_Portrait")) ?? + // fall back on icon if portrait not found + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, "Pop_Portrait")) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", emp.LeaderPortraitName, emp.LeaderPortraitName + "_Pop_Portrait")) ?? + GetGenericImage(emp.GetType()); + } + } + + public static Image GetSolidColorImage(Color color, int size = 32) + { + var img = new Bitmap(size, size); + var g = Graphics.FromImage(img); + g.Clear(color); + return img; + } + + /// + /// Gets a generic vehicle type image for a shipset. + /// + /// + /// + public static Image GetVehicleTypeImage(string shipsetPath, VehicleTypes vt = VehicleTypes.Fighter) + { + if (shipsetPath == null) + return GetGenericImage(typeof(IUnit)); + var paths = new List(); + + string hullname; + Type hulltype; + switch (vt) + { + case VehicleTypes.Base: + hullname = "BattleStation"; + hulltype = typeof(Base); + break; + + case VehicleTypes.Drone: + hullname = "Drone"; + hulltype = typeof(Drone); + break; + + case VehicleTypes.Fighter: + hullname = "FighterMedium"; + hulltype = typeof(Fighter); + break; + + case VehicleTypes.Mine: + hullname = "Mine"; + hulltype = typeof(Mine); + break; + + case VehicleTypes.Satellite: + hullname = "Satellite"; + hulltype = typeof(Satellite); + break; + + case VehicleTypes.Ship: + hullname = "Cruiser"; + hulltype = typeof(Ship); + break; + + case VehicleTypes.Troop: + hullname = "TroopMedium"; + hulltype = typeof(Troop); + break; + + case VehicleTypes.WeaponPlatform: + hullname = "WeapPlatformMedium"; + hulltype = typeof(WeaponPlatform); + break; + + default: + hullname = "Fighter"; + hulltype = typeof(Fighter); + break; + } + + if (Mod.Current.RootPath != null) + { + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Portrait_" + hullname)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + hullname)); // for SE4 shipset compatibility + } + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, "Portrait_" + hullname)); + paths.Add(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", shipsetPath, shipsetPath + "_Portrait_" + hullname)); // for SE4 shipset compatibility + + return GetCachedImage(paths) ?? GetGenericImage(hulltype); + } + + /// + /// Lists available empire insignia. + /// + /// + public static IEnumerable ListInsignia() + { + var list = new List(); + if (Mod.Current.RootPath != null) + { + if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) + return list; + foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) + { + var name = Path.GetFileNameWithoutExtension(d); + if (File.Exists(Path.Combine(d, "Insignia.png")) || + File.Exists(Path.Combine(d, "Insignia.bmp")) || + File.Exists(Path.Combine(d, name + "_Insignia.png")) || + File.Exists(Path.Combine(d, name + "_Insignia.bmp")) || + File.Exists(Path.Combine(d, name + "_Main.bmp"))) + list.Add(name); + } + } + if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) + return list.Distinct(); + foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) + { + var name = Path.GetFileNameWithoutExtension(d); + if (File.Exists(Path.Combine(d, "Insignia.png")) || + File.Exists(Path.Combine(d, "Insignia.bmp")) || + File.Exists(Path.Combine(d, name + "_Insignia.png")) || + File.Exists(Path.Combine(d, name + "_Main.bmp"))) + list.Add(name); + } + return list.OrderBy(q => q).Distinct(); + } + + /// + /// Lists available leader portraits. + /// + /// + public static IEnumerable ListLeaderPortraits() + { + var list = new List(); + if (Mod.Current.RootPath != null) + { + if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) + return list; + foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) + { + var name = Path.GetFileNameWithoutExtension(d); + if (File.Exists(Path.Combine(d, "Race_Portrait.png")) || + File.Exists(Path.Combine(d, "Race_Portrait.bmp")) || + File.Exists(Path.Combine(d, "Pop_Portrait.png")) || + File.Exists(Path.Combine(d, "Pop_Portrait.bmp")) || + File.Exists(Path.Combine(d, name + "_Race_Portrait.png")) || + File.Exists(Path.Combine(d, name + "_Race_Portrait.bmp")) || + File.Exists(Path.Combine(d, name + "_Pop_Portrait.png")) || + File.Exists(Path.Combine(d, name + "_Pop_Portrait.bmp"))) + list.Add(name); + } + } + if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) + return list.Distinct(); + foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) + { + var name = Path.GetFileNameWithoutExtension(d); + if (File.Exists(Path.Combine(d, "Race_Portrait.png")) || + File.Exists(Path.Combine(d, "Race_Portrait.bmp")) || + File.Exists(Path.Combine(d, "Pop_Portrait.png")) || + File.Exists(Path.Combine(d, "Pop_Portrait.bmp")) || + File.Exists(Path.Combine(d, name + "_Race_Portrait.png")) || + File.Exists(Path.Combine(d, name + "_Race_Portrait.bmp")) || + File.Exists(Path.Combine(d, name + "_Pop_Portrait.png")) || + File.Exists(Path.Combine(d, name + "_Pop_Portrait.bmp"))) + list.Add(name); + } + return list.OrderBy(q => q).Distinct(); + } + + /// + /// Lists available population icons. + /// + /// + public static IEnumerable ListPopulationIcons() + { + // they use the same sources + return ListLeaderPortraits(); + } + + /// + /// Lists available shipsets. + /// + /// + public static IEnumerable ListShipsets() + { + var list = new List(); + if (Mod.Current.RootPath != null) + { + if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) + return list; + foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races"))) + list.Add(Path.GetFileNameWithoutExtension(d)); + } + if (!Directory.Exists(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) + return list.Distinct(); + foreach (var d in Directory.GetDirectories(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races"))) + list.Add(Path.GetFileNameWithoutExtension(d)); + return list.OrderBy(q => q).Distinct(); + } + + /// + /// Crops the specified image. + /// + /// The image. + /// The crop area. + /// The cropped image. + private static Image Crop(Image img, Rectangle cropArea) + { + if (img == null) + return null; + Bitmap bmpImage = new Bitmap(img); + Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat); + return (bmpCrop); + } + + /*public static Image GetIcon(Seeker seeker) + { + if (Mod.Current.RootPath != null) + { + var fx = (SeekerWeaponDisplayEffect)seeker.WeaponInfo.DisplayEffect; + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Mods", Mod.Current.RootPath, "Pictures", "Races", seeker.Owner.ShipsetPath, fx.Name)) ?? + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", seeker.Owner.ShipsetPath)) ?? + GetGenericImage(seeker.GetType()); + } + else + { + // stock mod has no entry in Mods folder, and looking for a null path crashes Path.Combine + var fx = (SeekerWeaponDisplayEffect)seeker.WeaponInfo.DisplayEffect; + return + GetCachedImage(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "Pictures", "Races", seeker.Owner.ShipsetPath, fx.Name)) ?? + GetGenericImage(seeker.GetType()); + } + }*/ } \ No newline at end of file diff --git a/FrEee.Core/Utility/Progress.cs b/FrEee.Core/Utility/Progress.cs new file mode 100644 index 000000000..b3f5f2051 --- /dev/null +++ b/FrEee.Core/Utility/Progress.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FrEee.Extensions; +using FrEee.Serialization; +using FrEee.Utility; + +namespace FrEee.Utility +{ + /// + /// Progress towards completing something. + /// + /// + public class Progress : Progress + where TRef : IReference + { + public Progress(T item, long value, long maximum, long incrementalProgressBeforeDelay = 0, double? delay = 0, long extraIncrementalProgressAfterDelay = 0) + : base(value, maximum, incrementalProgressBeforeDelay, delay, extraIncrementalProgressAfterDelay) + { + Item = item; + } + + /// + /// The item being worked towards. + /// + public T Item { get { return item.Value; } set { item = value.Refer(); } } + + private TRef item { get; set; } + + public override string ToString() + { + return string.Format("{0}: {1}", Item, base.ToString()); + } + } +} diff --git a/FrEee/Serialization/ReferenceKeyedDictionary.cs b/FrEee.Core/Utility/ReferenceKeyedDictionary.cs similarity index 79% rename from FrEee/Serialization/ReferenceKeyedDictionary.cs rename to FrEee.Core/Utility/ReferenceKeyedDictionary.cs index 36ddd0ef1..71c6ed36f 100644 --- a/FrEee/Serialization/ReferenceKeyedDictionary.cs +++ b/FrEee.Core/Utility/ReferenceKeyedDictionary.cs @@ -5,45 +5,11 @@ using System.Linq; using FrEee.Utility; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.Serialization; -public class GalaxyReferenceKeyedDictionary : ReferenceKeyedDictionary, TKey, TValue> - where TKey : IReferrable -{ - private SafeDictionary dict = new SafeDictionary(); - - protected override long ExtractID(TKey key) - { - return key.ID; - } - - protected override TKey LookUp(long id) - { - if (!dict.ContainsKey(id)) - dict[id] = (TKey)Galaxy.Current.GetReferrable(id); - return dict[id]; - } -} - -public class ModReferenceKeyedDictionary : ReferenceKeyedDictionary, TKey, TValue> - where TKey : IModObject -{ - private SafeDictionary dict = new SafeDictionary(); - - protected override string ExtractID(TKey key) - { - return key.ModID; - } - - protected override TKey LookUp(string id) - { - if (!dict.ContainsKey(id)) - dict[id] = Mod.Current.Find(id); - return dict[id]; - } -} - /// /// A safe dictionary keyed with transparent references. /// diff --git a/FrEee/Serialization/ReferenceList.cs b/FrEee.Core/Utility/ReferenceList.cs similarity index 91% rename from FrEee/Serialization/ReferenceList.cs rename to FrEee.Core/Utility/ReferenceList.cs index a0d5244a4..8490fb6bc 100644 --- a/FrEee/Serialization/ReferenceList.cs +++ b/FrEee.Core/Utility/ReferenceList.cs @@ -3,19 +3,10 @@ using FrEee.Modding; using FrEee.Extensions; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.Serialization; -public class GalaxyReferenceList : ReferenceList, T> - where T : IReferrable -{ -} - -public class ModReferenceList : ReferenceList, T> - where T : IModObject -{ -} - public class ReferenceList : IList, IReferenceEnumerable, IPromotable where TRef : IReference { diff --git a/FrEee/Serialization/ReferenceSet.cs b/FrEee.Core/Utility/ReferenceSet.cs similarity index 88% rename from FrEee/Serialization/ReferenceSet.cs rename to FrEee.Core/Utility/ReferenceSet.cs index 69eafdc2e..4cd1cfe85 100644 --- a/FrEee/Serialization/ReferenceSet.cs +++ b/FrEee.Core/Utility/ReferenceSet.cs @@ -4,39 +4,10 @@ using System.Collections.Generic; using System.Linq; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.Serialization; -[Serializable] -public class GalaxyReferenceSet : ReferenceSet, T> - where T : IReferrable -{ - public GalaxyReferenceSet() - : base() - { - } - - public GalaxyReferenceSet(IEnumerable objs) - : base(objs) - { - } -} - -[Serializable] -public class ModReferenceSet : ReferenceSet, T> - where T : IModObject -{ - public ModReferenceSet() - : base() - { - } - - public ModReferenceSet(IEnumerable objs) - : base(objs) - { - } -} - /// /// A set of references. /// diff --git a/FrEee/Utility/Resource.cs b/FrEee.Core/Utility/Resource.cs similarity index 95% rename from FrEee/Utility/Resource.cs rename to FrEee.Core/Utility/Resource.cs index 841b82ab0..8e9e20ce9 100644 --- a/FrEee/Utility/Resource.cs +++ b/FrEee.Core/Utility/Resource.cs @@ -1,249 +1,250 @@ -using FrEee.Objects.Civilization; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using FrEee.Serialization; -using FrEee.Objects.GameState; - -namespace FrEee.Utility; - -/// -/// A resource in the game. -/// -[Serializable] -[DoNotCopy] -public class Resource : INamed, IPictorial -{ - static Resource() - { - all = new Resource[] - { - Minerals, - Organics, - Radioactives, - Research, - Intelligence, - Supply - }; - } - - /// - /// All resources in the game. - /// TODO - moddable resources? - /// - public static IEnumerable All { get { return all; } } - - /// - /// The aptitude (if any) which affects the generation rate of this resource. - /// - public Aptitude Aptitude { get; set; } - - /// - /// A color used to represent the resource. - /// - public Color Color { get; set; } - - /// - /// The name of the property that will be used to modify this resource's income, - /// or null to not have a modifier. - /// - /// - /// This property should be of type . - /// - public string? CultureModifierPropertyName { get; set; } - - /// - /// Function to compute the cultural modifier. A modifier of zero means 100%; 100 means doubled, -50 means halved, etc. - /// - public int GetCultureModifier(Culture c) - => CultureModifierPropertyName is null ? 0 : (int)c.GetPropertyValue(CultureModifierPropertyName); - - /// - /// Does this resource have a "value" assigned to planets and asteroids? - /// - public bool HasValue { get; set; } - - /// - /// An icon used to represent this resource. - /// - public Image Icon - { - get { return Pictures.GetIcon(this); } - } - - public Image Icon32 => Icon.Resize(32); - - public IEnumerable IconPaths - { - get - { - yield return Path.Combine("UI", "Resources", PictureName); - } - } - - /// - /// Can this resource be stored empire-wide? - /// - public bool IsGlobal { get; set; } - - /// - /// Can this resource be stored on a space object? - /// - public bool IsLocal { get; set; } - - /// - /// The name of the resource. - /// - public string Name - { - get; - set; - } - - /// - /// The name of the picture to use for this resource. - /// - public string PictureName { get; set; } - - /// - /// Just use the icon image. - /// - public Image Portrait - { - get { return Icon; } - } - - public IEnumerable PortraitPaths - { - get - { - return IconPaths; - } - } - - public static readonly Resource Intelligence = new Resource - { - Name = "Intelligence", - Color = Color.FromArgb(255, 255, 255), - IsGlobal = false, - IsLocal = false, - HasValue = false, - PictureName = "Resource5", - Aptitude = Aptitude.Cunning, - CultureModifierPropertyName = nameof(Culture.Intelligence), - }; - - public static readonly Resource Minerals = new Resource - { - Name = "Minerals", - Color = Color.FromArgb(128, 128, 255), - IsGlobal = true, - IsLocal = false, - HasValue = true, - PictureName = "Resource1", - Aptitude = Aptitude.Mining, - CultureModifierPropertyName = nameof(Culture.Production), - }; - - public static readonly Resource Organics = new Resource - { - Name = "Organics", - Color = Color.FromArgb(0, 192, 0), - IsGlobal = true, - IsLocal = false, - HasValue = true, - PictureName = "Resource2", - Aptitude = Aptitude.Farming, - CultureModifierPropertyName = nameof(Culture.Production), - }; - - public static readonly Resource Radioactives = new Resource - { - Name = "Radioactives", - Color = Color.FromArgb(192, 0, 0), - IsGlobal = true, - IsLocal = false, - HasValue = true, - PictureName = "Resource3", - Aptitude = Aptitude.Refining, - CultureModifierPropertyName = nameof(Culture.Production), - }; - - public static readonly Resource Research = new Resource - { - Name = "Research", - Color = Color.FromArgb(192, 0, 192), - IsGlobal = false, - IsLocal = false, - HasValue = false, - PictureName = "Resource4", - Aptitude = Aptitude.Intelligence, // no, seriously - CultureModifierPropertyName = nameof(Culture.Research), - }; - - public static readonly Resource Supply = new Resource - { - Name = "Supply", - Color = Color.FromArgb(255, 255, 0), - IsGlobal = false, - IsLocal = true, - HasValue = false, - PictureName = "Resource6", - Aptitude = null, // TODO - supply aptitude? - CultureModifierPropertyName = null, - }; - - private static IEnumerable all; - - public static Resource Find(string name) - { - return All.SingleOrDefault(r => r.Name == name); - } - - public static bool operator !=(Resource r1, Resource r2) - { - return !(r1 == r2); - } - - public static ResourceQuantity operator *(int quantity, Resource resource) - { - var q = new ResourceQuantity(); - q.Add(resource, quantity); - return q; - } - - public static ResourceQuantity operator *(Resource r, int quantity) - { - return quantity * r; - } - - public static bool operator ==(Resource r1, Resource r2) - { - if (r1 is null && r2 is null) - return true; - if (r1 is null || r2 is null) - return false; - return r1.Name == r2.Name && r1.Color == r2.Color && r1.IsGlobal == r2.IsGlobal && r1.IsLocal == r2.IsLocal && r1.PictureName == r2.PictureName; - } - - public override bool Equals(object? obj) - { - var r = obj as Resource; - if (ReferenceEquals(r, null)) - return false; - return this == r; - } - - public override int GetHashCode() - { - return Name.GetSafeHashCode(); - } - - public override string ToString() - { - return Name; - } -} +using FrEee.Objects.Civilization; +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using FrEee.Serialization; +using FrEee.Objects.GameState; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// A resource in the game. +/// +[Serializable] +[DoNotCopy] +public class Resource : INamed, IPictorial +{ + static Resource() + { + all = new Resource[] + { + Minerals, + Organics, + Radioactives, + Research, + Intelligence, + Supply + }; + } + + /// + /// All resources in the game. + /// TODO - moddable resources? + /// + public static IEnumerable All { get { return all; } } + + /// + /// The aptitude (if any) which affects the generation rate of this resource. + /// + public Aptitude Aptitude { get; set; } + + /// + /// A color used to represent the resource. + /// + public Color Color { get; set; } + + /// + /// The name of the property that will be used to modify this resource's income, + /// or null to not have a modifier. + /// + /// + /// This property should be of type . + /// + public string? CultureModifierPropertyName { get; set; } + + /// + /// Function to compute the cultural modifier. A modifier of zero means 100%; 100 means doubled, -50 means halved, etc. + /// + public int GetCultureModifier(Culture c) + => CultureModifierPropertyName is null ? 0 : (int)c.GetPropertyValue(CultureModifierPropertyName); + + /// + /// Does this resource have a "value" assigned to planets and asteroids? + /// + public bool HasValue { get; set; } + + /// + /// An icon used to represent this resource. + /// + public Image Icon + { + get { return Pictures.GetIcon(this); } + } + + public Image Icon32 => Icon.Resize(32); + + public IEnumerable IconPaths + { + get + { + yield return Path.Combine("UI", "Resources", PictureName); + } + } + + /// + /// Can this resource be stored empire-wide? + /// + public bool IsGlobal { get; set; } + + /// + /// Can this resource be stored on a space object? + /// + public bool IsLocal { get; set; } + + /// + /// The name of the resource. + /// + public string Name + { + get; + set; + } + + /// + /// The name of the picture to use for this resource. + /// + public string PictureName { get; set; } + + /// + /// Just use the icon image. + /// + public Image Portrait + { + get { return Icon; } + } + + public IEnumerable PortraitPaths + { + get + { + return IconPaths; + } + } + + public static readonly Resource Intelligence = new Resource + { + Name = "Intelligence", + Color = Color.FromArgb(255, 255, 255), + IsGlobal = false, + IsLocal = false, + HasValue = false, + PictureName = "Resource5", + Aptitude = Aptitude.Cunning, + CultureModifierPropertyName = nameof(Culture.Intelligence), + }; + + public static readonly Resource Minerals = new Resource + { + Name = "Minerals", + Color = Color.FromArgb(128, 128, 255), + IsGlobal = true, + IsLocal = false, + HasValue = true, + PictureName = "Resource1", + Aptitude = Aptitude.Mining, + CultureModifierPropertyName = nameof(Culture.Production), + }; + + public static readonly Resource Organics = new Resource + { + Name = "Organics", + Color = Color.FromArgb(0, 192, 0), + IsGlobal = true, + IsLocal = false, + HasValue = true, + PictureName = "Resource2", + Aptitude = Aptitude.Farming, + CultureModifierPropertyName = nameof(Culture.Production), + }; + + public static readonly Resource Radioactives = new Resource + { + Name = "Radioactives", + Color = Color.FromArgb(192, 0, 0), + IsGlobal = true, + IsLocal = false, + HasValue = true, + PictureName = "Resource3", + Aptitude = Aptitude.Refining, + CultureModifierPropertyName = nameof(Culture.Production), + }; + + public static readonly Resource Research = new Resource + { + Name = "Research", + Color = Color.FromArgb(192, 0, 192), + IsGlobal = false, + IsLocal = false, + HasValue = false, + PictureName = "Resource4", + Aptitude = Aptitude.Intelligence, // no, seriously + CultureModifierPropertyName = nameof(Culture.Research), + }; + + public static readonly Resource Supply = new Resource + { + Name = "Supply", + Color = Color.FromArgb(255, 255, 0), + IsGlobal = false, + IsLocal = true, + HasValue = false, + PictureName = "Resource6", + Aptitude = null, // TODO - supply aptitude? + CultureModifierPropertyName = null, + }; + + private static IEnumerable all; + + public static Resource Find(string name) + { + return All.SingleOrDefault(r => r.Name == name); + } + + public static bool operator !=(Resource r1, Resource r2) + { + return !(r1 == r2); + } + + public static ResourceQuantity operator *(int quantity, Resource resource) + { + var q = new ResourceQuantity(); + q.Add(resource, quantity); + return q; + } + + public static ResourceQuantity operator *(Resource r, int quantity) + { + return quantity * r; + } + + public static bool operator ==(Resource r1, Resource r2) + { + if (r1 is null && r2 is null) + return true; + if (r1 is null || r2 is null) + return false; + return r1.Name == r2.Name && r1.Color == r2.Color && r1.IsGlobal == r2.IsGlobal && r1.IsLocal == r2.IsLocal && r1.PictureName == r2.PictureName; + } + + public override bool Equals(object? obj) + { + var r = obj as Resource; + if (ReferenceEquals(r, null)) + return false; + return this == r; + } + + public override int GetHashCode() + { + return Name.GetSafeHashCode(); + } + + public override string ToString() + { + return Name; + } +} diff --git a/FrEee/Utility/ResourceProgress.cs b/FrEee.Core/Utility/ResourceProgress.cs similarity index 96% rename from FrEee/Utility/ResourceProgress.cs rename to FrEee.Core/Utility/ResourceProgress.cs index 54c612a8c..6de5122e6 100644 --- a/FrEee/Utility/ResourceProgress.cs +++ b/FrEee.Core/Utility/ResourceProgress.cs @@ -1,38 +1,39 @@ -using System.Collections; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Utility; - -/// -/// Progress towards completing something. -/// -public class ResourceProgress : IEnumerable> -{ - public ResourceProgress(ResourceQuantity value, ResourceQuantity maximum, ResourceQuantity incrementalProgress) - { - Value = value; - Maximum = maximum; - IncrementalProgress = incrementalProgress; - } - - public ResourceQuantity IncrementalProgress { get; set; } - public ResourceQuantity Maximum { get; set; } - public ResourceQuantity Value { get; set; } - - public IEnumerator> GetEnumerator() - { - foreach (var r in Value.Keys.Union(Maximum.Keys).Union(IncrementalProgress.Keys)) - yield return new KeyValuePair(r, new Progress(Value[r], Maximum[r], IncrementalProgress[r])); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public override string ToString() - { - return string.Format("{0} / {1} ({2:+#;-#;0} per turn", Value, Maximum, IncrementalProgress); - } +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// Progress towards completing something. +/// +public class ResourceProgress : IEnumerable> +{ + public ResourceProgress(ResourceQuantity value, ResourceQuantity maximum, ResourceQuantity incrementalProgress) + { + Value = value; + Maximum = maximum; + IncrementalProgress = incrementalProgress; + } + + public ResourceQuantity IncrementalProgress { get; set; } + public ResourceQuantity Maximum { get; set; } + public ResourceQuantity Value { get; set; } + + public IEnumerator> GetEnumerator() + { + foreach (var r in Value.Keys.Union(Maximum.Keys).Union(IncrementalProgress.Keys)) + yield return new KeyValuePair(r, new Progress(Value[r], Maximum[r], IncrementalProgress[r])); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public override string ToString() + { + return string.Format("{0} / {1} ({2:+#;-#;0} per turn", Value, Maximum, IncrementalProgress); + } } \ No newline at end of file diff --git a/FrEee/Utility/ResourceQuantity.cs b/FrEee.Core/Utility/ResourceQuantity.cs similarity index 95% rename from FrEee/Utility/ResourceQuantity.cs rename to FrEee.Core/Utility/ResourceQuantity.cs index 842e0ddc5..3dcd4ba51 100644 --- a/FrEee/Utility/ResourceQuantity.cs +++ b/FrEee.Core/Utility/ResourceQuantity.cs @@ -1,230 +1,231 @@ -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace FrEee.Utility; - -/// -/// Quantities of resources. -/// -[Serializable] -public class ResourceQuantity : SafeDictionary, IComparable, IComparable -{ - /// - /// Is this quantity all zeroes? - /// - public bool IsEmpty { get { return this.All(kvp => kvp.Value == 0); } } - - public ResourceQuantity() - { - - } - - public ResourceQuantity(ResourceQuantity q) - { - if (q != null) - { - foreach (var x in q) - Add(x); - } - } - - /// - /// Computes the maximum of two resource amounts. - /// Missing values are treated as zeroes! - /// - /// - /// - /// - public static ResourceQuantity Max(ResourceQuantity r1, ResourceQuantity r2) - { - var result = new ResourceQuantity(); - foreach (var key in r1.Keys.Union(r2.Keys)) - result.Add(key, Math.Max(r1[key], r2[key])); - return result; - } - - /// - /// Computes the minimum of two resource amounts. - /// Missing values are treated as zeroes! - /// - /// - /// - /// - public static ResourceQuantity Min(ResourceQuantity r1, ResourceQuantity r2) - { - var result = new ResourceQuantity(); - if (r1 == null || r2 == null) - return new ResourceQuantity(); - foreach (var key in r1.Keys.Union(r2.Keys)) - result.Add(key, Math.Min(r1[key], r2[key])); - return result; - } - - public static ResourceQuantity operator -(ResourceQuantity r1, ResourceQuantity r2) - { - var result = new ResourceQuantity(); - foreach (var key in r1.Keys.Union(r2.Keys)) - result.Add(key, r1[key] - r2[key]); - return result; - } - - public static bool operator !=(ResourceQuantity r1, ResourceQuantity r2) - { - return !(r1 == r2); - } - - public static ResourceQuantity operator *(ResourceQuantity r, double scalar) - { - var result = new ResourceQuantity(); - foreach (var key in r.Keys) - result.Add(key, (int)Math.Round(r[key] * scalar)); - return result; - } - - public static ResourceQuantity operator /(ResourceQuantity r, double scalar) - { - var result = new ResourceQuantity(); - foreach (var key in r.Keys) - result.Add(key, (int)Math.Round(r[key] / scalar)); - return result; - } - - public static ResourceQuantity operator +(ResourceQuantity r1, ResourceQuantity r2) - { - var result = new ResourceQuantity(); - foreach (var key in r1.Keys.Union(r2.Keys)) - result.Add(key, r1[key] + r2[key]); - return result; - } - - public static bool operator <(ResourceQuantity r1, ResourceQuantity r2) - { - foreach (var key in r1.Keys.Union(r2.Keys)) - { - if (r1[key] > r2[key]) - return false; - } - foreach (var key in r1.Keys.Union(r2.Keys)) - { - if (r1[key] < r2[key]) - return true; - } - return false; - } - - public static bool operator <=(ResourceQuantity r1, ResourceQuantity r2) - { - foreach (var key in r1.Keys.Union(r2.Keys)) - { - if (r1[key] > r2[key]) - return false; - } - return true; - } - - public static bool operator ==(ResourceQuantity r1, ResourceQuantity r2) - { - if (r1 is null && r2 is null) - return true; - if (r1 is null || r2 is null) - return false; - foreach (var key in r1.Keys.Union(r2.Keys)) - { - if (r1[key] != r2[key]) - return false; - } - return true; - } - - public static bool operator >(ResourceQuantity r1, ResourceQuantity r2) - { - foreach (var key in r1.Keys.Union(r2.Keys)) - { - if (r1[key] < r2[key]) - return false; - } - foreach (var key in r1.Keys.Union(r2.Keys)) - { - if (r1[key] > r2[key]) - return true; - } - return false; - } - - public static bool operator >=(ResourceQuantity r1, ResourceQuantity r2) - { - foreach (var key in r1.Keys.Union(r2.Keys)) - { - if (r1[key] < r2[key]) - return false; - } - return true; - } - - public static ResourceQuantity Parse(string s) - { - var q = new ResourceQuantity(); - if (s.Length > 0) - { - var resSplit = s.Split(',').Select(sub => sub.Trim()); - foreach (var res in resSplit) - { - var pos = res.IndexOf(" "); - var amount = res.Substring(0, pos); - var resName = res.Substring(pos + 1); - q.Add(Resource.Find(resName), int.Parse(amount)); - } - } - return q; - } - - /// - /// Adds resources. Does not overwrite the existing value, but adds it to the existing value instead. - /// - /// - public override void Add(KeyValuePair item) - { - Add(item.Key, item.Value); - } - - /// - /// Adds resources. Does not overwrite the existing value, but adds it to the existing value instead. - /// - /// - /// - public override void Add(Resource key, int value) - { - this[key] += value; - } - - public int CompareTo(ResourceQuantity other) - { - return this.Sum(kvp => kvp.Value).CompareTo(other.Sum(kvp => kvp.Value)); - } - - public int CompareTo(object obj) - { - if (obj is ResourceQuantity) - return CompareTo((ResourceQuantity)obj); - return this.Sum(kvp => kvp.Value).CompareTo(obj.ToString().ToInt()); - } - - public override bool Equals(object? obj) - { - if (obj is ResourceQuantity rq) - return this == rq; - return false; - } - - public override int GetHashCode() - { - return HashCodeMasher.MashList(this.Where(kvp => kvp.Value != 0)); - } - - public override string ToString() - { - return string.Join(", ", this.Select(kvp => kvp.Value + " " + kvp.Key)); - } +using FrEee.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using FrEee.Utility; + +namespace FrEee.Utility; + +/// +/// Quantities of resources. +/// +[Serializable] +public class ResourceQuantity : SafeDictionary, IComparable, IComparable +{ + /// + /// Is this quantity all zeroes? + /// + public bool IsEmpty { get { return this.All(kvp => kvp.Value == 0); } } + + public ResourceQuantity() + { + + } + + public ResourceQuantity(ResourceQuantity q) + { + if (q != null) + { + foreach (var x in q) + Add(x); + } + } + + /// + /// Computes the maximum of two resource amounts. + /// Missing values are treated as zeroes! + /// + /// + /// + /// + public static ResourceQuantity Max(ResourceQuantity r1, ResourceQuantity r2) + { + var result = new ResourceQuantity(); + foreach (var key in r1.Keys.Union(r2.Keys)) + result.Add(key, Math.Max(r1[key], r2[key])); + return result; + } + + /// + /// Computes the minimum of two resource amounts. + /// Missing values are treated as zeroes! + /// + /// + /// + /// + public static ResourceQuantity Min(ResourceQuantity r1, ResourceQuantity r2) + { + var result = new ResourceQuantity(); + if (r1 == null || r2 == null) + return new ResourceQuantity(); + foreach (var key in r1.Keys.Union(r2.Keys)) + result.Add(key, Math.Min(r1[key], r2[key])); + return result; + } + + public static ResourceQuantity operator -(ResourceQuantity r1, ResourceQuantity r2) + { + var result = new ResourceQuantity(); + foreach (var key in r1.Keys.Union(r2.Keys)) + result.Add(key, r1[key] - r2[key]); + return result; + } + + public static bool operator !=(ResourceQuantity r1, ResourceQuantity r2) + { + return !(r1 == r2); + } + + public static ResourceQuantity operator *(ResourceQuantity r, double scalar) + { + var result = new ResourceQuantity(); + foreach (var key in r.Keys) + result.Add(key, (int)Math.Round(r[key] * scalar)); + return result; + } + + public static ResourceQuantity operator /(ResourceQuantity r, double scalar) + { + var result = new ResourceQuantity(); + foreach (var key in r.Keys) + result.Add(key, (int)Math.Round(r[key] / scalar)); + return result; + } + + public static ResourceQuantity operator +(ResourceQuantity r1, ResourceQuantity r2) + { + var result = new ResourceQuantity(); + foreach (var key in r1.Keys.Union(r2.Keys)) + result.Add(key, r1[key] + r2[key]); + return result; + } + + public static bool operator <(ResourceQuantity r1, ResourceQuantity r2) + { + foreach (var key in r1.Keys.Union(r2.Keys)) + { + if (r1[key] > r2[key]) + return false; + } + foreach (var key in r1.Keys.Union(r2.Keys)) + { + if (r1[key] < r2[key]) + return true; + } + return false; + } + + public static bool operator <=(ResourceQuantity r1, ResourceQuantity r2) + { + foreach (var key in r1.Keys.Union(r2.Keys)) + { + if (r1[key] > r2[key]) + return false; + } + return true; + } + + public static bool operator ==(ResourceQuantity r1, ResourceQuantity r2) + { + if (r1 is null && r2 is null) + return true; + if (r1 is null || r2 is null) + return false; + foreach (var key in r1.Keys.Union(r2.Keys)) + { + if (r1[key] != r2[key]) + return false; + } + return true; + } + + public static bool operator >(ResourceQuantity r1, ResourceQuantity r2) + { + foreach (var key in r1.Keys.Union(r2.Keys)) + { + if (r1[key] < r2[key]) + return false; + } + foreach (var key in r1.Keys.Union(r2.Keys)) + { + if (r1[key] > r2[key]) + return true; + } + return false; + } + + public static bool operator >=(ResourceQuantity r1, ResourceQuantity r2) + { + foreach (var key in r1.Keys.Union(r2.Keys)) + { + if (r1[key] < r2[key]) + return false; + } + return true; + } + + public static ResourceQuantity Parse(string s) + { + var q = new ResourceQuantity(); + if (s.Length > 0) + { + var resSplit = s.Split(',').Select(sub => sub.Trim()); + foreach (var res in resSplit) + { + var pos = res.IndexOf(" "); + var amount = res.Substring(0, pos); + var resName = res.Substring(pos + 1); + q.Add(Resource.Find(resName), int.Parse(amount)); + } + } + return q; + } + + /// + /// Adds resources. Does not overwrite the existing value, but adds it to the existing value instead. + /// + /// + public override void Add(KeyValuePair item) + { + Add(item.Key, item.Value); + } + + /// + /// Adds resources. Does not overwrite the existing value, but adds it to the existing value instead. + /// + /// + /// + public override void Add(Resource key, int value) + { + this[key] += value; + } + + public int CompareTo(ResourceQuantity other) + { + return this.Sum(kvp => kvp.Value).CompareTo(other.Sum(kvp => kvp.Value)); + } + + public int CompareTo(object obj) + { + if (obj is ResourceQuantity) + return CompareTo((ResourceQuantity)obj); + return this.Sum(kvp => kvp.Value).CompareTo(obj.ToString().ToInt()); + } + + public override bool Equals(object? obj) + { + if (obj is ResourceQuantity rq) + return this == rq; + return false; + } + + public override int GetHashCode() + { + return HashCodeMasher.MashList(this.Where(kvp => kvp.Value != 0)); + } + + public override string ToString() + { + return string.Join(", ", this.Select(kvp => kvp.Value + " " + kvp.Key)); + } } \ No newline at end of file diff --git a/FrEee/xbuild.sh b/FrEee.Core/xbuild.sh old mode 100755 new mode 100644 similarity index 100% rename from FrEee/xbuild.sh rename to FrEee.Core/xbuild.sh diff --git a/FrEee.Tests/FrEee.Tests.csproj b/FrEee.Tests/FrEee.Tests.csproj index ab19b8c8c..1e6f49b88 100644 --- a/FrEee.Tests/FrEee.Tests.csproj +++ b/FrEee.Tests/FrEee.Tests.csproj @@ -12,7 +12,9 @@ - + + + diff --git a/FrEee.Tests/Modding/FormulaTest.cs b/FrEee.Tests/Modding/FormulaTest.cs index 176982e78..e5cdb0efa 100644 --- a/FrEee.Tests/Modding/FormulaTest.cs +++ b/FrEee.Tests/Modding/FormulaTest.cs @@ -1,5 +1,5 @@ using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; using FrEee.Objects.Technology; using FrEee.Objects.Vehicles; using FrEee.Modding; diff --git a/FrEee.Tests/Objects/Abilities/AbilityTest.cs b/FrEee.Tests/Objects/Abilities/AbilityTest.cs index c49279bfd..43d9fa1f0 100644 --- a/FrEee.Tests/Objects/Abilities/AbilityTest.cs +++ b/FrEee.Tests/Objects/Abilities/AbilityTest.cs @@ -1,4 +1,3 @@ -using FrEee.Objects.Abilities; using FrEee.Objects.Civilization; using FrEee.Objects.Space; using FrEee.Objects.Vehicles; @@ -8,6 +7,7 @@ using System.Drawing; using FrEee.Objects.Technology; using FrEee.Objects.GameState; +using FrEee.Modding.Abilities; namespace FrEee.Tests.Objects.Abilities; diff --git a/FrEee.Tests/Objects/Combat/DamageTypesTest.cs b/FrEee.Tests/Objects/Combat/DamageTypesTest.cs deleted file mode 100644 index f40f8ec99..000000000 --- a/FrEee.Tests/Objects/Combat/DamageTypesTest.cs +++ /dev/null @@ -1,179 +0,0 @@ -using FrEee.Objects.Combat; -using FrEee.Objects.Vehicles; -using FrEee.Modding; -using FrEee.Extensions; -using NUnit.Framework; -using System; -using System.Linq; -using FrEee.Serialization; -using FrEee.Objects.GameState; - -namespace FrEee.Tests.Objects.Combat; - -public class DamageTypesTest -{ - private static Mod mod; - - private Ship attacker; - private IDesign attackerDesign; - private Ship defender; - private IDesign defenderDesign; - - [OneTimeSetUp] - public static void ClassInit() - { - // load stock mod - mod = Mod.Load(null); - - // create a galaxy for referencing things - new Galaxy(); - foreach (var r in mod.Objects.OfType()) - Galaxy.Current.AssignID(r); - } - - [SetUp] - public void Init() - { - // create dummy designs - attackerDesign = new Design(); - attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Bridge")); - attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Life Support")); - attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Crew Quarters")); - attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Quantum Reactor")); - defenderDesign = new Design(); - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Bridge")); - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Life Support")); - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Crew Quarters")); - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Quantum Reactor")); - } - - /// - /// Makes sure that normal damage doesn't pierce shields or armor, and can destroy a ship. - /// - [Test] - public void NormalDamageVersusShips() - { - attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Depleted Uranium Cannon I")); - attacker = attackerDesign.Instantiate(); - - // armor should get hit before hull - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Armor I")); - SetupDefender(); - TestDamage(attacker, defender, 1, expectedArmorDmg: 1); - - // phased shields should get hit before normal shields - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Generator I")); - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Phased - Shield Generator I")); - SetupDefender(); - TestDamage(attacker, defender, 1, expectedNormalShieldDmg: 1); - - // make sure our ship can be destroyed - SetupDefender(); - TestDamage(attacker, defender, 99999, defender.HullHitpoints, defender.ArmorHitpoints, defender.PhasedShields, defender.NormalShields); - } - - /// - /// Makes sure that "only engines" damage damages engines and shields only. - /// - [Test] - public void OnlyEnginesDamageVersusShips() - { - attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Ionic Disperser I")); - attacker = attackerDesign.Instantiate(); - - // small amounts of damage should hit the shields - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Armor I")); - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Generator I")); - SetupDefender(); - TestDamage(attacker, defender, 1, expectedNormalShieldDmg: 1); - - // large amounts of damage should hit the engines - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Ion Engine I")); - SetupDefender(); - TestDamage(attacker, defender, 99999, expectedNormalShieldDmg: defender.NormalShields, expectedHullDmg: 20); - Assert.AreEqual(0, defender.Components.Where(c => !c.IsDestroyed && c.HasAbility("Standard Ship Movement")).Count()); - } - - /// - /// Makes sure that "shields only" damage only damages shields. - /// - [Test] - public void ShieldsOnlyDamageVersusShips() - { - attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Depleter I")); - attacker = attackerDesign.Instantiate(); - - // shields should be depleted, ship should not take armor or hull damage - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Armor I")); - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Generator I")); - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Phased - Shield Generator I")); - SetupDefender(); - TestDamage(attacker, defender, 99999, expectedNormalShieldDmg: defender.NormalShields, expectedPhasedShieldDmg: defender.PhasedShields); - } - - /// - /// Makes sure that "skips normal shields" damage skips normal shields, but not armor or phased shields, and can destroy a ship. - /// - [Test] - public void SkipsNormalShieldsDamageVersusShips() - { - attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Phased - Polaron Beam I")); - attacker = attackerDesign.Instantiate(); - - // small amounts of damage should hit the armor - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Armor I")); - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Generator I")); - SetupDefender(); - TestDamage(attacker, defender, 1, expectedArmorDmg: 1); - - // phased shields shold block damage - defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Phased - Shield Generator I")); - SetupDefender(); - TestDamage(attacker, defender, 1, expectedPhasedShieldDmg: 1); - - // should be able to destroy ship - // normal shields will go down when generators destroyed - TestDamage(attacker, defender, 99999, expectedHullDmg: defender.HullHitpoints, expectedArmorDmg: defender.ArmorHitpoints, expectedNormalShieldDmg: defender.NormalShields, expectedPhasedShieldDmg: defender.PhasedShields); - } - - private void AddComponents(IDesign d, params string[] compNames) - { - foreach (var cn in compNames) - d.AddComponent(Mod.Current.ComponentTemplates.FindByName(cn)); - } - - private void Heal(Ship ship) - { - ship.Repair(); - ship.ReplenishShields(); - } - - private void SetupDefender() - { - defender = defenderDesign.Instantiate(); - Heal(defender); - } - - private void TestDamage(Ship attacker, IDamageable defender, int dmg, int expectedHullDmg = 0, int expectedArmorDmg = 0, int expectedPhasedShieldDmg = 0, int expectedNormalShieldDmg = 0) - { - var hhp = defender.HullHitpoints; - var ahp = defender.ArmorHitpoints; - var pshp = defender.PhasedShields; - var nshp = defender.NormalShields; - - foreach (var w in attacker.Weapons) - { - var hit = new Hit(new Shot(attacker, w, defender, 0), defender, dmg); - defender.TakeDamage(hit); - } - Assert.AreEqual(Math.Max(0, hhp - expectedHullDmg), defender.HullHitpoints, $"Expected hull HP of {Math.Max(0, hhp - expectedHullDmg)}, got {defender.HullHitpoints}."); - Assert.AreEqual(Math.Max(0, ahp - expectedArmorDmg), defender.ArmorHitpoints, $"Expected armor HP of {Math.Max(0, ahp - expectedArmorDmg)}, got {defender.ArmorHitpoints}."); - Assert.AreEqual(Math.Max(0, nshp - expectedNormalShieldDmg), defender.NormalShields, $"Expected normal shields of {Math.Max(0, nshp - expectedNormalShieldDmg)}, got {defender.NormalShields}."); - Assert.AreEqual(Math.Max(0, pshp - expectedPhasedShieldDmg), defender.PhasedShields, $"Expected phased Shields of {Math.Max(0, nshp - expectedPhasedShieldDmg)}, got {defender.PhasedShields}."); - - if (defender.HullHitpoints > 0) - Assert.IsFalse(defender.IsDestroyed); - else - Assert.IsTrue(defender.IsDestroyed); - } -} \ No newline at end of file diff --git a/FrEee.Tests/Objects/Technology/WeaponInfoTest.cs b/FrEee.Tests/Objects/Technology/WeaponInfoTest.cs index 374813a3f..dc6e6a76c 100644 --- a/FrEee.Tests/Objects/Technology/WeaponInfoTest.cs +++ b/FrEee.Tests/Objects/Technology/WeaponInfoTest.cs @@ -1,4 +1,4 @@ -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; using FrEee.Modding; using NUnit.Framework; using System.Linq; diff --git a/FrEee.Tests/Objects/Vehicles/CloakingTest.cs b/FrEee.Tests/Objects/Vehicles/CloakingTest.cs index f32fea220..461b475c3 100644 --- a/FrEee.Tests/Objects/Vehicles/CloakingTest.cs +++ b/FrEee.Tests/Objects/Vehicles/CloakingTest.cs @@ -1,5 +1,4 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; +using FrEee.Objects.Civilization; using FrEee.Objects.Space; using FrEee.Objects.Vehicles; using FrEee.Modding; @@ -8,6 +7,7 @@ using System.Drawing; using FrEee.Objects.Technology; using FrEee.Objects.GameState; +using FrEee.Modding.Abilities; namespace FrEee.Tests.Objects.Vehicles; diff --git a/FrEee.Tests/Objects/Vehicles/DamageTest.cs b/FrEee.Tests/Objects/Vehicles/DamageTest.cs index 67f956448..f44a31b52 100644 --- a/FrEee.Tests/Objects/Vehicles/DamageTest.cs +++ b/FrEee.Tests/Objects/Vehicles/DamageTest.cs @@ -1,4 +1,4 @@ -using FrEee.Objects.Abilities; +using FrEee.Modding.Abilities; using FrEee.Objects.Civilization; using FrEee.Objects.Space; using FrEee.Objects.Technology; @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Linq; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.Tests.Objects.Vehicles; diff --git a/FrEee.Tests/Processes/Combat/DamageTypesTest.cs b/FrEee.Tests/Processes/Combat/DamageTypesTest.cs new file mode 100644 index 000000000..176cecd70 --- /dev/null +++ b/FrEee.Tests/Processes/Combat/DamageTypesTest.cs @@ -0,0 +1,180 @@ +using FrEee.Processes.Combat; +using FrEee.Objects.Vehicles; +using FrEee.Modding; +using FrEee.Extensions; +using NUnit.Framework; +using System; +using System.Linq; +using FrEee.Serialization; +using FrEee.Objects.GameState; +using FrEee.Processes.Combat; + +namespace FrEee.Tests.Processes.Combat; + +public class DamageTypesTest +{ + private static Mod mod; + + private Ship attacker; + private IDesign attackerDesign; + private Ship defender; + private IDesign defenderDesign; + + [OneTimeSetUp] + public static void ClassInit() + { + // load stock mod + mod = Mod.Load(null); + + // create a galaxy for referencing things + new Galaxy(); + foreach (var r in mod.Objects.OfType()) + Galaxy.Current.AssignID(r); + } + + [SetUp] + public void Init() + { + // create dummy designs + attackerDesign = new Design(); + attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Bridge")); + attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Life Support")); + attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Crew Quarters")); + attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Quantum Reactor")); + defenderDesign = new Design(); + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Bridge")); + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Life Support")); + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Crew Quarters")); + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Quantum Reactor")); + } + + /// + /// Makes sure that normal damage doesn't pierce shields or armor, and can destroy a ship. + /// + [Test] + public void NormalDamageVersusShips() + { + attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Depleted Uranium Cannon I")); + attacker = attackerDesign.Instantiate(); + + // armor should get hit before hull + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Armor I")); + SetupDefender(); + TestDamage(attacker, defender, 1, expectedArmorDmg: 1); + + // phased shields should get hit before normal shields + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Generator I")); + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Phased - Shield Generator I")); + SetupDefender(); + TestDamage(attacker, defender, 1, expectedNormalShieldDmg: 1); + + // make sure our ship can be destroyed + SetupDefender(); + TestDamage(attacker, defender, 99999, defender.HullHitpoints, defender.ArmorHitpoints, defender.PhasedShields, defender.NormalShields); + } + + /// + /// Makes sure that "only engines" damage damages engines and shields only. + /// + [Test] + public void OnlyEnginesDamageVersusShips() + { + attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Ionic Disperser I")); + attacker = attackerDesign.Instantiate(); + + // small amounts of damage should hit the shields + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Armor I")); + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Generator I")); + SetupDefender(); + TestDamage(attacker, defender, 1, expectedNormalShieldDmg: 1); + + // large amounts of damage should hit the engines + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Ion Engine I")); + SetupDefender(); + TestDamage(attacker, defender, 99999, expectedNormalShieldDmg: defender.NormalShields, expectedHullDmg: 20); + Assert.AreEqual(0, defender.Components.Where(c => !c.IsDestroyed && c.HasAbility("Standard Ship Movement")).Count()); + } + + /// + /// Makes sure that "shields only" damage only damages shields. + /// + [Test] + public void ShieldsOnlyDamageVersusShips() + { + attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Depleter I")); + attacker = attackerDesign.Instantiate(); + + // shields should be depleted, ship should not take armor or hull damage + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Armor I")); + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Generator I")); + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Phased - Shield Generator I")); + SetupDefender(); + TestDamage(attacker, defender, 99999, expectedNormalShieldDmg: defender.NormalShields, expectedPhasedShieldDmg: defender.PhasedShields); + } + + /// + /// Makes sure that "skips normal shields" damage skips normal shields, but not armor or phased shields, and can destroy a ship. + /// + [Test] + public void SkipsNormalShieldsDamageVersusShips() + { + attackerDesign.AddComponent(mod.ComponentTemplates.FindByName("Phased - Polaron Beam I")); + attacker = attackerDesign.Instantiate(); + + // small amounts of damage should hit the armor + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Armor I")); + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Shield Generator I")); + SetupDefender(); + TestDamage(attacker, defender, 1, expectedArmorDmg: 1); + + // phased shields shold block damage + defenderDesign.AddComponent(mod.ComponentTemplates.FindByName("Phased - Shield Generator I")); + SetupDefender(); + TestDamage(attacker, defender, 1, expectedPhasedShieldDmg: 1); + + // should be able to destroy ship + // normal shields will go down when generators destroyed + TestDamage(attacker, defender, 99999, expectedHullDmg: defender.HullHitpoints, expectedArmorDmg: defender.ArmorHitpoints, expectedNormalShieldDmg: defender.NormalShields, expectedPhasedShieldDmg: defender.PhasedShields); + } + + private void AddComponents(IDesign d, params string[] compNames) + { + foreach (var cn in compNames) + d.AddComponent(Mod.Current.ComponentTemplates.FindByName(cn)); + } + + private void Heal(Ship ship) + { + ship.Repair(); + ship.ReplenishShields(); + } + + private void SetupDefender() + { + defender = defenderDesign.Instantiate(); + Heal(defender); + } + + private void TestDamage(Ship attacker, IDamageable defender, int dmg, int expectedHullDmg = 0, int expectedArmorDmg = 0, int expectedPhasedShieldDmg = 0, int expectedNormalShieldDmg = 0) + { + var hhp = defender.HullHitpoints; + var ahp = defender.ArmorHitpoints; + var pshp = defender.PhasedShields; + var nshp = defender.NormalShields; + + foreach (var w in attacker.Weapons) + { + var hit = new Hit(new Shot(attacker, w, defender, 0), defender, dmg); + defender.TakeDamage(hit); + } + Assert.AreEqual(Math.Max(0, hhp - expectedHullDmg), defender.HullHitpoints, $"Expected hull HP of {Math.Max(0, hhp - expectedHullDmg)}, got {defender.HullHitpoints}."); + Assert.AreEqual(Math.Max(0, ahp - expectedArmorDmg), defender.ArmorHitpoints, $"Expected armor HP of {Math.Max(0, ahp - expectedArmorDmg)}, got {defender.ArmorHitpoints}."); + Assert.AreEqual(Math.Max(0, nshp - expectedNormalShieldDmg), defender.NormalShields, $"Expected normal shields of {Math.Max(0, nshp - expectedNormalShieldDmg)}, got {defender.NormalShields}."); + Assert.AreEqual(Math.Max(0, pshp - expectedPhasedShieldDmg), defender.PhasedShields, $"Expected phased Shields of {Math.Max(0, nshp - expectedPhasedShieldDmg)}, got {defender.PhasedShields}."); + + if (defender.HullHitpoints > 0) + Assert.IsFalse(defender.IsDestroyed); + else + Assert.IsTrue(defender.IsDestroyed); + } +} \ No newline at end of file diff --git a/FrEee.Tests/Savegame/freeefurball_1.gam b/FrEee.Tests/Savegame/freeefurball_1.gam index 896eda3a1..a8b4d2fb7 100644 --- a/FrEee.Tests/Savegame/freeefurball_1.gam +++ b/FrEee.Tests/Savegame/freeefurball_1.gam @@ -4,7 +4,7 @@ p21: : p24: AbilityRules: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c209: : p7: @@ -8147,7 +8147,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -8532,7 +8532,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -8729,7 +8729,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -8926,7 +8926,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -9110,7 +9110,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -9247,7 +9247,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -9380,7 +9380,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -9513,7 +9513,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -9801,7 +9801,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -10030,7 +10030,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -10263,7 +10263,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -10443,7 +10443,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -10568,7 +10568,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -10693,7 +10693,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -10922,7 +10922,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -11043,7 +11043,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -11160,7 +11160,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -11412,7 +11412,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -11589,7 +11589,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -11766,7 +11766,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -11963,7 +11963,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -12144,7 +12144,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -12325,7 +12325,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -12518,7 +12518,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -12699,7 +12699,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -12880,7 +12880,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -13069,7 +13069,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -13250,7 +13250,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -13431,7 +13431,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -13664,7 +13664,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -13785,7 +13785,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -13902,7 +13902,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -14067,7 +14067,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -14216,7 +14216,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -14369,7 +14369,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -14606,7 +14606,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -14727,7 +14727,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -14844,7 +14844,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -14965,7 +14965,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -15086,7 +15086,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -15223,7 +15223,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -15340,7 +15340,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -15461,7 +15461,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -15582,7 +15582,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -15707,7 +15707,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -15840,7 +15840,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -15965,7 +15965,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -16090,7 +16090,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -16211,7 +16211,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -16336,7 +16336,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -16508,7 +16508,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -16656,7 +16656,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -16804,7 +16804,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -16952,7 +16952,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -17100,7 +17100,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -17229,7 +17229,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -17350,7 +17350,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -17467,7 +17467,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -17728,7 +17728,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -17885,7 +17885,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -18038,7 +18038,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -18257,7 +18257,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -18410,7 +18410,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -18555,7 +18555,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -18788,7 +18788,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -18913,7 +18913,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -19034,7 +19034,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -19159,7 +19159,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -19346,7 +19346,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -19467,7 +19467,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -19592,7 +19592,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -19725,7 +19725,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -19842,7 +19842,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -19959,7 +19959,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -20146,7 +20146,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -20267,7 +20267,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -20388,7 +20388,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -20521,7 +20521,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -20654,7 +20654,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -20771,7 +20771,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -20888,7 +20888,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -21013,7 +21013,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -21134,7 +21134,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -21367,7 +21367,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -21492,7 +21492,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -21617,7 +21617,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -21742,7 +21742,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -21867,7 +21867,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -22074,7 +22074,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -22230,7 +22230,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -22386,7 +22386,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -22519,7 +22519,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c5: : p7: @@ -22858,7 +22858,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c5: : p7: @@ -23111,7 +23111,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c5: : p7: @@ -23360,7 +23360,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -23497,7 +23497,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -23618,7 +23618,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -23747,7 +23747,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -23880,7 +23880,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -24088,7 +24088,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -24237,7 +24237,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -24390,7 +24390,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -24566,7 +24566,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -24695,7 +24695,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -24820,7 +24820,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -24992,7 +24992,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -25113,7 +25113,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -25234,7 +25234,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -25406,7 +25406,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -25527,7 +25527,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -25648,7 +25648,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -25899,7 +25899,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -26052,7 +26052,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -26205,7 +26205,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -26456,7 +26456,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -26605,7 +26605,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -26754,7 +26754,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -26918,7 +26918,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -27035,7 +27035,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -27152,7 +27152,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -27277,7 +27277,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -27406,7 +27406,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -27589,7 +27589,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -27714,7 +27714,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -27878,7 +27878,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -28050,7 +28050,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -28242,7 +28242,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -28434,7 +28434,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -28630,7 +28630,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -28755,7 +28755,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -28904,7 +28904,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -29025,7 +29025,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -29138,7 +29138,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -29251,7 +29251,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -29516,7 +29516,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -29685,7 +29685,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -29838,7 +29838,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -29991,7 +29991,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -30144,7 +30144,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -30297,7 +30297,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -30466,7 +30466,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -30615,7 +30615,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -30760,7 +30760,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -30925,7 +30925,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -31070,7 +31070,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -31215,7 +31215,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -31352,7 +31352,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -31513,7 +31513,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -31682,7 +31682,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -31843,7 +31843,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -32084,7 +32084,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -32125,7 +32125,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -32234,7 +32234,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -32263,7 +32263,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -32368,7 +32368,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -32397,7 +32397,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -32502,7 +32502,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -32531,7 +32531,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -32636,7 +32636,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -32665,7 +32665,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -32774,7 +32774,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -32803,7 +32803,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -32908,7 +32908,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -32937,7 +32937,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -33046,7 +33046,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -33075,7 +33075,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -33184,7 +33184,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -33213,7 +33213,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -33318,7 +33318,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -33347,7 +33347,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -33456,7 +33456,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -33485,7 +33485,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -33594,7 +33594,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -33623,7 +33623,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -33772,7 +33772,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -33815,7 +33815,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -33921,7 +33921,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -33956,7 +33956,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -34062,7 +34062,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -34097,7 +34097,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -34203,7 +34203,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -34242,7 +34242,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -34344,7 +34344,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -34379,7 +34379,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -34549,7 +34549,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -34582,7 +34582,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -34687,7 +34687,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -34716,7 +34716,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -34821,7 +34821,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -34850,7 +34850,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -34955,7 +34955,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -34984,7 +34984,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -35089,7 +35089,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -35118,7 +35118,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -35223,7 +35223,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -35252,7 +35252,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -35419,7 +35419,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -35456,7 +35456,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -35561,7 +35561,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -35590,7 +35590,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -35695,7 +35695,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -35724,7 +35724,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -35829,7 +35829,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -35858,7 +35858,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -35963,7 +35963,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -35992,7 +35992,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -36105,7 +36105,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -36138,7 +36138,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -36243,7 +36243,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -36272,7 +36272,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -36377,7 +36377,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -36406,7 +36406,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -36511,7 +36511,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -36540,7 +36540,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -36645,7 +36645,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -36674,7 +36674,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -36784,7 +36784,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -36823,7 +36823,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -36921,7 +36921,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -36956,7 +36956,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -37054,7 +37054,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -37089,7 +37089,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -37191,7 +37191,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -37226,7 +37226,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -37328,7 +37328,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -37363,7 +37363,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -37562,7 +37562,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -37602,7 +37602,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -37735,7 +37735,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -37767,7 +37767,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -37900,7 +37900,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -37932,7 +37932,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -38065,7 +38065,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -38097,7 +38097,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -38230,7 +38230,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -38262,7 +38262,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -38514,7 +38514,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -38547,7 +38547,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -38741,7 +38741,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -38770,7 +38770,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -38964,7 +38964,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -38993,7 +38993,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -39187,7 +39187,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -39216,7 +39216,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -39410,7 +39410,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -39439,7 +39439,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -39677,7 +39677,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -39710,7 +39710,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -39815,7 +39815,7 @@ p21: : i6; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -39844,7 +39844,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -39949,7 +39949,7 @@ p21: : i6; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -39978,7 +39978,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -40083,7 +40083,7 @@ p21: : i6; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -40112,7 +40112,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -40217,7 +40217,7 @@ p21: : i6; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -40246,7 +40246,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -40413,7 +40413,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -40446,7 +40446,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -40551,7 +40551,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -40580,7 +40580,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -40685,7 +40685,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -40714,7 +40714,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -40819,7 +40819,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -40848,7 +40848,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -40965,7 +40965,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -40998,7 +40998,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -41103,7 +41103,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -41132,7 +41132,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -41237,7 +41237,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -41266,7 +41266,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -41383,7 +41383,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -41416,7 +41416,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -41521,7 +41521,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -41550,7 +41550,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -41655,7 +41655,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -41684,7 +41684,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -41940,7 +41940,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -41977,7 +41977,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -42082,7 +42082,7 @@ p21: : i7; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -42111,7 +42111,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -42216,7 +42216,7 @@ p21: : i7; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -42245,7 +42245,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -42350,7 +42350,7 @@ p21: : i7; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -42379,7 +42379,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -42488,7 +42488,7 @@ p21: : i7; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -42517,7 +42517,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -42769,7 +42769,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -42802,7 +42802,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -42907,7 +42907,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -42936,7 +42936,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -43041,7 +43041,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -43070,7 +43070,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -43175,7 +43175,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -43204,7 +43204,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -43309,7 +43309,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -43338,7 +43338,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -43452,7 +43452,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -43491,7 +43491,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -43593,7 +43593,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -43632,7 +43632,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -43734,7 +43734,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -43769,7 +43769,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -43871,7 +43871,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -43906,7 +43906,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -44008,7 +44008,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -44043,7 +44043,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -44195,7 +44195,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -44228,7 +44228,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -44333,7 +44333,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -44362,7 +44362,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -44467,7 +44467,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -44496,7 +44496,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -44601,7 +44601,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -44630,7 +44630,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -44735,7 +44735,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -44764,7 +44764,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -44966,7 +44966,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -44999,7 +44999,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -45104,7 +45104,7 @@ p21: : i9; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -45133,7 +45133,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -45238,7 +45238,7 @@ p21: : i9; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -45267,7 +45267,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -45372,7 +45372,7 @@ p21: : i9; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -45401,7 +45401,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -45506,7 +45506,7 @@ p21: : i9; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -45535,7 +45535,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -45733,7 +45733,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -45766,7 +45766,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -45867,7 +45867,7 @@ p21: : i10; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -45896,7 +45896,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -45997,7 +45997,7 @@ p21: : i10; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -46026,7 +46026,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -46127,7 +46127,7 @@ p21: : i10; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -46156,7 +46156,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -46257,7 +46257,7 @@ p21: : i10; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -46286,7 +46286,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -46484,7 +46484,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -46517,7 +46517,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -46618,7 +46618,7 @@ p21: : i11; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -46647,7 +46647,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -46748,7 +46748,7 @@ p21: : i11; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -46777,7 +46777,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -46975,7 +46975,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -47008,7 +47008,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -47109,7 +47109,7 @@ p21: : i12; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -47138,7 +47138,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -47239,7 +47239,7 @@ p21: : i12; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -47268,7 +47268,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -47506,7 +47506,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -47539,7 +47539,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -47644,7 +47644,7 @@ p21: : i13; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -47673,7 +47673,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -47778,7 +47778,7 @@ p21: : i13; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -47807,7 +47807,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -47999,7 +47999,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -48032,7 +48032,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -48137,7 +48137,7 @@ p21: : i14; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -48166,7 +48166,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -48271,7 +48271,7 @@ p21: : i14; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -48300,7 +48300,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -48471,7 +48471,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -48504,7 +48504,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -48609,7 +48609,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -48638,7 +48638,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -48743,7 +48743,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -48772,7 +48772,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -48877,7 +48877,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -48906,7 +48906,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -49011,7 +49011,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -49040,7 +49040,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -49282,7 +49282,7 @@ p21: i7; ; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -49315,7 +49315,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -49420,7 +49420,7 @@ p21: : i15; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -49449,7 +49449,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -49554,7 +49554,7 @@ p21: : i15; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -49583,7 +49583,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -49821,7 +49821,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -49854,7 +49854,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -49959,7 +49959,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -49988,7 +49988,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -50093,7 +50093,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -50122,7 +50122,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -50227,7 +50227,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -50256,7 +50256,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -50365,7 +50365,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -50394,7 +50394,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -50596,7 +50596,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -50629,7 +50629,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -50734,7 +50734,7 @@ p21: : i17; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -50763,7 +50763,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -50868,7 +50868,7 @@ p21: : i17; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -50897,7 +50897,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -51006,7 +51006,7 @@ p21: : i17; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -51035,7 +51035,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -51140,7 +51140,7 @@ p21: : i17; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -51169,7 +51169,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -51356,7 +51356,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -51477,7 +51477,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -51598,7 +51598,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -51719,7 +51719,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -51840,7 +51840,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -51973,7 +51973,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -52090,7 +52090,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -52207,7 +52207,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -52324,7 +52324,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -52445,7 +52445,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -52594,7 +52594,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -52631,7 +52631,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -52733,7 +52733,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -52762,7 +52762,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -52864,7 +52864,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -52893,7 +52893,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -53045,7 +53045,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -53078,7 +53078,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -53183,7 +53183,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -53212,7 +53212,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -53317,7 +53317,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -53346,7 +53346,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -53451,7 +53451,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -53480,7 +53480,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -53585,7 +53585,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -53614,7 +53614,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -53781,7 +53781,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -53814,7 +53814,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -53919,7 +53919,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -53948,7 +53948,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -54053,7 +54053,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -54082,7 +54082,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -54187,7 +54187,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -54216,7 +54216,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -54321,7 +54321,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -54350,7 +54350,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -54463,7 +54463,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -54496,7 +54496,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -54601,7 +54601,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -54630,7 +54630,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -54735,7 +54735,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -54764,7 +54764,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -54869,7 +54869,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -54898,7 +54898,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -55003,7 +55003,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -55032,7 +55032,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -55145,7 +55145,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -55178,7 +55178,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -55279,7 +55279,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -55308,7 +55308,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -55409,7 +55409,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -55438,7 +55438,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -55539,7 +55539,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -55572,7 +55572,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -55673,7 +55673,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -55702,7 +55702,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -55803,7 +55803,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -55832,7 +55832,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -55942,7 +55942,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -55981,7 +55981,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -56079,7 +56079,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -56114,7 +56114,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -56212,7 +56212,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -56247,7 +56247,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -56345,7 +56345,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -56380,7 +56380,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -56478,7 +56478,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -56513,7 +56513,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -56626,7 +56626,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -56659,7 +56659,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -56764,7 +56764,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -56793,7 +56793,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -56894,7 +56894,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -56923,7 +56923,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -57028,7 +57028,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -57057,7 +57057,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -57158,7 +57158,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -57187,7 +57187,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -57296,7 +57296,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -57329,7 +57329,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -57430,7 +57430,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -57459,7 +57459,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -57564,7 +57564,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -57593,7 +57593,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -57698,7 +57698,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -57727,7 +57727,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -57832,7 +57832,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -57861,7 +57861,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -58113,7 +58113,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -58146,7 +58146,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -58255,7 +58255,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -58284,7 +58284,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -58389,7 +58389,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -58418,7 +58418,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -58527,7 +58527,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -58556,7 +58556,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -58661,7 +58661,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -58690,7 +58690,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -58795,7 +58795,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -58824,7 +58824,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -58933,7 +58933,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -58962,7 +58962,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -59071,7 +59071,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -59100,7 +59100,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -59209,7 +59209,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -59238,7 +59238,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -59347,7 +59347,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -59376,7 +59376,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -59489,7 +59489,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -59522,7 +59522,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -59623,7 +59623,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -59652,7 +59652,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -59753,7 +59753,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -59782,7 +59782,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -60056,7 +60056,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -60089,7 +60089,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -60194,7 +60194,7 @@ p21: : i19; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -60223,7 +60223,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -60328,7 +60328,7 @@ p21: : i19; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -60357,7 +60357,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -60462,7 +60462,7 @@ p21: : i19; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -60491,7 +60491,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -60596,7 +60596,7 @@ p21: : i19; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -60625,7 +60625,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -60823,7 +60823,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -60856,7 +60856,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -60957,7 +60957,7 @@ p21: : i20; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -60986,7 +60986,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -61087,7 +61087,7 @@ p21: : i20; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -61116,7 +61116,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -61319,7 +61319,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -61352,7 +61352,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -61457,7 +61457,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -61486,7 +61486,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -61591,7 +61591,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -61620,7 +61620,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -61725,7 +61725,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -61754,7 +61754,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -61859,7 +61859,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -61888,7 +61888,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -62072,7 +62072,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -62109,7 +62109,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -62210,7 +62210,7 @@ p21: : i21; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -62239,7 +62239,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -62340,7 +62340,7 @@ p21: : i21; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -62369,7 +62369,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -62553,7 +62553,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -62590,7 +62590,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -62691,7 +62691,7 @@ p21: : i22; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -62720,7 +62720,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -62825,7 +62825,7 @@ p21: : i22; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -62854,7 +62854,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -62960,7 +62960,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -62997,7 +62997,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -63095,7 +63095,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -63124,7 +63124,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -63222,7 +63222,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -63251,7 +63251,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -63414,7 +63414,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -63447,7 +63447,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -63567,7 +63567,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -63596,7 +63596,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -63716,7 +63716,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -63745,7 +63745,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -63873,7 +63873,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -63910,7 +63910,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -64026,7 +64026,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -64055,7 +64055,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -64171,7 +64171,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -64200,7 +64200,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -64361,7 +64361,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -64494,7 +64494,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -64655,7 +64655,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -64788,7 +64788,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -64937,7 +64937,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -64974,7 +64974,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -65123,7 +65123,7 @@ p21: : i8; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -65160,7 +65160,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -65325,7 +65325,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -65453,7 +65453,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -65490,7 +65490,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -65606,7 +65606,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -65635,7 +65635,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -65751,7 +65751,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -65780,7 +65780,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -65904,7 +65904,7 @@ p21: : i6; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -65941,7 +65941,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -66057,7 +66057,7 @@ p21: : i6; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -66086,7 +66086,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -66202,7 +66202,7 @@ p21: : i6; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -66231,7 +66231,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -66355,7 +66355,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -66392,7 +66392,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -66508,7 +66508,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -66537,7 +66537,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -66653,7 +66653,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -66682,7 +66682,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -66806,7 +66806,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -66843,7 +66843,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -66959,7 +66959,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -66988,7 +66988,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -67104,7 +67104,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -67133,7 +67133,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -67258,7 +67258,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -67295,7 +67295,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -67408,7 +67408,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -67437,7 +67437,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -67550,7 +67550,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -67579,7 +67579,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -67707,7 +67707,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -67744,7 +67744,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -67860,7 +67860,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -67889,7 +67889,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -68005,7 +68005,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -68034,7 +68034,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -68162,7 +68162,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -68199,7 +68199,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -68315,7 +68315,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -68344,7 +68344,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -68460,7 +68460,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -68489,7 +68489,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -68609,7 +68609,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -68646,7 +68646,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -68762,7 +68762,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -68791,7 +68791,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -68907,7 +68907,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -68936,7 +68936,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -69056,7 +69056,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -69093,7 +69093,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -69209,7 +69209,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -69238,7 +69238,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -69354,7 +69354,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -69383,7 +69383,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -69503,7 +69503,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -69540,7 +69540,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -69656,7 +69656,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -69685,7 +69685,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -69801,7 +69801,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -69830,7 +69830,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -69950,7 +69950,7 @@ p21: : i19; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -69987,7 +69987,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -70103,7 +70103,7 @@ p21: : i19; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -70132,7 +70132,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -70248,7 +70248,7 @@ p21: : i19; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -70277,7 +70277,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -70397,7 +70397,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -70434,7 +70434,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -70550,7 +70550,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -70579,7 +70579,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -70695,7 +70695,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -70724,7 +70724,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -70852,7 +70852,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -70889,7 +70889,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -71005,7 +71005,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -71034,7 +71034,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -71150,7 +71150,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -71179,7 +71179,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -71303,7 +71303,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -71340,7 +71340,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -71456,7 +71456,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -71485,7 +71485,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -71601,7 +71601,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -71630,7 +71630,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -71770,7 +71770,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -71902,7 +71902,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -72034,7 +72034,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -72174,7 +72174,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -72302,7 +72302,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -72434,7 +72434,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -72582,7 +72582,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -72714,7 +72714,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -72846,7 +72846,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -73102,7 +73102,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -73139,7 +73139,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -73244,7 +73244,7 @@ p21: : i23; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -73273,7 +73273,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -73378,7 +73378,7 @@ p21: : i23; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -73407,7 +73407,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -73586,7 +73586,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -73707,7 +73707,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -73828,7 +73828,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -74011,7 +74011,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -74132,7 +74132,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -74253,7 +74253,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -74436,7 +74436,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -74557,7 +74557,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -74678,7 +74678,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -74857,7 +74857,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -74978,7 +74978,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -75099,7 +75099,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -75286,7 +75286,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -75407,7 +75407,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -75528,7 +75528,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -75665,7 +75665,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -75786,7 +75786,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -75907,7 +75907,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -76120,7 +76120,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -76317,7 +76317,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -76518,7 +76518,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -76699,7 +76699,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -76868,7 +76868,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -77037,7 +77037,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -77204,7 +77204,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -77241,7 +77241,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -77346,7 +77346,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -77375,7 +77375,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -77480,7 +77480,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -77509,7 +77509,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -77676,7 +77676,7 @@ p21: : i20; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -77709,7 +77709,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -77814,7 +77814,7 @@ p21: : i20; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -77843,7 +77843,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -77948,7 +77948,7 @@ p21: : i20; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -77977,7 +77977,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -78204,7 +78204,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -78409,7 +78409,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -78610,7 +78610,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -78707,7 +78707,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -78804,7 +78804,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -78914,7 +78914,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -78953,7 +78953,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -79051,7 +79051,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -79086,7 +79086,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -79184,7 +79184,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -79219,7 +79219,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -79317,7 +79317,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -79352,7 +79352,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -79450,7 +79450,7 @@ p21: : i18; DisplayEffect: - FrEee.Objects.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.SeekerWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -79485,7 +79485,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -79669,7 +79669,7 @@ p21: i3; ; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -79706,7 +79706,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -79807,7 +79807,7 @@ p21: : i24; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -79836,7 +79836,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -79937,7 +79937,7 @@ p21: : i24; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -79966,7 +79966,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -80079,7 +80079,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -80112,7 +80112,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -80213,7 +80213,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -80242,7 +80242,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -80343,7 +80343,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -80372,7 +80372,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -80477,7 +80477,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -80506,7 +80506,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -80611,7 +80611,7 @@ p21: : i16; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -80640,7 +80640,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -80753,7 +80753,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -80786,7 +80786,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -80887,7 +80887,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -80916,7 +80916,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -81017,7 +81017,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.BeamWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -81046,7 +81046,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -81159,7 +81159,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -81192,7 +81192,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -81293,7 +81293,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -81322,7 +81322,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -81423,7 +81423,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -81452,7 +81452,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -81609,7 +81609,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -81770,7 +81770,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -81923,7 +81923,7 @@ p21: : p16: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -82076,7 +82076,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -82182,7 +82182,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -82211,7 +82211,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -82309,7 +82309,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -82338,7 +82338,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -82436,7 +82436,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -82465,7 +82465,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -82575,7 +82575,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -82608,7 +82608,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -82706,7 +82706,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -82735,7 +82735,7 @@ p21: : p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -82833,7 +82833,7 @@ p21: : i0; DisplayEffect: - FrEee.Objects.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Combat.ProjectileWeaponDisplayEffect, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p1: Name: : @@ -84013,7 +84013,7 @@ for msg in empire.AINotes.Log: : p6: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Cost: @@ -84041,7 +84041,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -84152,7 +84152,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -84251,7 +84251,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -84346,7 +84346,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -84460,7 +84460,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -84558,7 +84558,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -84656,7 +84656,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -84770,7 +84770,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -84868,7 +84868,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -84966,7 +84966,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -85136,7 +85136,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -85290,7 +85290,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -85444,7 +85444,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -85597,7 +85597,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -85699,7 +85699,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -85801,7 +85801,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -85950,7 +85950,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -86052,7 +86052,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -86154,7 +86154,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -86272,7 +86272,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -86394,7 +86394,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -86512,7 +86512,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -86618,7 +86618,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -86724,7 +86724,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -86830,7 +86830,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -86932,7 +86932,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87034,7 +87034,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87140,7 +87140,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87242,7 +87242,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87344,7 +87344,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87454,7 +87454,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87556,7 +87556,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87662,7 +87662,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87784,7 +87784,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87890,7 +87890,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -87996,7 +87996,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -88114,7 +88114,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -88220,7 +88220,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -88326,7 +88326,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -88444,7 +88444,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -88550,7 +88550,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -88656,7 +88656,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -88778,7 +88778,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -88884,7 +88884,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -88990,7 +88990,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -89108,7 +89108,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -89214,7 +89214,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -89320,7 +89320,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -89442,7 +89442,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -89548,7 +89548,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -89654,7 +89654,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -89832,7 +89832,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -89998,7 +89998,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -90156,7 +90156,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -90330,7 +90330,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -90500,7 +90500,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -90666,7 +90666,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -90780,7 +90780,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -90882,7 +90882,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -90984,7 +90984,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -91098,7 +91098,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -91200,7 +91200,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -91302,7 +91302,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -91420,7 +91420,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -91522,7 +91522,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -91624,7 +91624,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -91738,7 +91738,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -91840,7 +91840,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -91942,7 +91942,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -92060,7 +92060,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -92166,7 +92166,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -92272,7 +92272,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -92386,7 +92386,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -92488,7 +92488,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -92590,7 +92590,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -92764,7 +92764,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -92930,7 +92930,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -93096,7 +93096,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -93246,7 +93246,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -93380,7 +93380,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -93514,7 +93514,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -93704,7 +93704,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -93874,7 +93874,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -94032,7 +94032,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -94204,7 +94204,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -94310,7 +94310,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -94416,7 +94416,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -94530,7 +94530,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -94632,7 +94632,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -94734,7 +94734,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -94856,7 +94856,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -94962,7 +94962,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -95068,7 +95068,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -95182,7 +95182,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -95284,7 +95284,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -95386,7 +95386,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -95504,7 +95504,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -95606,7 +95606,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -95708,7 +95708,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -95826,7 +95826,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -95932,7 +95932,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -96038,7 +96038,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -96212,7 +96212,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -96370,7 +96370,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -96528,7 +96528,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -96730,7 +96730,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -96832,7 +96832,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -96934,7 +96934,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -97128,7 +97128,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -97322,7 +97322,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -97516,7 +97516,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -97630,7 +97630,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c5: : p7: @@ -97888,7 +97888,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -98038,7 +98038,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -98252,7 +98252,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -98358,7 +98358,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -98464,7 +98464,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -98654,7 +98654,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -98824,7 +98824,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -98994,7 +98994,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -99112,7 +99112,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -99218,7 +99218,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -99324,7 +99324,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -99430,7 +99430,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -99532,7 +99532,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -99634,7 +99634,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -99744,7 +99744,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -99842,7 +99842,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -99940,7 +99940,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -100154,7 +100154,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -100352,7 +100352,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c4: : p7: @@ -100554,7 +100554,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -100672,7 +100672,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -100774,7 +100774,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -100876,7 +100876,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -100998,7 +100998,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -101100,7 +101100,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -101202,7 +101202,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -101320,7 +101320,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -101422,7 +101422,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -101524,7 +101524,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -101718,7 +101718,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -101888,7 +101888,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -102058,7 +102058,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -102176,7 +102176,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -102278,7 +102278,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -102380,7 +102380,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -102498,7 +102498,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -102600,7 +102600,7 @@ for msg in empire.AINotes.Log: : p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -102715,7 +102715,7 @@ for msg in empire.AINotes.Log: : All; EmpireTemplates: - System.Collections.Generic.List`1[[FrEee.Setup.EmpireTemplate, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Processes.Setup.EmpireTemplate, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p10: @@ -103070,7 +103070,7 @@ for msg in empire.AINotes.Log: ; ; WarpPointPlacementStrategy: - FrEee.Setup.WarpPointPlacementStrategies.EdgeAlignedWarpPointPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Setup.WarpPointPlacementStrategies.EdgeAlignedWarpPointPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p2: Description: : @@ -103096,7 +103096,7 @@ for msg in empire.AINotes.Log: : "Mid-Life"; StarSystemPlacementStrategy: - FrEee.Setup.StarSystemPlacementStrategies.RandomStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Setup.StarSystemPlacementStrategies.RandomStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p0: ; StarSystemTemplateChances: @@ -103105,7 +103105,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -103864,7 +103864,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -104232,7 +104232,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -104494,7 +104494,7 @@ for msg in empire.AINotes.Log: : p8: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -104557,7 +104557,7 @@ for msg in empire.AINotes.Log: : p8: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -104652,7 +104652,7 @@ for msg in empire.AINotes.Log: : p8: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -104711,7 +104711,7 @@ for msg in empire.AINotes.Log: : p8: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -104770,7 +104770,7 @@ for msg in empire.AINotes.Log: : p8: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -104829,7 +104829,7 @@ for msg in empire.AINotes.Log: : p8: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -105001,7 +105001,7 @@ for msg in empire.AINotes.Log: : p8: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -105266,7 +105266,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -105444,7 +105444,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -105596,7 +105596,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -105761,7 +105761,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -105926,7 +105926,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -106085,7 +106085,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -106192,7 +106192,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -106383,7 +106383,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c3: : p7: @@ -106501,7 +106501,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -106535,7 +106535,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -106569,7 +106569,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -106603,7 +106603,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -106637,7 +106637,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -106727,7 +106727,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -106817,7 +106817,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -106907,7 +106907,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -106997,7 +106997,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -107087,7 +107087,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -107149,7 +107149,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -107183,7 +107183,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -107217,7 +107217,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -107251,7 +107251,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -107285,7 +107285,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -107383,7 +107383,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -107473,7 +107473,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -107507,7 +107507,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -107541,7 +107541,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -107575,7 +107575,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -107609,7 +107609,7 @@ for msg in empire.AINotes.Log: : p9: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -107663,7 +107663,7 @@ for msg in empire.AINotes.Log: : "Cluster"; StarSystemPlacementStrategy: - FrEee.Setup.StarSystemPlacementStrategies.ClusteredStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Setup.StarSystemPlacementStrategies.ClusteredStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p0: ; StarSystemTemplateChances: @@ -107848,7 +107848,7 @@ for msg in empire.AINotes.Log: : "Galactic Edge"; StarSystemPlacementStrategy: - FrEee.Setup.StarSystemPlacementStrategies.DiffuseStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Setup.StarSystemPlacementStrategies.DiffuseStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p0: ; StarSystemTemplateChances: @@ -108033,7 +108033,7 @@ for msg in empire.AINotes.Log: : "Spiral Arm"; StarSystemPlacementStrategy: - FrEee.Setup.StarSystemPlacementStrategies.SpiralStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Setup.StarSystemPlacementStrategies.SpiralStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p0: ; StarSystemTemplateChances: @@ -108218,7 +108218,7 @@ for msg in empire.AINotes.Log: : "Grid"; StarSystemPlacementStrategy: - FrEee.Setup.StarSystemPlacementStrategies.GridStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Setup.StarSystemPlacementStrategies.GridStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p0: ; StarSystemTemplateChances: @@ -108403,7 +108403,7 @@ for msg in empire.AINotes.Log: : "Ancient"; StarSystemPlacementStrategy: - FrEee.Setup.StarSystemPlacementStrategies.RandomStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Setup.StarSystemPlacementStrategies.RandomStarSystemPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p0: ; StarSystemTemplateChances: @@ -108911,7 +108911,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -109032,7 +109032,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -109157,7 +109157,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -109282,7 +109282,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -109407,7 +109407,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -109500,7 +109500,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -109593,7 +109593,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -109686,7 +109686,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -109779,7 +109779,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p17: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -109908,7 +109908,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p18: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -110000,7 +110000,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p18: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -110092,7 +110092,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p18: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -110188,7 +110188,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Base, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p15: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -110378,7 +110378,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Base, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p15: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -110521,7 +110521,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Base, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p15: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -110668,7 +110668,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p18: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -110760,7 +110760,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p18: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -110852,7 +110852,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p18: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -110944,7 +110944,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Ship, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p18: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; CanUseAuxiliaryControl: @@ -111036,7 +111036,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Fighter, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p15: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -111183,7 +111183,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Fighter, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p15: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -111330,7 +111330,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Fighter, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p15: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -111473,7 +111473,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Satellite, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p12: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Code: @@ -111547,7 +111547,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Satellite, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p12: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Code: @@ -111621,7 +111621,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Satellite, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p12: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Code: @@ -111695,7 +111695,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Mine, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c5: : p7: @@ -111926,7 +111926,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Mine, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c5: : p7: @@ -112137,7 +112137,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Mine, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p11: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c5: : p7: @@ -112348,7 +112348,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Troop, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p12: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Code: @@ -112422,7 +112422,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Troop, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p12: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Code: @@ -112500,7 +112500,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Troop, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p12: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Code: @@ -112578,7 +112578,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.WeaponPlatform, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p12: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Code: @@ -112652,7 +112652,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.WeaponPlatform, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p12: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Code: @@ -112730,7 +112730,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.WeaponPlatform, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p12: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Code: @@ -112808,7 +112808,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Drone, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p14: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -112956,7 +112956,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Drone, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p14: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -113096,7 +113096,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Technology.Hull`1[[FrEee.Objects.Vehicles.Drone, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p14: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c2: : p7: @@ -113262,11 +113262,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -113345,11 +113345,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -113424,11 +113424,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -113503,11 +113503,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -113574,11 +113574,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -113645,11 +113645,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -113716,11 +113716,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -113787,11 +113787,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -113858,11 +113858,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -113929,11 +113929,11 @@ for msg in empire.AINotes.Log: : p19: AbilityModifiers: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; AbilityPercentages: - System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: d0: ; Code: @@ -114007,839 +114007,839 @@ for msg in empire.AINotes.Log: i0; : "Warp Point - Turbulence"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i0; : "Star - Unstable"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i1; : "Sector - Sight Obscuration"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i2; : "Sector - Sensor Interference"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i3; : "Sector - Shield Disruption"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i4; : "Sector - Damage"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i5; : "System - Sight Obscuration"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i6; : "System - Sensor Interference"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i7; : "System - Shield Disruption"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i8; : "System - Damage"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i9; : "Resource Generation - Minerals"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i10; : "Resource Generation - Organics"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i11; : "Resource Generation - Radioactives"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i12; : "Point Generation - Research"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i13; : "Point Generation - Intelligence"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i14; : "Spaceport"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i15; : "Palace"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i16; : "Supply Generation"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i17; : "Supply Generation - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i18; : "Planet - Change Minerals Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i19; : "Planet - Change Organics Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i20; : "Planet - Change Radioactives Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i21; : "Sector - Change Minerals Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i22; : "Sector - Change Organics Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i23; : "Sector - Change Radioactives Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i24; : "System - Change Minerals Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i25; : "System - Change Organics Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i26; : "System - Change Radioactives Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i27; : "Empire - Change Minerals Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i28; : "Empire - Change Organics Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i29; : "Empire - Change Radioactives Value"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i30; : "Planet - Change Conditions"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i31; : "Planet - Change Population Happiness"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i32; : "Planet - Change Ground Defense"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i33; : "System - Change Ground Defense"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i34; : "Empire - Change Ground Defense"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i35; : "Planet - Shield Generation"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i36; : "Shield Generation"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i37; : "Phased Shield Generation"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i38; : "Component Repair"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i39; : "Component Repair - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i40; : "Cargo Storage"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i41; : "Drop Troops"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i42; : "Launch/Recover Fighters"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i43; : "Lay Mines"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i44; : "Multiplex Tracking"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i45; : "Combat To Hit Offense Plus"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i46; : "Combat To Hit Defense Plus"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i47; : "Mine Sweeping"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i48; : "Medical Bay"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i49; : "Movement Bonus"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i50; : "Emissive Armor"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i51; : "Shield Regeneration"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i52; : "Master Computer"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i53; : "Cloak Level"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i54; : "Sensor Level"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i55; : "Emergency Resupply"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i56; : "Emergency Energy"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i57; : "Long Range Scanner"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i58; : "Open Warp Point Distance"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i59; : "Create Planet Size"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i60; : "Destroy Planet Size"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i61; : "Boarding Attack"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i62; : "Boarding Defense"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i63; : "Standard Ship Movement"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i64; : "Ship Bridge"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i65; : "Ship Auxiliary Control"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i66; : "Ship Life Support"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i67; : "Ship Crew Quarters"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i68; : "Scanner Jammer"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i69; : "Quantum Reactor"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i70; : "Supply Storage"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i71; : "Space Yard"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i72; : "Resource Storage - Mineral"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i73; : "Resource Storage - Organics"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i74; : "Resource Storage - Radioactives"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i75; : "Resource Gen Modifier Planet - Minerals"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i76; : "Resource Gen Modifier Planet - Organics"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i77; : "Resource Gen Modifier Planet - Radioactives"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i78; : "Resource Gen Modifier System - Minerals"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i79; : "Resource Gen Modifier System - Organics"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i80; : "Resource Gen Modifier System - Radioactives"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i81; : "Resource Gen Modifier Empire - Minerals"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i82; : "Resource Gen Modifier Empire - Organics"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i83; : "Resource Gen Modifier Empire - Radioactives"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i84; : "Planet Point Generation Modifier - Research"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i85; : "Planet Point Generation Modifier - Intelligence"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i86; : "System Point Generation Modifier - Research"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i87; : "System Point Generation Modifier - Intelligence"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i88; : "Empire Point Generation Modifier - Research"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i89; : "Empire Point Generation Modifier - Intelligence"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i90; : "Combat Modifier - Sector"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i91; : "Combat Modifier - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i92; : "Combat Modifier - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i93; : "Damage Modifier - Sector"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i94; : "Damage Modifier - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i95; : "Damage Modifier - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i96; : "Planet Value Change - Sector"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i97; : "Planet Value Change - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i98; : "Planet Value Change - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i99; : "Planet Conditions Change - Sector"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i100; : "Planet Conditions Change - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i101; : "Planet Conditions Change - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i102; : "Change Bad Event Chance - Sector"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i103; : "Change Bad Event Chance - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i104; : "Change Bad Event Chance - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i105; : "Change Bad Intelligence Chance - Sector"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i106; : "Change Bad Intelligence Chance - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i107; : "Change Bad Intelligence Chance - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i108; : "Change Population Happiness - Sector"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i109; : "Change Population Happiness - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i110; : "Change Population Happiness - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i111; : "Ship Training"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i112; : "Fleet Training"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i113; : "Ship Training - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i114; : "Fleet Training - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i115; : "Ship Training - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i116; : "Fleet Training - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i117; : "Modify Reproduction - Planet"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i118; : "Modify Reproduction - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i119; : "Modify Reproduction - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i120; : "Change Population - Planet"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i121; : "Change Population - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i122; : "Change Population - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i123; : "Plague Prevention - Planet"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i124; : "Plague Prevention - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i125; : "Plague Prevention - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i126; : "Resource Conversion"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i127; : "Resource Reclamation"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i128; : "Resource Reclamation - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i129; : "Resource Reclamation - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i130; : "Close Warp Point"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i131; : "Destroy Star"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i132; : "Create Star"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i133; : "Destroy Storm"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i134; : "Create Storm"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i135; : "Self-Destruct"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i136; : "Colonize Planet - Rock"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i137; : "Colonize Planet - Ice"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i138; : "Colonize Planet - Gas"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i139; : "Point-Defense"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i140; : "Armor"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i141; : "Launch/Recover Satellites"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i142; : "Launch Drones"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i143; : "Remote Resource Generation - Minerals"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i144; : "Remote Resource Generation - Organics"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i145; : "Remote Resource Generation - Radioactives"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i146; : "Armor Regeneration"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i147; : "Shield Generation From Damage"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i148; : "System - Movement Towards Center"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i149; : "System - Movement Random"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i150; : "System - Destructive Center"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i151; : "Destroy Nebulae"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i152; : "Create Nebulae"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i153; : "Destroy Black Hole"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i154; : "Create Black Hole"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i155; : "Stop Planet Destroyer"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i156; : "Stop Star Destroyer"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i157; : "Stop Nebulae Creator"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i158; : "Stop Black Hole Creator"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i159; : "Stop Open Warp Point"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i160; : "Stop Close Warp Point"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i161; : "Component Destroyed On Use"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i162; : "Space Object Destroyed On Use"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i163; : "Ancient Ruins"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i164; : "Ancient Ruins Unique"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i165; : "Combat Best Experience"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i166; : "Combat Movement"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i167; : "Supply Generation Per Turn"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i168; : "Solar Supply Generation"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i169; : "Extra Movement Generation"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i170; : "Planet - Change Atmosphere"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i171; : "Weapons Always Hit"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i172; : "Create Constructed Planet"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i173; : "Create Constructed Planet From Planet"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i174; : "Create Constructed Planet From Storm"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i175; : "Create Constructed Planet From Warp Point"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i176; : "Create Constructed Planet From Asteroids"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i177; : "Create Constructed Planet From Space"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i178; : "Constructed Planet Requirements"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i179; : "Modified Maintenance Cost"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i180; : "Long Range Scanner - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i181; : "Solar Resource Generation - Minerals"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i182; : "Solar Resource Generation - Organics"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i183; : "Solar Resource Generation - Radioactives"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i184; : "Reduced Maintenance Cost - Sector"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i185; : "Reduced Maintenance Cost - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i186; : "Reduced Maintenance Cost - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i187; : "Shield Modifier - Sector"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i188; : "Shield Modifier - System"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i189; : "Shield Modifier - Empire"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i190; : "Combat To Hit Offense Minus"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i191; : "Combat To Hit Defense Minus"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i192; : "Generate Points Minerals"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i193; : "Generate Points Organics"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i194; : "Generate Points Radioactives"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i195; : "Generate Points Research"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i196; : "Generate Points Intelligence"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i197; : "Supply Cost"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i198; : "No Plagues"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i199; : "Luck"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i200; : "No Spaceports"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i201; : "Vehicle Speed"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i202; : "Galaxy Seen"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i203; : "Planet Storage Space"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i204; : "Planetary SY Rate"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i205; : "Tech Area"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i206; : "Population Emotionless"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i207; : "Breakthrough Chance"; - FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i208; : "Tiny"; @@ -115350,7 +115350,7 @@ for msg in empire.AINotes.Log: : "p0001"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115415,7 +115415,7 @@ for msg in empire.AINotes.Log: : "p0002"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115476,7 +115476,7 @@ for msg in empire.AINotes.Log: : "p0003"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115537,7 +115537,7 @@ for msg in empire.AINotes.Log: : "p0004"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115598,7 +115598,7 @@ for msg in empire.AINotes.Log: : "p0005"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115659,7 +115659,7 @@ for msg in empire.AINotes.Log: : "p0006"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115724,7 +115724,7 @@ for msg in empire.AINotes.Log: : "p0007"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115785,7 +115785,7 @@ for msg in empire.AINotes.Log: : "p0008"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115846,7 +115846,7 @@ for msg in empire.AINotes.Log: : "p0009"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115907,7 +115907,7 @@ for msg in empire.AINotes.Log: : "p0010"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -115968,7 +115968,7 @@ for msg in empire.AINotes.Log: : "p0011"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116033,7 +116033,7 @@ for msg in empire.AINotes.Log: : "p0012"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116094,7 +116094,7 @@ for msg in empire.AINotes.Log: : "p0013"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116155,7 +116155,7 @@ for msg in empire.AINotes.Log: : "p0014"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116216,7 +116216,7 @@ for msg in empire.AINotes.Log: : "p0015"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116277,7 +116277,7 @@ for msg in empire.AINotes.Log: : "p0016"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116342,7 +116342,7 @@ for msg in empire.AINotes.Log: : "p0017"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116403,7 +116403,7 @@ for msg in empire.AINotes.Log: : "p0018"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116464,7 +116464,7 @@ for msg in empire.AINotes.Log: : "p0019"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116525,7 +116525,7 @@ for msg in empire.AINotes.Log: : "p0020"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116586,7 +116586,7 @@ for msg in empire.AINotes.Log: : "p0021"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116651,7 +116651,7 @@ for msg in empire.AINotes.Log: : "p0022"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116712,7 +116712,7 @@ for msg in empire.AINotes.Log: : "p0023"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116773,7 +116773,7 @@ for msg in empire.AINotes.Log: : "p0024"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116834,7 +116834,7 @@ for msg in empire.AINotes.Log: : "p0025"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116895,7 +116895,7 @@ for msg in empire.AINotes.Log: : "p0026"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -116956,7 +116956,7 @@ for msg in empire.AINotes.Log: : "p0027"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117017,7 +117017,7 @@ for msg in empire.AINotes.Log: : "p0028"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117078,7 +117078,7 @@ for msg in empire.AINotes.Log: : "p0029"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117139,7 +117139,7 @@ for msg in empire.AINotes.Log: : "p0030"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117200,7 +117200,7 @@ for msg in empire.AINotes.Log: : "p0031"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117261,7 +117261,7 @@ for msg in empire.AINotes.Log: : "p0032"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117322,7 +117322,7 @@ for msg in empire.AINotes.Log: : "p0033"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117383,7 +117383,7 @@ for msg in empire.AINotes.Log: : "p0034"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117444,7 +117444,7 @@ for msg in empire.AINotes.Log: : "p0035"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117505,7 +117505,7 @@ for msg in empire.AINotes.Log: : "p0036"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117566,7 +117566,7 @@ for msg in empire.AINotes.Log: : "p0037"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117627,7 +117627,7 @@ for msg in empire.AINotes.Log: : "p0038"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117688,7 +117688,7 @@ for msg in empire.AINotes.Log: : "p0039"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117749,7 +117749,7 @@ for msg in empire.AINotes.Log: : "p0040"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117810,7 +117810,7 @@ for msg in empire.AINotes.Log: : "p0041"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117871,7 +117871,7 @@ for msg in empire.AINotes.Log: : "p0042"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117932,7 +117932,7 @@ for msg in empire.AINotes.Log: : "p0043"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -117993,7 +117993,7 @@ for msg in empire.AINotes.Log: : "p0044"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118054,7 +118054,7 @@ for msg in empire.AINotes.Log: : "p0045"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118115,7 +118115,7 @@ for msg in empire.AINotes.Log: : "p0046"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118176,7 +118176,7 @@ for msg in empire.AINotes.Log: : "p0047"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118237,7 +118237,7 @@ for msg in empire.AINotes.Log: : "p0048"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118298,7 +118298,7 @@ for msg in empire.AINotes.Log: : "p0049"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118359,7 +118359,7 @@ for msg in empire.AINotes.Log: : "p0050"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118420,7 +118420,7 @@ for msg in empire.AINotes.Log: : "p0051"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118481,7 +118481,7 @@ for msg in empire.AINotes.Log: : "p0052"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118542,7 +118542,7 @@ for msg in empire.AINotes.Log: : "p0053"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118603,7 +118603,7 @@ for msg in empire.AINotes.Log: : "p0054"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118664,7 +118664,7 @@ for msg in empire.AINotes.Log: : "p0055"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118725,7 +118725,7 @@ for msg in empire.AINotes.Log: : "p0056"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118786,7 +118786,7 @@ for msg in empire.AINotes.Log: : "p0057"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118847,7 +118847,7 @@ for msg in empire.AINotes.Log: : "p0058"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118908,7 +118908,7 @@ for msg in empire.AINotes.Log: : "p0059"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -118969,7 +118969,7 @@ for msg in empire.AINotes.Log: : "p0060"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119030,7 +119030,7 @@ for msg in empire.AINotes.Log: : "p0061"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119091,7 +119091,7 @@ for msg in empire.AINotes.Log: : "p0062"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119152,7 +119152,7 @@ for msg in empire.AINotes.Log: : "p0063"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119213,7 +119213,7 @@ for msg in empire.AINotes.Log: : "p0064"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119274,7 +119274,7 @@ for msg in empire.AINotes.Log: : "p0065"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119335,7 +119335,7 @@ for msg in empire.AINotes.Log: : "p0066"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119396,7 +119396,7 @@ for msg in empire.AINotes.Log: : "p0067"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119457,7 +119457,7 @@ for msg in empire.AINotes.Log: : "p0068"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119518,7 +119518,7 @@ for msg in empire.AINotes.Log: : "p0069"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119579,7 +119579,7 @@ for msg in empire.AINotes.Log: : "p0070"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119640,7 +119640,7 @@ for msg in empire.AINotes.Log: : "p0071"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119701,7 +119701,7 @@ for msg in empire.AINotes.Log: : "p0072"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119762,7 +119762,7 @@ for msg in empire.AINotes.Log: : "p0073"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119823,7 +119823,7 @@ for msg in empire.AINotes.Log: : "p0074"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119884,7 +119884,7 @@ for msg in empire.AINotes.Log: : "p0075"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -119945,7 +119945,7 @@ for msg in empire.AINotes.Log: : "p0076"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120006,7 +120006,7 @@ for msg in empire.AINotes.Log: : "p0077"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120067,7 +120067,7 @@ for msg in empire.AINotes.Log: : "p0078"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120128,7 +120128,7 @@ for msg in empire.AINotes.Log: : "p0079"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120189,7 +120189,7 @@ for msg in empire.AINotes.Log: : "p0080"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120250,7 +120250,7 @@ for msg in empire.AINotes.Log: : "p0081"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120311,7 +120311,7 @@ for msg in empire.AINotes.Log: : "p0082"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120372,7 +120372,7 @@ for msg in empire.AINotes.Log: : "p0083"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120433,7 +120433,7 @@ for msg in empire.AINotes.Log: : "p0084"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120494,7 +120494,7 @@ for msg in empire.AINotes.Log: : "p0085"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120555,7 +120555,7 @@ for msg in empire.AINotes.Log: : "p0086"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120616,7 +120616,7 @@ for msg in empire.AINotes.Log: : "p0087"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120677,7 +120677,7 @@ for msg in empire.AINotes.Log: : "p0088"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120738,7 +120738,7 @@ for msg in empire.AINotes.Log: : "p0089"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120799,7 +120799,7 @@ for msg in empire.AINotes.Log: : "p0090"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120860,7 +120860,7 @@ for msg in empire.AINotes.Log: : "p0091"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120921,7 +120921,7 @@ for msg in empire.AINotes.Log: : "p0092"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -120982,7 +120982,7 @@ for msg in empire.AINotes.Log: : "p0093"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121043,7 +121043,7 @@ for msg in empire.AINotes.Log: : "p0094"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121104,7 +121104,7 @@ for msg in empire.AINotes.Log: : "p0095"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121165,7 +121165,7 @@ for msg in empire.AINotes.Log: : "p0096"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121226,7 +121226,7 @@ for msg in empire.AINotes.Log: : "p0097"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121287,7 +121287,7 @@ for msg in empire.AINotes.Log: : "p0098"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121348,7 +121348,7 @@ for msg in empire.AINotes.Log: : "p0099"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121409,7 +121409,7 @@ for msg in empire.AINotes.Log: : "p0100"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121470,7 +121470,7 @@ for msg in empire.AINotes.Log: : "p0101"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121531,7 +121531,7 @@ for msg in empire.AINotes.Log: : "p0102"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121592,7 +121592,7 @@ for msg in empire.AINotes.Log: : "p0103"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121653,7 +121653,7 @@ for msg in empire.AINotes.Log: : "p0104"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121714,7 +121714,7 @@ for msg in empire.AINotes.Log: : "p0105"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121775,7 +121775,7 @@ for msg in empire.AINotes.Log: : "p0106"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121836,7 +121836,7 @@ for msg in empire.AINotes.Log: : "p0107"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121897,7 +121897,7 @@ for msg in empire.AINotes.Log: : "p0108"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -121958,7 +121958,7 @@ for msg in empire.AINotes.Log: : "p0109"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122019,7 +122019,7 @@ for msg in empire.AINotes.Log: : "p0110"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122080,7 +122080,7 @@ for msg in empire.AINotes.Log: : "p0111"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122141,7 +122141,7 @@ for msg in empire.AINotes.Log: : "p0112"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122202,7 +122202,7 @@ for msg in empire.AINotes.Log: : "p0113"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122263,7 +122263,7 @@ for msg in empire.AINotes.Log: : "p0114"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122324,7 +122324,7 @@ for msg in empire.AINotes.Log: : "p0115"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122385,7 +122385,7 @@ for msg in empire.AINotes.Log: : "p0116"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122446,7 +122446,7 @@ for msg in empire.AINotes.Log: : "p0117"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122507,7 +122507,7 @@ for msg in empire.AINotes.Log: : "p0118"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122568,7 +122568,7 @@ for msg in empire.AINotes.Log: : "p0119"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122629,7 +122629,7 @@ for msg in empire.AINotes.Log: : "p0120"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122690,7 +122690,7 @@ for msg in empire.AINotes.Log: : "p0121"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122751,7 +122751,7 @@ for msg in empire.AINotes.Log: : "p0122"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122812,7 +122812,7 @@ for msg in empire.AINotes.Log: : "p0123"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122873,7 +122873,7 @@ for msg in empire.AINotes.Log: : "p0124"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122934,7 +122934,7 @@ for msg in empire.AINotes.Log: : "p0125"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -122995,7 +122995,7 @@ for msg in empire.AINotes.Log: : "p0126"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123056,7 +123056,7 @@ for msg in empire.AINotes.Log: : "p0127"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123117,7 +123117,7 @@ for msg in empire.AINotes.Log: : "p0128"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123178,7 +123178,7 @@ for msg in empire.AINotes.Log: : "p0129"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123239,7 +123239,7 @@ for msg in empire.AINotes.Log: : "p0130"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123300,7 +123300,7 @@ for msg in empire.AINotes.Log: : "p0131"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123361,7 +123361,7 @@ for msg in empire.AINotes.Log: : "p0132"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123422,7 +123422,7 @@ for msg in empire.AINotes.Log: : "p0133"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123483,7 +123483,7 @@ for msg in empire.AINotes.Log: : "p0134"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123544,7 +123544,7 @@ for msg in empire.AINotes.Log: : "p0135"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123605,7 +123605,7 @@ for msg in empire.AINotes.Log: : "p0136"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123666,7 +123666,7 @@ for msg in empire.AINotes.Log: : "p0137"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123727,7 +123727,7 @@ for msg in empire.AINotes.Log: : "p0138"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123788,7 +123788,7 @@ for msg in empire.AINotes.Log: : "p0139"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123849,7 +123849,7 @@ for msg in empire.AINotes.Log: : "p0140"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123910,7 +123910,7 @@ for msg in empire.AINotes.Log: : "p0141"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -123971,7 +123971,7 @@ for msg in empire.AINotes.Log: : "p0142"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124032,7 +124032,7 @@ for msg in empire.AINotes.Log: : "p0143"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124093,7 +124093,7 @@ for msg in empire.AINotes.Log: : "p0144"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124154,7 +124154,7 @@ for msg in empire.AINotes.Log: : "p0145"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124215,7 +124215,7 @@ for msg in empire.AINotes.Log: : "p0146"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124276,7 +124276,7 @@ for msg in empire.AINotes.Log: : "p0147"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124337,7 +124337,7 @@ for msg in empire.AINotes.Log: : "p0148"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124398,7 +124398,7 @@ for msg in empire.AINotes.Log: : "p0149"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124459,7 +124459,7 @@ for msg in empire.AINotes.Log: : "p0150"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124520,7 +124520,7 @@ for msg in empire.AINotes.Log: : "p0151"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124581,7 +124581,7 @@ for msg in empire.AINotes.Log: : "p0152"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124642,7 +124642,7 @@ for msg in empire.AINotes.Log: : "p0153"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124703,7 +124703,7 @@ for msg in empire.AINotes.Log: : "p0154"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124764,7 +124764,7 @@ for msg in empire.AINotes.Log: : "p0155"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124825,7 +124825,7 @@ for msg in empire.AINotes.Log: : "p0156"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124886,7 +124886,7 @@ for msg in empire.AINotes.Log: : "p0157"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -124947,7 +124947,7 @@ for msg in empire.AINotes.Log: : "p0158"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125008,7 +125008,7 @@ for msg in empire.AINotes.Log: : "p0159"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125069,7 +125069,7 @@ for msg in empire.AINotes.Log: : "p0160"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125130,7 +125130,7 @@ for msg in empire.AINotes.Log: : "p0161"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125191,7 +125191,7 @@ for msg in empire.AINotes.Log: : "p0162"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125252,7 +125252,7 @@ for msg in empire.AINotes.Log: : "p0163"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125313,7 +125313,7 @@ for msg in empire.AINotes.Log: : "p0164"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125374,7 +125374,7 @@ for msg in empire.AINotes.Log: : "p0165"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125435,7 +125435,7 @@ for msg in empire.AINotes.Log: : "p0166"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125496,7 +125496,7 @@ for msg in empire.AINotes.Log: : "p0167"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125557,7 +125557,7 @@ for msg in empire.AINotes.Log: : "p0168"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125618,7 +125618,7 @@ for msg in empire.AINotes.Log: : "p0169"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125679,7 +125679,7 @@ for msg in empire.AINotes.Log: : "p0170"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125740,7 +125740,7 @@ for msg in empire.AINotes.Log: : "p0171"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125801,7 +125801,7 @@ for msg in empire.AINotes.Log: : "p0172"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125862,7 +125862,7 @@ for msg in empire.AINotes.Log: : "p0173"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125923,7 +125923,7 @@ for msg in empire.AINotes.Log: : "p0174"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -125984,7 +125984,7 @@ for msg in empire.AINotes.Log: : "p0175"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126045,7 +126045,7 @@ for msg in empire.AINotes.Log: : "p0176"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126106,7 +126106,7 @@ for msg in empire.AINotes.Log: : "p0177"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126167,7 +126167,7 @@ for msg in empire.AINotes.Log: : "p0178"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126228,7 +126228,7 @@ for msg in empire.AINotes.Log: : "p0179"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126289,7 +126289,7 @@ for msg in empire.AINotes.Log: : "p0180"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126350,7 +126350,7 @@ for msg in empire.AINotes.Log: : "p0181"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126411,7 +126411,7 @@ for msg in empire.AINotes.Log: : "p0182"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126472,7 +126472,7 @@ for msg in empire.AINotes.Log: : "p0183"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126533,7 +126533,7 @@ for msg in empire.AINotes.Log: : "p0184"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126594,7 +126594,7 @@ for msg in empire.AINotes.Log: : "p0185"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126655,7 +126655,7 @@ for msg in empire.AINotes.Log: : "p0186"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126716,7 +126716,7 @@ for msg in empire.AINotes.Log: : "p0187"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126777,7 +126777,7 @@ for msg in empire.AINotes.Log: : "p0188"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126838,7 +126838,7 @@ for msg in empire.AINotes.Log: : "p0189"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126899,7 +126899,7 @@ for msg in empire.AINotes.Log: : "p0190"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -126960,7 +126960,7 @@ for msg in empire.AINotes.Log: : "p0191"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127021,7 +127021,7 @@ for msg in empire.AINotes.Log: : "p0192"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127082,7 +127082,7 @@ for msg in empire.AINotes.Log: : "p0193"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127143,7 +127143,7 @@ for msg in empire.AINotes.Log: : "p0194"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127204,7 +127204,7 @@ for msg in empire.AINotes.Log: : "p0195"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127265,7 +127265,7 @@ for msg in empire.AINotes.Log: : "p0196"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127326,7 +127326,7 @@ for msg in empire.AINotes.Log: : "p0197"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127387,7 +127387,7 @@ for msg in empire.AINotes.Log: : "p0198"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127448,7 +127448,7 @@ for msg in empire.AINotes.Log: : "p0199"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127509,7 +127509,7 @@ for msg in empire.AINotes.Log: : "p0200"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127570,7 +127570,7 @@ for msg in empire.AINotes.Log: : "p0201"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127631,7 +127631,7 @@ for msg in empire.AINotes.Log: : "p0202"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127692,7 +127692,7 @@ for msg in empire.AINotes.Log: : "p0203"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127753,7 +127753,7 @@ for msg in empire.AINotes.Log: : "p0204"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127814,7 +127814,7 @@ for msg in empire.AINotes.Log: : "p0205"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127875,7 +127875,7 @@ for msg in empire.AINotes.Log: : "p0206"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127936,7 +127936,7 @@ for msg in empire.AINotes.Log: : "p0207"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -127997,7 +127997,7 @@ for msg in empire.AINotes.Log: : "p0208"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128058,7 +128058,7 @@ for msg in empire.AINotes.Log: : "p0209"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128119,7 +128119,7 @@ for msg in empire.AINotes.Log: : "p0210"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128180,7 +128180,7 @@ for msg in empire.AINotes.Log: : "p0211"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128241,7 +128241,7 @@ for msg in empire.AINotes.Log: : "p0212"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128302,7 +128302,7 @@ for msg in empire.AINotes.Log: : "p0213"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128363,7 +128363,7 @@ for msg in empire.AINotes.Log: : "p0214"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128424,7 +128424,7 @@ for msg in empire.AINotes.Log: : "p0215"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128485,7 +128485,7 @@ for msg in empire.AINotes.Log: : "p0216"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128546,7 +128546,7 @@ for msg in empire.AINotes.Log: : "p0217"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128607,7 +128607,7 @@ for msg in empire.AINotes.Log: : "p0218"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128668,7 +128668,7 @@ for msg in empire.AINotes.Log: : "p0219"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128729,7 +128729,7 @@ for msg in empire.AINotes.Log: : "p0220"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128790,7 +128790,7 @@ for msg in empire.AINotes.Log: : "p0221"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128851,7 +128851,7 @@ for msg in empire.AINotes.Log: : "p0222"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128912,7 +128912,7 @@ for msg in empire.AINotes.Log: : "p0223"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -128973,7 +128973,7 @@ for msg in empire.AINotes.Log: : "p0224"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129034,7 +129034,7 @@ for msg in empire.AINotes.Log: : "p0225"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129095,7 +129095,7 @@ for msg in empire.AINotes.Log: : "p0226"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129149,7 +129149,7 @@ for msg in empire.AINotes.Log: : "p0227"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129203,7 +129203,7 @@ for msg in empire.AINotes.Log: : "p0228"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129257,7 +129257,7 @@ for msg in empire.AINotes.Log: : "p0229"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129311,7 +129311,7 @@ for msg in empire.AINotes.Log: : "p0230"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129365,7 +129365,7 @@ for msg in empire.AINotes.Log: : "p0231"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129419,7 +129419,7 @@ for msg in empire.AINotes.Log: : "p0232"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129473,7 +129473,7 @@ for msg in empire.AINotes.Log: : "p0233"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129527,7 +129527,7 @@ for msg in empire.AINotes.Log: : "p0234"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129581,7 +129581,7 @@ for msg in empire.AINotes.Log: : "p0235"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129635,7 +129635,7 @@ for msg in empire.AINotes.Log: : "p0236"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129689,7 +129689,7 @@ for msg in empire.AINotes.Log: : "p0237"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129743,7 +129743,7 @@ for msg in empire.AINotes.Log: : "p0238"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129797,7 +129797,7 @@ for msg in empire.AINotes.Log: : "p0239"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129851,7 +129851,7 @@ for msg in empire.AINotes.Log: : "p0240"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129905,7 +129905,7 @@ for msg in empire.AINotes.Log: : "p0241"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -129959,7 +129959,7 @@ for msg in empire.AINotes.Log: : "p0242"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130013,7 +130013,7 @@ for msg in empire.AINotes.Log: : "p0243"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130067,7 +130067,7 @@ for msg in empire.AINotes.Log: : "p0244"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130121,7 +130121,7 @@ for msg in empire.AINotes.Log: : "p0245"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130175,7 +130175,7 @@ for msg in empire.AINotes.Log: : "p0246"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130229,7 +130229,7 @@ for msg in empire.AINotes.Log: : "p0247"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130283,7 +130283,7 @@ for msg in empire.AINotes.Log: : "p0248"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130337,7 +130337,7 @@ for msg in empire.AINotes.Log: : "p0249"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130391,7 +130391,7 @@ for msg in empire.AINotes.Log: : "p0250"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130445,7 +130445,7 @@ for msg in empire.AINotes.Log: : "p0251"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130490,7 +130490,7 @@ for msg in empire.AINotes.Log: : "p0252"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130535,7 +130535,7 @@ for msg in empire.AINotes.Log: : "p0253"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130580,7 +130580,7 @@ for msg in empire.AINotes.Log: : "p0254"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130625,7 +130625,7 @@ for msg in empire.AINotes.Log: : "p0255"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130670,7 +130670,7 @@ for msg in empire.AINotes.Log: : "p0256"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130715,7 +130715,7 @@ for msg in empire.AINotes.Log: : "p0257"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130760,7 +130760,7 @@ for msg in empire.AINotes.Log: : "p0258"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130805,7 +130805,7 @@ for msg in empire.AINotes.Log: : "p0259"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130850,7 +130850,7 @@ for msg in empire.AINotes.Log: : "p0260"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130895,7 +130895,7 @@ for msg in empire.AINotes.Log: : "p0261"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -130940,7 +130940,7 @@ for msg in empire.AINotes.Log: : "p0262"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : i564; @@ -130987,7 +130987,7 @@ for msg in empire.AINotes.Log: : "p0263"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131032,7 +131032,7 @@ for msg in empire.AINotes.Log: : "p0264"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131077,7 +131077,7 @@ for msg in empire.AINotes.Log: : "p0265"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131122,7 +131122,7 @@ for msg in empire.AINotes.Log: : "p0266"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131167,7 +131167,7 @@ for msg in empire.AINotes.Log: : "p0267"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131212,7 +131212,7 @@ for msg in empire.AINotes.Log: : "p0268"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131257,7 +131257,7 @@ for msg in empire.AINotes.Log: : "p0269"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131302,7 +131302,7 @@ for msg in empire.AINotes.Log: : "p0270"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131347,7 +131347,7 @@ for msg in empire.AINotes.Log: : "p0271"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131392,7 +131392,7 @@ for msg in empire.AINotes.Log: : "p0272"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131437,7 +131437,7 @@ for msg in empire.AINotes.Log: : "p0273"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131482,7 +131482,7 @@ for msg in empire.AINotes.Log: : "p0274"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131527,7 +131527,7 @@ for msg in empire.AINotes.Log: : "p0275"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131572,7 +131572,7 @@ for msg in empire.AINotes.Log: : "p0276"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131630,7 +131630,7 @@ for msg in empire.AINotes.Log: : "p0277"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131688,7 +131688,7 @@ for msg in empire.AINotes.Log: : "p0278"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131746,7 +131746,7 @@ for msg in empire.AINotes.Log: : "p0279"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131804,7 +131804,7 @@ for msg in empire.AINotes.Log: : "p0280"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131862,7 +131862,7 @@ for msg in empire.AINotes.Log: : "p0281"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131920,7 +131920,7 @@ for msg in empire.AINotes.Log: : "p0282"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -131978,7 +131978,7 @@ for msg in empire.AINotes.Log: : "p0283"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132036,7 +132036,7 @@ for msg in empire.AINotes.Log: : "p0284"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132094,7 +132094,7 @@ for msg in empire.AINotes.Log: : "p0285"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132152,7 +132152,7 @@ for msg in empire.AINotes.Log: : "p0286"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132210,7 +132210,7 @@ for msg in empire.AINotes.Log: : "p0287"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132268,7 +132268,7 @@ for msg in empire.AINotes.Log: : "p0288"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132326,7 +132326,7 @@ for msg in empire.AINotes.Log: : "p0289"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132384,7 +132384,7 @@ for msg in empire.AINotes.Log: : "p0290"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132442,7 +132442,7 @@ for msg in empire.AINotes.Log: : "p0291"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132500,7 +132500,7 @@ for msg in empire.AINotes.Log: : "p0292"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132558,7 +132558,7 @@ for msg in empire.AINotes.Log: : "p0293"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132616,7 +132616,7 @@ for msg in empire.AINotes.Log: : "p0294"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132674,7 +132674,7 @@ for msg in empire.AINotes.Log: : "p0295"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132732,7 +132732,7 @@ for msg in empire.AINotes.Log: : "p0296"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132782,7 +132782,7 @@ for msg in empire.AINotes.Log: : "p0297"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132832,7 +132832,7 @@ for msg in empire.AINotes.Log: : "p0298"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132882,7 +132882,7 @@ for msg in empire.AINotes.Log: : "p0299"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132932,7 +132932,7 @@ for msg in empire.AINotes.Log: : "p0300"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -132982,7 +132982,7 @@ for msg in empire.AINotes.Log: : "p0241"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133036,7 +133036,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133101,7 +133101,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133162,7 +133162,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133223,7 +133223,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133284,7 +133284,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133345,7 +133345,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133406,7 +133406,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133467,7 +133467,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133528,7 +133528,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133589,7 +133589,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133650,7 +133650,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133711,7 +133711,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133772,7 +133772,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133833,7 +133833,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133894,7 +133894,7 @@ for msg in empire.AINotes.Log: : "p0301"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -133955,7 +133955,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134020,7 +134020,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134081,7 +134081,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134142,7 +134142,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134203,7 +134203,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134264,7 +134264,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134325,7 +134325,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134386,7 +134386,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134447,7 +134447,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134508,7 +134508,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134569,7 +134569,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134630,7 +134630,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134691,7 +134691,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134752,7 +134752,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134813,7 +134813,7 @@ for msg in empire.AINotes.Log: : "p0302"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; StellarSize: @@ -134860,7 +134860,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -134928,7 +134928,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -134992,7 +134992,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135056,7 +135056,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135120,7 +135120,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135184,7 +135184,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135248,7 +135248,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135312,7 +135312,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135376,7 +135376,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135440,7 +135440,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135500,7 +135500,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135560,7 +135560,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135620,7 +135620,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -135680,7 +135680,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Civilization.Trait, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p7: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c1: : p7: @@ -141970,7 +141970,7 @@ for msg in empire.AINotes.Log: FrEee.Objects.Space.StarSystem, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: p10: Abilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; BackgroundImagePath: @@ -142141,7 +142141,7 @@ for msg in empire.AINotes.Log: : "p0055"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i767; StellarSize: : @@ -143547,7 +143547,7 @@ for msg in empire.AINotes.Log: : "p0227"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i939; StellarSize: : @@ -143603,7 +143603,7 @@ for msg in empire.AINotes.Log: : "p0169"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i881; StellarSize: : @@ -143685,7 +143685,7 @@ for msg in empire.AINotes.Log: : "p0205"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i917; StellarSize: : @@ -143770,7 +143770,7 @@ for msg in empire.AINotes.Log: : "p0055"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i767; StellarSize: : @@ -144305,7 +144305,7 @@ for msg in empire.AINotes.Log: : "p0097"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i809; StellarSize: : @@ -144390,7 +144390,7 @@ for msg in empire.AINotes.Log: : "p0078"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i790; StellarSize: : @@ -144472,7 +144472,7 @@ for msg in empire.AINotes.Log: : "p0202"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i914; StellarSize: : @@ -144557,7 +144557,7 @@ for msg in empire.AINotes.Log: : "p0055"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i767; StellarSize: : @@ -145092,7 +145092,7 @@ for msg in empire.AINotes.Log: : "p0262"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i974; StellarSize: : @@ -145149,7 +145149,7 @@ for msg in empire.AINotes.Log: : "p0135"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i847; StellarSize: : @@ -145234,7 +145234,7 @@ for msg in empire.AINotes.Log: : "p0086"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i798; StellarSize: : @@ -145319,7 +145319,7 @@ for msg in empire.AINotes.Log: : "p0279"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i991; StellarSize: : @@ -145401,7 +145401,7 @@ for msg in empire.AINotes.Log: : "p0223"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i935; StellarSize: : @@ -145486,7 +145486,7 @@ for msg in empire.AINotes.Log: : "p0223"; IntrinsicAbilities: - System.Collections.Generic.List`1[[FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.List`1[[FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: i935; StellarSize: : @@ -149977,2583 +149977,2583 @@ for msg in empire.AINotes.Log: i75; : 2937383228207047433; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i0; : 1523708152274839301; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i1; : 1158085953132908013; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i2; : 7540783823080096289; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i3; : 8991797094103478365; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i4; : 1014902515328921365; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i5; : 7708373979467920745; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i6; : 6131259377771005994; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i7; : 1046538617351300441; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i8; : 5624098489960390770; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i9; : 2726956940634607162; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i10; : 3378134249386076569; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i11; : 7308977497555769185; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i12; : 4418953009683854158; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i13; : 8460109623761784382; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i14; : 4263618018483448833; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i15; : 9199596545319169885; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i16; : 919250922221884498; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i17; : 6054932500377050610; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i18; : 6464330827245562554; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i19; : 1008004780674888190; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i20; : 4315270686730496090; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i21; : 4715753322921627309; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i22; : 9115954385140793233; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i23; : 2037715020383595001; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i24; : 4216101283481439345; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i25; : 1827037812231904661; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i26; : 428968499962445530; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i27; : 2309170336482483106; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i28; : 5741631214853505450; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i29; : 6135432093115949577; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i30; : 4669570269753685290; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i31; : 6075217081150798977; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i32; : 8571546149387206754; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i33; : 9150669016640296453; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i34; : 1089078859649098009; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i35; : 5062667288775988698; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i36; : 2290483054045373337; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i37; : 1852095871195812158; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i38; : 3049852418588769989; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i39; : 587747823004404978; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i40; : 6527180724336170861; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i41; : 9149150969040166742; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i42; : 7499871759933781181; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i43; : 8414648623315440466; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i44; : 4508426824914416482; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i45; : 1970851072629818057; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i46; : 4413541196274591574; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i47; : 6598440906122805738; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i48; : 8488539884886510565; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i49; : 5844514235803515529; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i50; : 1312537194683030721; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i51; : 8536476281142816794; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i52; : 1794735895789675117; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i53; : 666103642948045961; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i54; : 5608663262269017333; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i55; : 6459193024159722581; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i56; : 2768625734068452129; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i57; : 79950730278464122; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i58; : 3582718531035152630; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i59; : 5877296698956401557; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i60; : 6269932816448451237; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i61; : 610944262754466525; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i62; : 5884685339782204346; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i63; : 8461111957459054337; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i64; : 1412778965366053385; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i65; : 1009795541518317725; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i66; : 3272296376837140370; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i67; : 2754547174876103649; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i68; : 1352729713368647421; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i69; : 2278584405503094557; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i70; : 7190918621989270329; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i71; : 6962720790546408618; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i72; : 8582427474796359518; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i73; : 7663363941997512241; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i74; : 2199181558432522253; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i75; : 729217311160047985; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i76; : 4402361817315104386; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i77; : 7613202718323175662; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i78; : 7523609064915176150; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i79; : 2392528255725342838; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i80; : 1132217734488333297; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i81; : 4406806764867010865; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i82; : 8777474747209370225; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i83; : 7208730383933432786; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i84; : 4748647532533568629; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i85; : 4102086832586812294; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i86; : 1043477130304398889; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i87; : 936078552540168969; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i88; : 3755786299731183749; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i89; : 1871424606998280825; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i90; : 6551341014876548126; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i91; : 8574314118369236346; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i92; : 1130153693465921129; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i93; : 5867582230261682713; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i94; : 1522246403105999341; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i95; : 2946903530020339126; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i96; : 6399797079637406957; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i97; : 8257838353799219082; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i98; : 3304110273325621870; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i99; : 7084102072422919525; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i100; : 1722865072733048497; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i101; : 23737493959955906; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i102; : 8699298242150253742; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i103; : 4486432426250861301; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i104; : 6507682251426243314; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i105; : 7571673133369263821; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i106; : 1458651878945695666; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i107; : 4763115035374127162; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i108; : 6367509199148294206; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i109; : 7104802302951512038; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i110; : 461900419387228170; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i111; : 568215050485667545; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i112; : 9206167140904353670; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i113; : 5461342001434383558; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i114; : 8694909627389375365; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i115; : 197029202250696186; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i116; : 8409676374038915017; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i117; : 5047287191284801046; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i118; : 4979316696747332529; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i119; : 8216728988445352201; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i120; : 9066736834500425157; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i121; : 1189523266889051594; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i122; : 5621636503038320325; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i123; : 5179333357988650882; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i124; : 4146349090481531634; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i125; : 8469683011370829913; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i126; : 4791372415475335258; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i127; : 7891063909421588061; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i128; : 5552699993047019918; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i129; : 6522588639794706530; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i130; : 1281385882798994602; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i131; : 3395727380315105249; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i132; : 6562720169944748430; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i133; : 747079616279326234; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i134; : 5918606433124468126; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i135; : 2866983775045999333; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i136; : 2504232254733966353; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i137; : 8652787723495947986; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i138; : 5820540149275202341; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i139; : 9036478935943083154; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i140; : 2058536016802560205; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i141; : 2292954696053920694; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i142; : 8519786691073361482; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i143; : 4684796092019672462; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i144; : 4892802234241420437; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i145; : 732657657271953278; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i146; : 2947463533625934609; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i147; : 6462577209279291530; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i148; : 6293422473615674166; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i149; : 1909788259890635621; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i150; : 8200483394914881433; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i151; : 7725657932881323542; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i152; : 3906864110759841686; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i153; : 9214235331455413137; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i154; : 802063572828749533; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i155; : 3105353566509802182; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i156; : 3560777072138463294; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i157; : 7434587097423811801; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i158; : 4872871618902239785; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i159; : 2047932146280599841; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i160; : 9035358284486798085; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i161; : 4383772468722232405; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i162; : 4364372032735757702; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i163; : 6895370446336520762; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i164; : 5355759395971598954; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i165; : 3586730752042254022; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i166; : 4476593833001345858; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i167; : 7406389829684850529; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i168; : 5239088808453343481; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i169; : 470711974287598569; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i170; : 395653349195953858; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i171; : 6509790272913746042; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i172; : 6198253952660062653; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i173; : 8668693284465752774; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i174; : 3248686615204508026; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i175; : 856409726735013833; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i176; : 3059331986932245386; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i177; : 7328515312366109773; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i178; : 3953992597898342750; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i179; : 1464757698940126534; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i180; : 3720123751770025553; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i181; : 2263164390585876469; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i182; : 9167430263944084861; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i183; : 2154576424708788305; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i184; : 4863796739557074245; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i185; : 722515530093836265; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i186; : 2671959850075198810; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i187; : 6751554703447511433; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i188; : 3933767596910896749; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i189; : 5591284166740117850; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i190; : 7146327481268980234; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i191; : 5616707083175650645; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i192; : 3055111167953609002; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i193; : 4071855330898459213; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i194; : 354691997004972805; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i195; : 8363338719228258173; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i196; : 6811120007120164066; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i197; : 6577382681480323737; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i198; : 6254719810364869362; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i199; : 1971084572821723661; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i200; : 9126011987362564326; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i201; : 4227814587005112849; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i202; : 2745243073126457329; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i203; : 376393856856199057; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i204; : 2294543000729045657; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i205; : 4677582058794239950; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i206; : 6892353395021242934; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i207; : 2524155877866392374; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i208; : 1078643343255127858; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i209; : 2511602848107199754; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i210; : 6811785460762761837; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i211; : 4403226557440143758; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i212; : 6942687130351910318; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i213; : 2019311506435599813; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i214; : 1680734733523855702; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i215; : 3522456274429768029; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i216; : 515049016152841038; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i217; : 752283613401101333; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i218; : 4383415531170297242; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i219; : 6189222856211492149; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i220; : 5161026180157060114; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i221; : 1326074570816466026; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i222; : 516055567507993701; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i223; : 6134122205400690869; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i224; : 9056861854287994946; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i225; : 5831534604122879065; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i226; : 2983619942696360690; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i227; : 5748005083756754858; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i228; : 8184922109933429098; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i229; : 9120529530331250030; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i230; : 1763595475942696581; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i231; : 2233830451162623510; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i232; : 3332526515677100437; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i233; : 8980694938655937298; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i234; : 5761804178017217345; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i235; : 7971837134526787770; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i236; : 3583262660441629490; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i237; : 3227171904258150530; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i238; : 7376571048583647086; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i239; : 2100252879510359622; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i240; : 9024826397616685162; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i241; : 6086901900451378674; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i242; : 8068907097632995198; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i243; : 3014621858438042313; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i244; : 7145436327095082761; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i245; : 8341325920924815498; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i246; : 3165978713491791430; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i247; : 6576234095556758493; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i248; : 1032296342595639270; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i249; : 5831466030675063062; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i250; : 7147369036607578998; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i251; : 6918267157499003225; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i252; : 8520017829033255386; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i253; : 6860812168826388317; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i254; : 637676792027351214; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i255; : 5269673966338619110; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i256; : 1819825797641100330; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i257; : 9068203411212503573; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i258; : 811142540982778961; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i259; : 5626947341766500970; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i260; : 8656941317646498681; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i261; : 1346120282689191289; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i262; : 2498625320960537349; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i263; : 1385655748688237281; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i264; : 8381854907348244157; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i265; : 1821573643171328218; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i266; : 5415057260620788793; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i267; : 6791927507680261078; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i268; : 7241816080367209801; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i269; : 5062068183788148638; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i270; : 7305871437338290501; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i271; : 2623040988640324670; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i272; : 576734435940896302; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i273; : 4009510418882410250; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i274; : 5932249413913728302; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i275; : 8338893586456942829; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i276; : 1841284570933420770; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i277; : 8559749179900646129; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i278; : 3379415146072100778; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i279; : 6920385693066441666; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i280; : 8192106997510804525; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i281; : 5763152247991719714; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i282; : 5691001899873664986; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i283; : 2644665968576988322; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i284; : 267238096302844093; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i285; : 6600121586954490053; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i286; : 5831449263122747286; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i287; : 8892263872764881470; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i288; : 997241249038740669; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i289; : 3775057594641062462; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i290; : 8663060168571699546; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i291; : 6913300775147801382; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i292; : 1734521863077067550; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i293; : 2285699431142465781; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i294; : 4527811936457586194; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i295; : 8309778252279019882; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i296; : 7077037418159972333; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i297; : 3871702665222809057; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i298; : 395270074904571885; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i299; : 5449232873724895013; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i300; : 3470429213883702794; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i301; : 1762438652271861446; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i302; : 1459748487175068922; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i303; : 6103826279202927789; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i304; : 6446456479037991930; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i305; : 2465282536374476081; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i306; : 149454012743815358; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i307; : 3874837166713708609; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i308; : 4556893340393886541; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i309; : 762498557454720822; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i310; : 1895345951328223694; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i311; : 1797351651130805349; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i312; : 6859090565546326770; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i313; : 8602983274164789398; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i314; : 2441571843010434737; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i315; : 314754805535049818; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i316; : 8169722942234468489; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i317; : 8638352578938982449; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i318; : 4880050888662394662; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i319; : 4050855792689082430; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i320; : 5797706118865408514; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i321; : 9070583132331024742; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i322; : 5287394743695625470; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i323; : 4746455432766318557; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i324; : 8032524223527091085; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i325; : 3185153474716770198; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i326; : 1327266407060681850; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i327; : 4247597738937221306; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i328; : 1582169108187054889; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i329; : 1771482221305453726; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i330; : 4737395293748906026; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i331; : 6801392473134936874; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i332; : 432551069621324338; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i333; : 1780127174424489865; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i334; : 2036079007211768285; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i335; : 2559684551696996589; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i336; : 7794270722597740582; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i337; : 269743058667658301; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i338; : 270881044611941954; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i339; : 5917979531108301297; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i340; : 8371428565004413990; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i341; : 5510801444632749713; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i342; : 5262622712373629198; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i343; : 7354769476771723330; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i344; : 8183450241821644474; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i345; : 5366597917736699714; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i346; : 6264247594011187201; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i347; : 4902318086468595545; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i348; : 1057351446622048493; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i349; : 3373049162728803153; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i350; : 7271677536263446429; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i351; : 4259987912126560033; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i352; : 3491081349368537093; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i353; : 302466337171233010; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i354; : 6565370491182660774; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i355; : 8546794158382604285; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i356; : 2195372351939473654; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i357; : 488222160808245522; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i358; : 9076949923128173637; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i359; : 3286028692946115746; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i360; : 1936683851891804313; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i361; : 5932768855848199250; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i362; : 3732957869958741298; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i363; : 8479958918190220438; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i364; : 4202044791831047437; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i365; : 2499840418747617477; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i366; : 5503480363642481545; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i367; : 6131567249616574501; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i368; : 1916579127168459489; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i369; : 5086761299381084954; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i370; : 419490555116607265; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i371; : 7872799449334703418; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i372; : 4674076291740512449; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i373; : 9151008198797438222; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i374; : 6261381562335901001; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i375; : 2875720511616108253; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i376; : 6740506759077155234; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i377; : 6777618738240954197; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i378; : 1606792550820547937; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i379; : 1521136076751089049; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i380; : 4153819224016770778; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i381; : 6975480459772050165; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i382; : 4391041563428373998; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i383; : 6317934410308280386; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i384; : 2404672988713698642; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i385; : 5771784874554622074; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i386; : 150717678021056037; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i387; : 1168888938338618218; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i388; : 3254169312753990785; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i389; : 7799050952476485877; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i390; : 3918963591972787906; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i391; : 7056772723084795186; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i392; : 7092522218363853117; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i393; : 581674670531212274; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i394; : 4542695948046447670; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i395; : 7427816906118541249; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i396; : 5799427636246124182; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i397; : 2473005385785294186; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i398; : 1249102632284624781; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i399; : 1687751799549185374; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i400; : 8471331625976697226; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i401; : 5035332888556326613; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i402; : 1087934070476620661; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i403; : 9199197379648800113; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i404; : 3360574232654884629; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i405; : 1316973930257471074; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i406; : 7524699196333870054; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i407; : 992428145480327097; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i408; : 6625734968009642573; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i409; : 864452808907272577; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i410; : 5867697670392610846; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i411; : 8129836646126979401; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i412; : 670321567118726190; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i413; : 4855149432795960994; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i414; : 851420959014275662; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i415; : 4574018354247607573; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i416; : 4419151445762771546; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i417; : 2376259855918540930; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i418; : 6702926422319880157; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i419; : 7302355302233515285; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i420; : 2113674111138230578; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i421; : 7789768540311674257; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i422; : 5019694620581096622; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i423; : 7886863354098644770; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i424; : 9123452676481611842; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i425; : 7913996655359667186; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i426; : 4051882161023329609; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i427; : 9204518448989075066; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i428; : 4876893417686406797; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i429; : 6116375280282798637; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i430; : 7300321051104254301; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i431; : 6293960942255257534; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i432; : 1038071252539936613; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i433; : 3881252799878924873; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i434; : 3566047469454603634; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i435; : 16535340614058597; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i436; : 9185117128239337798; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i437; : 7639718274438302058; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i438; : 7842857591650723109; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i439; : 2111432833995464206; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i440; : 479518461126562049; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i441; : 4380516325167632186; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i442; : 5244436815828486402; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i443; : 1816812053450638882; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i444; : 2907290496911963493; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i445; : 7675205510424453762; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i446; : 6590065058474542461; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i447; : 1301470927982198317; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i448; : 4963659350527382590; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i449; : 4739883814978918801; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i450; : 2338221667057790866; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i451; : 2652040667938954785; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i452; : 854494179911824422; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i453; : 1230162247424879594; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i454; : 788800421767101541; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i455; : 258541534856803249; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i456; : 3083860467838868094; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i457; : 3865166635534407386; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i458; : 8048175316274660961; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i459; : 389218921253859049; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i460; : 7937820959198569417; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i461; : 8542498838901286178; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i462; : 7707205439126307578; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i463; : 1846388478137376494; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i464; : 3967267465630768773; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i465; : 1368571124706949026; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i466; : 1501604077326464537; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i467; : 5484393382959057550; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i468; : 4114890920364208389; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i469; : 1319632274494288609; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i470; : 7902315237673184338; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i471; : 4243178303491041185; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i472; : 4491671126708371922; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i473; : 2410461427804972085; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i474; : 6310948757673739029; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i475; : 8487860919276805870; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i476; : 6411001549795825694; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i477; : 3185736069850332121; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i478; : 5997764510008955370; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i479; : 6094937114243554809; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i480; : 4544016341251707502; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i481; : 1768580240753916746; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i482; : 6684265674190712721; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i483; : 6597341995790962898; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i484; : 119982453978528049; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i485; : 8897741124295835437; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i486; : 4936510510074690482; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i487; : 4020433645992483278; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i488; : 5558309787268666725; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i489; : 5056935010677051597; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i490; : 4642387902786296218; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i491; : 6884179324936451777; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i492; : 8049165478034619722; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i493; : 5438248735388658477; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i494; : 5764019522147462545; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i495; : 8845752142929798806; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i496; : 1004701486969334437; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i497; : 7653350311650897122; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i498; : 2430379493249719669; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i499; : 8503751301832193662; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i500; : 4777775657124093109; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i501; : 2781903754306871950; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i502; : 2000931202490861401; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i503; : 7543274732311924529; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i504; : 2348524649351002765; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i505; : 7624717869235773181; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i506; : 5791673047027003417; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i507; : 1781188211734734213; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i508; : 6005674817562287398; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i509; : 6688231844558487846; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i510; : 2354936588844346190; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i511; : 8842532635446216405; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i512; : 7918506680256012354; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i513; : 2099166166885631741; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i514; : 7795146672587417294; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i515; : 8648906842588697113; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i516; : 5753771111708688209; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i517; : 7160599219500278246; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i518; : 6023412577219974234; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i519; : 333284943708806714; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i520; : 1241858577237807210; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i521; : 3881835154494318333; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i522; : 4745722084280737234; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i523; : 2870542215578620449; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i524; : 6459637750843147106; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i525; : 1044247097681128857; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i526; : 4893942668317061669; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i527; : 4801514602782994385; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i528; : 4299065861029579970; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i529; : 8834385262878124754; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i530; : 2601167424586618886; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i531; : 2116160974510867869; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i532; : 2601203124354766614; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i533; : 4171658310542857661; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i534; : 2822376141651300277; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i535; : 6992870215409773358; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i536; : 406604072686643074; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i537; : 5431034427285319150; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i538; : 4058332540473954333; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i539; : 6803981178772049493; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i540; : 4469825531481684666; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i541; : 1173903046366390989; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i542; : 7515155572848171941; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i543; : 6005731193302988442; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i544; : 3870974101330793249; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i545; : 7555494378119822282; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i546; : 5325315731488856861; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i547; : 7037136587883160350; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i548; : 7100083800342716109; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i549; : 6786425869325011777; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i550; : 7930510924864181417; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i551; : 5949203917565877534; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i593; : 2665217619007012197; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i594; : 2978460991191565062; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i595; : 5407744108140145350; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i596; : 491071811478272405; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i597; : 5965877753695298453; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i598; : 5550378820922650557; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i599; : 6277252849466699670; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i600; : 2070289400961021317; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i601; : 7645226071776650954; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i602; : 7641607707860343949; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i603; : 4188931852955539801; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i604; : 3908479327700030853; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i605; : 4660749755551539606; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i606; : 7359263232331958826; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i607; : 527205105034722178; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i608; : 8205449502388176461; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i609; : 732386060720149893; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i610; : 2053968576783428845; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i611; : 2061548249164534166; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i612; : 8737984335417238294; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i613; : 8518580389379299466; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i614; : 3890299478468838009; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i615; : 2919978371464318537; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i616; : 3353912188626076998; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i617; : 4448092644786726558; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i618; : 1126763400902860114; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i619; : 7489169122343927994; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i620; : 4730658087792453394; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i621; : 8327265520854186050; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i622; : 7974679767220256257; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i623; : 1979383531965489750; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i624; : 8302868087989637869; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i625; : 8477883667303170929; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i626; : 1195154544537102990; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i627; : 719056818701781829; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i628; : 4410117815283497581; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i629; : 6465847371607139366; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i630; : 1663102535572320798; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i565; : 8064175375114868337; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i566; : 630564446447571445; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i567; : 5388471026523872333; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i568; : 5763956927294119790; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i569; : 1341562918663331653; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i570; : 1163412408362169642; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i571; : 4828051315907011025; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i572; : 1145031889669066529; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i573; : 3427957158486664769; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i575; : 6719229697261109345; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i576; : 5243504610357192877; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i577; : 1896789438296129565; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i578; : 3782969293763797745; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i579; : 6916323315431280941; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i580; : 7776054383324417914; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i581; : 5747011408713549605; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i582; : 676654668192420950; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i583; : 3369037285319085281; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i584; : 1739152911561823050; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i585; : 8996283058593042545; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i586; : 8084833386114960829; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i587; : 8521693123975953025; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i588; : 1069541422795879294; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i589; : 5024546232816268197; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i590; : 3832306991819248177; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i591; : 2260876951134634186; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i592; : 4303430544232696177; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i564; : 3068435968975795070; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i631; : 1849613156761580869; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i632; : 8942521595764379641; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i633; : 4499811524249578117; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i634; : 204613384347460206; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i635; : 7680334302668910921; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i636; : 4169069570546006689; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i637; : 5554119539867229034; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i638; : 5037600545388212734; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i639; : 2914213632002573385; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i640; : 9166563719932782010; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i641; : 20665475653249465; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i642; : 6453440783052802970; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i643; : 6800389907509433042; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i644; : 2586982607903416845; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i554; : 1826964651759018666; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i555; : 4126516829893383581; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i556; : 5398481770652465885; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i557; : 6448183416667432625; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i558; : 6731149648841166365; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i559; : 4557906566128214081; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i560; : 7439499337417305482; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i552; : 1899678370737027373; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i553; : 4510775897146327665; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i561; : 5012034615131724325; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i562; : 4336644445440199093; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i563; : 5328234969218981134; - FrEee.Objects.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Modding.Abilities.Ability, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i574; : 9066457172000043642; @@ -152856,7 +152856,7 @@ for msg in empire.AINotes.Log: : All; Battles: - System.Collections.Generic.HashSet`1[[FrEee.Objects.Combat.IBattle, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: + System.Collections.Generic.HashSet`1[[FrEee.Processes.Combat.IBattle, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null]], System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089: c0: ; Empires: @@ -152931,7 +152931,7 @@ for msg in empire.AINotes.Log: i0; ; WarpPointPlacementStrategy: - FrEee.Setup.WarpPointPlacementStrategies.EdgeAlignedWarpPointPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: + FrEee.Processes.Setup.WarpPointPlacementStrategies.EdgeAlignedWarpPointPlacementStrategy, FrEee.Core, Version=0.0.8.0, Culture=neutral, PublicKeyToken=null: i0; Width: : diff --git a/FrEee.Tests/Setup/GameSetupTest.cs b/FrEee.Tests/Setup/GameSetupTest.cs index a8afe13f7..dbb73cb91 100644 --- a/FrEee.Tests/Setup/GameSetupTest.cs +++ b/FrEee.Tests/Setup/GameSetupTest.cs @@ -1,7 +1,7 @@ -using FrEee.Setup; -using FrEee.Modding; +using FrEee.Modding; using NUnit.Framework; using FrEee.Objects.GameState; +using FrEee.Processes.Setup; namespace FrEee.Tests.Setup; diff --git a/FrEee.Tests/Utility/DataTest.cs b/FrEee.Tests/Utility/DataTest.cs index 2d59f221a..e5e8524ed 100644 --- a/FrEee.Tests/Utility/DataTest.cs +++ b/FrEee.Tests/Utility/DataTest.cs @@ -3,6 +3,8 @@ using FrEee.Extensions; using NUnit.Framework; using System.Collections.Generic; +using FrEee.Serialization; +using FrEee.Utility; namespace FrEee.Tests.Utility; diff --git a/FrEee.Tests/Utility/Extensions/CommonExtensionsTest.cs b/FrEee.Tests/Utility/Extensions/CommonExtensionsTest.cs index 543a18e6e..1161756dc 100644 --- a/FrEee.Tests/Utility/Extensions/CommonExtensionsTest.cs +++ b/FrEee.Tests/Utility/Extensions/CommonExtensionsTest.cs @@ -2,6 +2,7 @@ using NUnit.Framework; using System.Collections.Generic; using System.Linq; +using FrEee.Extensions; namespace FrEee.Tests.Utility.Extensions; diff --git a/FrEee.Tests/Utility/Extensions/EnumerableExtensionsTest.cs b/FrEee.Tests/Utility/Extensions/EnumerableExtensionsTest.cs index f8b139e60..9946e35ba 100644 --- a/FrEee.Tests/Utility/Extensions/EnumerableExtensionsTest.cs +++ b/FrEee.Tests/Utility/Extensions/EnumerableExtensionsTest.cs @@ -1,6 +1,7 @@ using FrEee.Extensions; using NUnit.Framework; using System.Linq; +using FrEee.Extensions; namespace FrEee.Tests.Utility.Extensions; diff --git a/FrEee.Tests/Utility/Extensions/ParserTest.cs b/FrEee.Tests/Utility/Extensions/ParserTest.cs index 2466ce7db..a7c8a2372 100644 --- a/FrEee.Tests/Utility/Extensions/ParserTest.cs +++ b/FrEee.Tests/Utility/Extensions/ParserTest.cs @@ -2,6 +2,8 @@ using FrEee.Extensions; using NUnit.Framework; using System; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.Tests.Utility.Extensions; diff --git a/FrEee.Tests/Utility/MathXTest.cs b/FrEee.Tests/Utility/MathXTest.cs index 4cd7dbcc8..61ae0949c 100644 --- a/FrEee.Tests/Utility/MathXTest.cs +++ b/FrEee.Tests/Utility/MathXTest.cs @@ -1,5 +1,6 @@ using FrEee.Utility; using NUnit.Framework; +using FrEee.Utility; namespace FrEee.Tests.Utility; diff --git a/FrEee.Tests/Utility/PrngTest.cs b/FrEee.Tests/Utility/PrngTest.cs index 69fc7a62c..8284bebec 100644 --- a/FrEee.Tests/Utility/PrngTest.cs +++ b/FrEee.Tests/Utility/PrngTest.cs @@ -1,5 +1,6 @@ using FrEee.Utility; using NUnit.Framework; +using FrEee.Utility; namespace FrEee.Tests.Utility; diff --git a/FrEee.Tests/Utility/SerializerTest.cs b/FrEee.Tests/Utility/SerializerTest.cs index 220e4df06..78c1b1257 100644 --- a/FrEee.Tests/Utility/SerializerTest.cs +++ b/FrEee.Tests/Utility/SerializerTest.cs @@ -1,5 +1,4 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; +using FrEee.Objects.Civilization; using FrEee.Objects.Technology; using FrEee.Objects.Vehicles; using FrEee.Modding; @@ -10,6 +9,8 @@ using System.Collections.Generic; using System.Linq; using FrEee.Objects.Civilization.Orders; +using FrEee.Utility; +using FrEee.Modding.Abilities; namespace FrEee.Tests.Utility; @@ -95,7 +96,7 @@ public void NestedCrossAssemblySafeTypeName() public void NestedDictionaries() { var s = SafeType.GetShortTypeName(typeof(IDictionary>>)); - Assert.AreEqual("System.Collections.Generic.IDictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib]], FrEee.Core]], System.Private.CoreLib]], System.Private.CoreLib", s); + Assert.AreEqual("System.Collections.Generic.IDictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib]], FrEee.Core]], System.Private.CoreLib]], System.Private.CoreLib", s); } [Test] @@ -112,12 +113,12 @@ public void LookUpComplexType() Assert.AreEqual(typeof(ConstructionOrder>), st.Type); } { - var tname = "System.Collections.Generic.Dictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib"; + var tname = "System.Collections.Generic.Dictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib]], System.Private.CoreLib"; var st = new SafeType(tname); Assert.AreEqual(typeof(Dictionary>), st.Type); } { - var tname = "System.Collections.Generic.IDictionary`2[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.9.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.9.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"; + var tname = "System.Collections.Generic.IDictionary`2[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.9.0, Culture=neutral, PublicKeyToken=null],[System.Collections.Generic.IDictionary`2[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[FrEee.Modding.Formula`1[[System.Int32, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], FrEee.Core, Version=0.0.9.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"; var st = new SafeType(tname); Assert.AreEqual(typeof(IDictionary>>), st.Type); } @@ -127,7 +128,7 @@ public void LookUpComplexType() public void LegacyLookUpComplexType() { { - var tname = "System.Collections.Generic.List`1[[FrEee.Objects.Abilities.AbilityRule, FrEee.Core, Version=0.0.9.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; + var tname = "System.Collections.Generic.List`1[[FrEee.Modding.Abilities.AbilityRule, FrEee.Core, Version=0.0.9.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; var st = new SafeType(tname); Assert.AreEqual(typeof(List), st.Type); } diff --git a/FrEee.Tests/Utility/VectorTest.cs b/FrEee.Tests/Utility/VectorTest.cs index 2d869579e..c650f38b0 100644 --- a/FrEee.Tests/Utility/VectorTest.cs +++ b/FrEee.Tests/Utility/VectorTest.cs @@ -1,5 +1,6 @@ using FrEee.Utility; using NUnit.Framework; +using FrEee.Utility; namespace FrEee.Tests.Utility; diff --git a/FrEee.UI.Blazor/FrEee.UI.Blazor.csproj b/FrEee.UI.Blazor/FrEee.UI.Blazor.csproj index 1cfa4cfa8..a9b8c97d9 100644 --- a/FrEee.UI.Blazor/FrEee.UI.Blazor.csproj +++ b/FrEee.UI.Blazor/FrEee.UI.Blazor.csproj @@ -19,7 +19,9 @@ - + + + diff --git a/FrEee.UI.Blazor/Views/GalaxyMapModes/PresenceMode.cs b/FrEee.UI.Blazor/Views/GalaxyMapModes/PresenceMode.cs index e5e419e9c..22e6e5526 100644 --- a/FrEee.UI.Blazor/Views/GalaxyMapModes/PresenceMode.cs +++ b/FrEee.UI.Blazor/Views/GalaxyMapModes/PresenceMode.cs @@ -8,6 +8,7 @@ using FrEee.Extensions; using FrEee.Objects.Civilization; using FrEee.Objects.Space; +using FrEee.Extensions; namespace FrEee.UI.Blazor.Views.GalaxyMapModes { diff --git a/FrEee.UI.Blazor/Views/PieChartViewModel.cs b/FrEee.UI.Blazor/Views/PieChartViewModel.cs index be31bd9d7..dc46d230e 100644 --- a/FrEee.UI.Blazor/Views/PieChartViewModel.cs +++ b/FrEee.UI.Blazor/Views/PieChartViewModel.cs @@ -11,6 +11,7 @@ using FrEee.Properties; using FrEee.Utility; using Microsoft.AspNetCore.Components; +using FrEee.Extensions; namespace FrEee.UI.Blazor.Views { diff --git a/FrEee.UI.Blazor/Views/ProgressBarViewModel.cs b/FrEee.UI.Blazor/Views/ProgressBarViewModel.cs index 55c338524..e2bc9481f 100644 --- a/FrEee.UI.Blazor/Views/ProgressBarViewModel.cs +++ b/FrEee.UI.Blazor/Views/ProgressBarViewModel.cs @@ -8,6 +8,8 @@ using FrEee.Extensions; using FrEee.Utility; using Microsoft.AspNetCore.Components; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.UI.Blazor.Views { diff --git a/FrEee.UI.Blazor/Views/ResourceDisplayViewModel.cs b/FrEee.UI.Blazor/Views/ResourceDisplayViewModel.cs index dadd186b6..913b1fdb1 100644 --- a/FrEee.UI.Blazor/Views/ResourceDisplayViewModel.cs +++ b/FrEee.UI.Blazor/Views/ResourceDisplayViewModel.cs @@ -9,6 +9,7 @@ using FrEee.Properties; using FrEee.Utility; using Microsoft.AspNetCore.Components; +using FrEee.Extensions; namespace FrEee.UI.Blazor.Views { diff --git a/FrEee.UI.WinForms/Controls/AbilityTreeView.cs b/FrEee.UI.WinForms/Controls/AbilityTreeView.cs index 8a66a6e97..429e357d3 100644 --- a/FrEee.UI.WinForms/Controls/AbilityTreeView.cs +++ b/FrEee.UI.WinForms/Controls/AbilityTreeView.cs @@ -1,4 +1,4 @@ -using FrEee.Objects.Abilities; +using FrEee.Modding.Abilities; using System.Collections.Generic; using System.Drawing; using System.Linq; diff --git a/FrEee.UI.WinForms/Controls/AptitudePicker.cs b/FrEee.UI.WinForms/Controls/AptitudePicker.cs index c21422468..5d8a794a0 100644 --- a/FrEee.UI.WinForms/Controls/AptitudePicker.cs +++ b/FrEee.UI.WinForms/Controls/AptitudePicker.cs @@ -5,6 +5,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/AsteroidFieldReport.cs b/FrEee.UI.WinForms/Controls/AsteroidFieldReport.cs index e7c1052a3..5877d05a6 100644 --- a/FrEee.UI.WinForms/Controls/AsteroidFieldReport.cs +++ b/FrEee.UI.WinForms/Controls/AsteroidFieldReport.cs @@ -4,6 +4,7 @@ using FrEee.UI.WinForms.Interfaces; using System.Drawing; using System.Windows.Forms; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/BattleView.cs b/FrEee.UI.WinForms/Controls/BattleView.cs index 6ac3f2f0e..4831bcc93 100644 --- a/FrEee.UI.WinForms/Controls/BattleView.cs +++ b/FrEee.UI.WinForms/Controls/BattleView.cs @@ -1,5 +1,3 @@ -using FrEee.Objects.Combat; -using FrEee.Objects.Combat.Grid; using FrEee.Objects.Space; using FrEee.Objects.Vehicles; using FrEee.Utility; @@ -10,6 +8,10 @@ using System.IO; using System.Linq; using System.Windows.Forms; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Processes.Combat.Grid; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/Blazor/GameProgressBar.cs b/FrEee.UI.WinForms/Controls/Blazor/GameProgressBar.cs index 7a6f636e8..9b3ab20fd 100644 --- a/FrEee.UI.WinForms/Controls/Blazor/GameProgressBar.cs +++ b/FrEee.UI.WinForms/Controls/Blazor/GameProgressBar.cs @@ -12,6 +12,7 @@ using System.Threading.Tasks; using FrEee.UI.WinForms.Forms; using FrEee.UI.WinForms.Controls; +using FrEee.Utility; namespace FrEee.UI.WinForms.Controls.Blazor; diff --git a/FrEee.UI.WinForms/Controls/Cargolist.cs b/FrEee.UI.WinForms/Controls/Cargolist.cs index 50d879724..13e75d045 100644 --- a/FrEee.UI.WinForms/Controls/Cargolist.cs +++ b/FrEee.UI.WinForms/Controls/Cargolist.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Vehicles; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/ComponentReport.cs b/FrEee.UI.WinForms/Controls/ComponentReport.cs index 9a707576e..31f07c133 100644 --- a/FrEee.UI.WinForms/Controls/ComponentReport.cs +++ b/FrEee.UI.WinForms/Controls/ComponentReport.cs @@ -1,4 +1,4 @@ -using FrEee.Objects.Combat; +using FrEee.Processes.Combat; using FrEee.Objects.Technology; using FrEee.Modding.Templates; using FrEee.Utility; @@ -11,6 +11,8 @@ using System.Linq; using System.Windows.Forms; using Component = FrEee.Objects.Technology.Component; +using FrEee.Extensions; +using FrEee.Processes.Combat; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/DesignReport.cs b/FrEee.UI.WinForms/Controls/DesignReport.cs index 2341a10d8..018e06fc3 100644 --- a/FrEee.UI.WinForms/Controls/DesignReport.cs +++ b/FrEee.UI.WinForms/Controls/DesignReport.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Windows.Forms; using FrEee.Objects.Vehicles; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/FleetReport.cs b/FrEee.UI.WinForms/Controls/FleetReport.cs index 850f53392..319c892a4 100644 --- a/FrEee.UI.WinForms/Controls/FleetReport.cs +++ b/FrEee.UI.WinForms/Controls/FleetReport.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Windows.Forms; using FrEee.Objects.Civilization.Orders; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/GameGridView.cs b/FrEee.UI.WinForms/Controls/GameGridView.cs index f12b5dfe9..d8b5d49a1 100644 --- a/FrEee.UI.WinForms/Controls/GameGridView.cs +++ b/FrEee.UI.WinForms/Controls/GameGridView.cs @@ -6,6 +6,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/GameTabControl.cs b/FrEee.UI.WinForms/Controls/GameTabControl.cs index 4b3273d9f..0c46a6508 100644 --- a/FrEee.UI.WinForms/Controls/GameTabControl.cs +++ b/FrEee.UI.WinForms/Controls/GameTabControl.cs @@ -2,6 +2,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/LineGraph.cs b/FrEee.UI.WinForms/Controls/LineGraph.cs index d71993c81..5cf497b16 100644 --- a/FrEee.UI.WinForms/Controls/LineGraph.cs +++ b/FrEee.UI.WinForms/Controls/LineGraph.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Windows.Forms; using FrEee.Extensions; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/MountReport.cs b/FrEee.UI.WinForms/Controls/MountReport.cs index db2c9d589..194273e48 100644 --- a/FrEee.UI.WinForms/Controls/MountReport.cs +++ b/FrEee.UI.WinForms/Controls/MountReport.cs @@ -9,6 +9,8 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/PlanetReport.cs b/FrEee.UI.WinForms/Controls/PlanetReport.cs index 37e60101d..d2a9238ab 100644 --- a/FrEee.UI.WinForms/Controls/PlanetReport.cs +++ b/FrEee.UI.WinForms/Controls/PlanetReport.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/SpaceVehicleReport.cs b/FrEee.UI.WinForms/Controls/SpaceVehicleReport.cs index 6d7d95680..30566dc7c 100644 --- a/FrEee.UI.WinForms/Controls/SpaceVehicleReport.cs +++ b/FrEee.UI.WinForms/Controls/SpaceVehicleReport.cs @@ -13,6 +13,8 @@ using FrEee.Objects.Civilization.Construction; using FrEee.Objects.Civilization.Orders; using FrEee.Objects.Civilization.CargoStorage; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/Controls/StarSystemReport.cs b/FrEee.UI.WinForms/Controls/StarSystemReport.cs index 4ff52566a..5814a17dd 100644 --- a/FrEee.UI.WinForms/Controls/StarSystemReport.cs +++ b/FrEee.UI.WinForms/Controls/StarSystemReport.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Windows.Forms; using FrEee.Objects.Civilization.CargoStorage; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Controls; diff --git a/FrEee.UI.WinForms/DataGridView/DataGridViewProgressCell.cs b/FrEee.UI.WinForms/DataGridView/DataGridViewProgressCell.cs index 9ff24609e..115a2c8ee 100644 --- a/FrEee.UI.WinForms/DataGridView/DataGridViewProgressCell.cs +++ b/FrEee.UI.WinForms/DataGridView/DataGridViewProgressCell.cs @@ -3,6 +3,8 @@ using System; using System.Drawing; using System.Windows.Forms; +using FrEee.Extensions; +using FrEee.Utility; namespace FrEee.UI.WinForms.DataGridView; diff --git a/FrEee.UI.WinForms/DataGridView/DataGridViewProgressColumn.cs b/FrEee.UI.WinForms/DataGridView/DataGridViewProgressColumn.cs index 9f15fd050..ac6495604 100644 --- a/FrEee.UI.WinForms/DataGridView/DataGridViewProgressColumn.cs +++ b/FrEee.UI.WinForms/DataGridView/DataGridViewProgressColumn.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.Drawing; using System.Windows.Forms; +using FrEee.Utility; namespace FrEee.UI.WinForms.DataGridView; diff --git a/FrEee.UI.WinForms/DataGridView/GridColumnConfig.cs b/FrEee.UI.WinForms/DataGridView/GridColumnConfig.cs index 0bb423193..03d5dc072 100644 --- a/FrEee.UI.WinForms/DataGridView/GridColumnConfig.cs +++ b/FrEee.UI.WinForms/DataGridView/GridColumnConfig.cs @@ -2,6 +2,7 @@ using System; using System.Drawing; using System.Windows.Forms; +using FrEee.Serialization; namespace FrEee.UI.WinForms.DataGridView; diff --git a/FrEee.UI.WinForms/Forms/ActivateAbilityForm.cs b/FrEee.UI.WinForms/Forms/ActivateAbilityForm.cs index f1c10f700..1d62e1f7b 100644 --- a/FrEee.UI.WinForms/Forms/ActivateAbilityForm.cs +++ b/FrEee.UI.WinForms/Forms/ActivateAbilityForm.cs @@ -1,5 +1,4 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Civilization; +using FrEee.Objects.Civilization; using FrEee.Objects.Commands; using FrEee.Objects.Space; using FrEee.Extensions; @@ -13,6 +12,8 @@ using FrEee.Serialization; using FrEee.Objects.GameState; using FrEee.Objects.Civilization.Orders; +using FrEee.Extensions; +using FrEee.Modding.Abilities; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/BattleReplayForm.cs b/FrEee.UI.WinForms/Forms/BattleReplayForm.cs index bea0bf5a2..71aa61f43 100644 --- a/FrEee.UI.WinForms/Forms/BattleReplayForm.cs +++ b/FrEee.UI.WinForms/Forms/BattleReplayForm.cs @@ -1,6 +1,4 @@ using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; -using FrEee.Objects.Combat.Grid; using FrEee.Objects.Space; using FrEee.Objects.Vehicles; using FrEee.Extensions; @@ -11,6 +9,8 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using FrEee.Processes.Combat; +using FrEee.Processes.Combat.Grid; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/BattleResultsForm.cs b/FrEee.UI.WinForms/Forms/BattleResultsForm.cs index 4adb98be7..11bbced53 100644 --- a/FrEee.UI.WinForms/Forms/BattleResultsForm.cs +++ b/FrEee.UI.WinForms/Forms/BattleResultsForm.cs @@ -1,5 +1,4 @@ using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; using FrEee.Objects.Space; using FrEee.Utility; using FrEee.Extensions; @@ -12,6 +11,9 @@ using System.Linq; using System.Windows.Forms; using FrEee.Objects.Vehicles; +using FrEee.Utility; +using FrEee.Processes.Combat; +using FrEee.Processes.Combat.Grid; namespace FrEee.UI.WinForms.Forms; @@ -144,9 +146,9 @@ private void btnClose_Click(object sender, EventArgs e) private void btnReplay_Click(object sender, EventArgs e) { Form form; - //if (Battle is FrEee.Objects.Combat.Simple.Battle b) + //if (Battle is FrEee.Processes.Combat.Simple.Battle b) // form = new LogForm(MainGameForm.Instance, b.Log); - if (Battle is FrEee.Objects.Combat.Grid.Battle b2) + if (Battle is Battle b2) form = new BattleReplayForm(b2); else throw new Exception($"Unknown battle type {Battle.GetType()}!"); diff --git a/FrEee.UI.WinForms/Forms/CargoTransferForm.cs b/FrEee.UI.WinForms/Forms/CargoTransferForm.cs index 764793692..f436eabe1 100644 --- a/FrEee.UI.WinForms/Forms/CargoTransferForm.cs +++ b/FrEee.UI.WinForms/Forms/CargoTransferForm.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Civilization.Orders; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/CombatSimulatorForm.cs b/FrEee.UI.WinForms/Forms/CombatSimulatorForm.cs index c9075c48f..3a9c252de 100644 --- a/FrEee.UI.WinForms/Forms/CombatSimulatorForm.cs +++ b/FrEee.UI.WinForms/Forms/CombatSimulatorForm.cs @@ -1,7 +1,6 @@ using FrEee.Objects; using FrEee.Objects.Civilization; -using FrEee.Objects.Combat; -using FrEee.Objects.Combat.Grid; +using FrEee.Processes.Combat.Grid; using FrEee.Objects.Space; using FrEee.Objects.Vehicles; using FrEee.Modding; @@ -14,6 +13,8 @@ using System.Linq; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Processes.Combat; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/ConstructionQueueForm.cs b/FrEee.UI.WinForms/Forms/ConstructionQueueForm.cs index e22e7e890..8f3528ffa 100644 --- a/FrEee.UI.WinForms/Forms/ConstructionQueueForm.cs +++ b/FrEee.UI.WinForms/Forms/ConstructionQueueForm.cs @@ -18,6 +18,7 @@ using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; using FrEee.Objects.Civilization.CargoStorage; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/ConstructionQueueListForm.cs b/FrEee.UI.WinForms/Forms/ConstructionQueueListForm.cs index 33c4a568b..85187bdb9 100644 --- a/FrEee.UI.WinForms/Forms/ConstructionQueueListForm.cs +++ b/FrEee.UI.WinForms/Forms/ConstructionQueueListForm.cs @@ -9,6 +9,7 @@ using System.Reflection; using System.Windows.Forms; using FrEee.Objects.Civilization.Construction; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/DesignListForm.cs b/FrEee.UI.WinForms/Forms/DesignListForm.cs index a2c4a8149..aea568225 100644 --- a/FrEee.UI.WinForms/Forms/DesignListForm.cs +++ b/FrEee.UI.WinForms/Forms/DesignListForm.cs @@ -13,6 +13,7 @@ using FrEee.Objects.Civilization.Construction; using FrEee.Objects.Vehicles; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/DiplomacyForm.cs b/FrEee.UI.WinForms/Forms/DiplomacyForm.cs index 7d5157e82..c0698d9c2 100644 --- a/FrEee.UI.WinForms/Forms/DiplomacyForm.cs +++ b/FrEee.UI.WinForms/Forms/DiplomacyForm.cs @@ -17,7 +17,8 @@ using System.Windows.Forms; using FrEee.Objects.Civilization.Diplomacy.Messages; using FrEee.Objects.Civilization.Diplomacy.Actions; -using FrEee.Objects.Abilities; +using FrEee.Extensions; +using FrEee.Modding.Abilities; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/EditorForm.cs b/FrEee.UI.WinForms/Forms/EditorForm.cs index da051ff69..6f593cbeb 100644 --- a/FrEee.UI.WinForms/Forms/EditorForm.cs +++ b/FrEee.UI.WinForms/Forms/EditorForm.cs @@ -8,6 +8,7 @@ using System.Drawing; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/EmpireListForm.cs b/FrEee.UI.WinForms/Forms/EmpireListForm.cs index c588ea9a3..797f70fa1 100644 --- a/FrEee.UI.WinForms/Forms/EmpireListForm.cs +++ b/FrEee.UI.WinForms/Forms/EmpireListForm.cs @@ -11,6 +11,7 @@ using System.Windows.Forms; using FrEee.Objects.Civilization.Diplomacy.Messages; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/EmpireSetupForm.cs b/FrEee.UI.WinForms/Forms/EmpireSetupForm.cs index ae196c608..be5737aa4 100644 --- a/FrEee.UI.WinForms/Forms/EmpireSetupForm.cs +++ b/FrEee.UI.WinForms/Forms/EmpireSetupForm.cs @@ -1,6 +1,5 @@ using FrEee.Objects.Civilization; using FrEee.Objects.Space; -using FrEee.Setup; using FrEee.Modding; using FrEee.Utility; using FrEee.Extensions; @@ -12,6 +11,7 @@ using System.Linq; using System.Reflection; using System.Windows.Forms; +using FrEee.Processes.Setup; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/GameSetupForm.Designer.cs b/FrEee.UI.WinForms/Forms/GameSetupForm.Designer.cs index 42a380f89..171fce0e8 100644 --- a/FrEee.UI.WinForms/Forms/GameSetupForm.Designer.cs +++ b/FrEee.UI.WinForms/Forms/GameSetupForm.Designer.cs @@ -1,4 +1,6 @@ -namespace FrEee.UI.WinForms.Forms; +using FrEee.Processes.Setup.WarpPointPlacementStrategies; + +namespace FrEee.UI.WinForms.Forms; partial class GameSetupForm { @@ -577,7 +579,7 @@ private void InitializeComponent() // // warpPointPlacementStrategyBindingSource // - warpPointPlacementStrategyBindingSource.DataSource = typeof(Setup.WarpPointPlacementStrategies.WarpPointPlacementStrategy); + warpPointPlacementStrategyBindingSource.DataSource = typeof(WarpPointPlacementStrategy); // // label3 // diff --git a/FrEee.UI.WinForms/Forms/GameSetupForm.cs b/FrEee.UI.WinForms/Forms/GameSetupForm.cs index c25d7f2cb..343970daf 100644 --- a/FrEee.UI.WinForms/Forms/GameSetupForm.cs +++ b/FrEee.UI.WinForms/Forms/GameSetupForm.cs @@ -2,8 +2,6 @@ using FrEee.Objects.Technology; using FrEee.Objects.Vehicles; using FrEee.Objects.VictoryConditions; -using FrEee.Setup; -using FrEee.Setup.WarpPointPlacementStrategies; using FrEee.Modding; using FrEee.Modding.Templates; using FrEee.Utility; @@ -23,6 +21,10 @@ using Microsoft.AspNetCore.Components.WebView.WindowsForms; using Microsoft.Extensions.DependencyInjection; using FrEee.UI.Blazor; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Setup; +using FrEee.Processes.Setup.WarpPointPlacementStrategies; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/HostConsoleForm.cs b/FrEee.UI.WinForms/Forms/HostConsoleForm.cs index 39340dfa5..052cd42b8 100644 --- a/FrEee.UI.WinForms/Forms/HostConsoleForm.cs +++ b/FrEee.UI.WinForms/Forms/HostConsoleForm.cs @@ -12,6 +12,7 @@ using System.Threading; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Utility; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/HullPickerForm.cs b/FrEee.UI.WinForms/Forms/HullPickerForm.cs index 01567aff3..4ee6ed72a 100644 --- a/FrEee.UI.WinForms/Forms/HullPickerForm.cs +++ b/FrEee.UI.WinForms/Forms/HullPickerForm.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using FrEee.Objects.Technology; using FrEee.Objects.Vehicles; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/LogForm.cs b/FrEee.UI.WinForms/Forms/LogForm.cs index 9662b4256..01a9ddc01 100644 --- a/FrEee.UI.WinForms/Forms/LogForm.cs +++ b/FrEee.UI.WinForms/Forms/LogForm.cs @@ -1,5 +1,4 @@ -using FrEee.Objects.Combat; -using FrEee.Objects.LogMessages; +using FrEee.Objects.LogMessages; using FrEee.Objects.Space; using FrEee.Objects.Technology; using FrEee.Modding.Templates; @@ -14,6 +13,8 @@ using FrEee.Objects.Vehicles; using FrEee.Objects.Civilization.Diplomacy.Messages; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Processes.Combat; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/MainGameForm.cs b/FrEee.UI.WinForms/Forms/MainGameForm.cs index 31fef8b70..970082851 100644 --- a/FrEee.UI.WinForms/Forms/MainGameForm.cs +++ b/FrEee.UI.WinForms/Forms/MainGameForm.cs @@ -20,13 +20,15 @@ using System.Reflection; using System.Threading; using System.Windows.Forms; -using FrEee.Objects.Combat; using FrEee.Objects.Civilization.Construction; using FrEee.Objects.Civilization.Diplomacy.Messages; using FrEee.Objects.Civilization.Orders; using FrEee.Objects.GameState; using FrEee.Objects.Civilization.CargoStorage; using FrEee.UI.Blazor.Views.GalaxyMapModes; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Combat; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/MainMenuForm.cs b/FrEee.UI.WinForms/Forms/MainMenuForm.cs index 96387a6a2..bd4f8ee3f 100644 --- a/FrEee.UI.WinForms/Forms/MainMenuForm.cs +++ b/FrEee.UI.WinForms/Forms/MainMenuForm.cs @@ -1,5 +1,4 @@ using FrEee.Objects.Vehicles; -using FrEee.Setup; using FrEee.Modding; using FrEee.Utility; using FrEee.Extensions; @@ -17,6 +16,9 @@ using System.Threading; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Extensions; +using FrEee.Utility; +using FrEee.Processes.Setup; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/MinistersForm.cs b/FrEee.UI.WinForms/Forms/MinistersForm.cs index e421ac9bf..18296b557 100644 --- a/FrEee.UI.WinForms/Forms/MinistersForm.cs +++ b/FrEee.UI.WinForms/Forms/MinistersForm.cs @@ -6,6 +6,7 @@ using System.Data; using System.Drawing; using System.Linq; +using FrEee.Utility; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/ModPickerForm.cs b/FrEee.UI.WinForms/Forms/ModPickerForm.cs index fb931f113..20de5b7ee 100644 --- a/FrEee.UI.WinForms/Forms/ModPickerForm.cs +++ b/FrEee.UI.WinForms/Forms/ModPickerForm.cs @@ -12,6 +12,7 @@ using System.Reflection; using System.Threading; using System.Windows.Forms; +using FrEee.Utility; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/PlanetListForm.cs b/FrEee.UI.WinForms/Forms/PlanetListForm.cs index 98d52db95..2fe33e0b0 100644 --- a/FrEee.UI.WinForms/Forms/PlanetListForm.cs +++ b/FrEee.UI.WinForms/Forms/PlanetListForm.cs @@ -15,6 +15,7 @@ using System.Windows.Forms; using FrEee.Objects.GameState; using FrEee.Objects.Civilization.CargoStorage; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/RecycleForm.cs b/FrEee.UI.WinForms/Forms/RecycleForm.cs index 35d557587..4a0f227d3 100644 --- a/FrEee.UI.WinForms/Forms/RecycleForm.cs +++ b/FrEee.UI.WinForms/Forms/RecycleForm.cs @@ -14,6 +14,7 @@ using FrEee.Objects.Civilization.Orders; using FrEee.Objects.Civilization.CargoStorage; using FrEee.Objects.Civilization.Orders.RecycleBehaviors; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/ResearchForm.Designer.cs b/FrEee.UI.WinForms/Forms/ResearchForm.Designer.cs index 90bf877cd..06a2462d5 100644 --- a/FrEee.UI.WinForms/Forms/ResearchForm.Designer.cs +++ b/FrEee.UI.WinForms/Forms/ResearchForm.Designer.cs @@ -141,7 +141,7 @@ private void InitializeComponent() this.colProgress.HeaderText = "Progress"; this.colProgress.MinimumWidth = 100; this.colProgress.Name = "colProgress"; - this.colProgress.ProgressDisplayMode = FrEee.UI.WinForms.DataGridView.ProgressDisplayMode.Eta; + this.colProgress.ProgressDisplayMode = FrEee.Utility.ProgressDisplayMode.Eta; this.colProgress.ReadOnly = true; this.colProgress.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; // @@ -152,7 +152,7 @@ private void InitializeComponent() this.colSpending.HeaderText = "Spending"; this.colSpending.MinimumWidth = 100; this.colSpending.Name = "colSpending"; - this.colSpending.ProgressDisplayMode = FrEee.UI.WinForms.DataGridView.ProgressDisplayMode.Percentage; + this.colSpending.ProgressDisplayMode = FrEee.Utility.ProgressDisplayMode.Percentage; this.colSpending.ReadOnly = true; this.colSpending.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Automatic; // diff --git a/FrEee.UI.WinForms/Forms/ResearchForm.cs b/FrEee.UI.WinForms/Forms/ResearchForm.cs index fc9289f2c..d2c8937e1 100644 --- a/FrEee.UI.WinForms/Forms/ResearchForm.cs +++ b/FrEee.UI.WinForms/Forms/ResearchForm.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Utility; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/ScoresForm.cs b/FrEee.UI.WinForms/Forms/ScoresForm.cs index 99c4098e7..03076eef1 100644 --- a/FrEee.UI.WinForms/Forms/ScoresForm.cs +++ b/FrEee.UI.WinForms/Forms/ScoresForm.cs @@ -5,6 +5,7 @@ using System.Drawing; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/StatusForm.cs b/FrEee.UI.WinForms/Forms/StatusForm.cs index 155125c4d..a0770be23 100644 --- a/FrEee.UI.WinForms/Forms/StatusForm.cs +++ b/FrEee.UI.WinForms/Forms/StatusForm.cs @@ -3,6 +3,7 @@ using System; using System.Threading; using System.Windows.Forms; +using FrEee.Utility; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/TechTreeForm.cs b/FrEee.UI.WinForms/Forms/TechTreeForm.cs index 9e937bbf7..5f8038760 100644 --- a/FrEee.UI.WinForms/Forms/TechTreeForm.cs +++ b/FrEee.UI.WinForms/Forms/TechTreeForm.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/Forms/VehicleDesignForm.cs b/FrEee.UI.WinForms/Forms/VehicleDesignForm.cs index 20e3ea197..2af86e5ad 100644 --- a/FrEee.UI.WinForms/Forms/VehicleDesignForm.cs +++ b/FrEee.UI.WinForms/Forms/VehicleDesignForm.cs @@ -14,6 +14,7 @@ using System.Windows.Forms; using FrEee.Objects.Vehicles; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Forms; diff --git a/FrEee.UI.WinForms/FrEee.UI.WinForms.csproj b/FrEee.UI.WinForms/FrEee.UI.WinForms.csproj index dd4522c0f..dd5b5f6fd 100644 --- a/FrEee.UI.WinForms/FrEee.UI.WinForms.csproj +++ b/FrEee.UI.WinForms/FrEee.UI.WinForms.csproj @@ -16,8 +16,10 @@ + + - + diff --git a/FrEee.UI.WinForms/GamePropertyGrid.cs b/FrEee.UI.WinForms/GamePropertyGrid.cs index 33ae16aa0..46aae7fda 100644 --- a/FrEee.UI.WinForms/GamePropertyGrid.cs +++ b/FrEee.UI.WinForms/GamePropertyGrid.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Extensions; namespace FrEee.UI.WinForms; diff --git a/FrEee.UI.WinForms/Objects/ClientSettings.cs b/FrEee.UI.WinForms/Objects/ClientSettings.cs index 1d8f0d0da..2bf444767 100644 --- a/FrEee.UI.WinForms/Objects/ClientSettings.cs +++ b/FrEee.UI.WinForms/Objects/ClientSettings.cs @@ -7,6 +7,7 @@ using System.Drawing; using System.IO; using System.Windows.Forms; +using FrEee.Utility; namespace FrEee.UI.WinForms.Objects; diff --git a/FrEee.UI.WinForms/Objects/Music.cs b/FrEee.UI.WinForms/Objects/Music.cs index 6d21c4cc6..184821b43 100644 --- a/FrEee.UI.WinForms/Objects/Music.cs +++ b/FrEee.UI.WinForms/Objects/Music.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using FrEee.Extensions; namespace FrEee.UI.WinForms.Objects; diff --git a/FrEee.UI.WinForms/Program.cs b/FrEee.UI.WinForms/Program.cs index 3a7edf3b6..b6f809b67 100644 --- a/FrEee.UI.WinForms/Program.cs +++ b/FrEee.UI.WinForms/Program.cs @@ -15,6 +15,7 @@ using System.Text.RegularExpressions; using System.Windows.Forms; using FrEee.Objects.GameState; +using FrEee.Utility; namespace FrEee.UI.WinForms; diff --git a/FrEee.UI.WinForms/Properties/DataSources/FrEee.Game.Setup.WarpPointPlacementStrategies.WarpPointPlacementStrategy.datasource b/FrEee.UI.WinForms/Properties/DataSources/FrEee.Game.Setup.WarpPointPlacementStrategies.WarpPointPlacementStrategy.datasource index 37595e94c..f094e4a35 100644 --- a/FrEee.UI.WinForms/Properties/DataSources/FrEee.Game.Setup.WarpPointPlacementStrategies.WarpPointPlacementStrategy.datasource +++ b/FrEee.UI.WinForms/Properties/DataSources/FrEee.Game.Setup.WarpPointPlacementStrategies.WarpPointPlacementStrategy.datasource @@ -6,5 +6,5 @@ cause the file to be unrecognizable by the program. --> - FrEee.Setup.WarpPointPlacementStrategies.WarpPointPlacementStrategy, FrEee, Version=0.0.2.0, Culture=neutral, PublicKeyToken=null + FrEee.Processes.Setup.WarpPointPlacementStrategies.WarpPointPlacementStrategy, FrEee, Version=0.0.2.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/FrEee.sln b/FrEee.sln index d6ca16e9f..246107b54 100644 --- a/FrEee.sln +++ b/FrEee.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.8.34601.278 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrEee", "FrEee\FrEee.csproj", "{ECA7A08B-992A-43EC-8D98-2AE887897343}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrEee.Tests", "FrEee.Tests\FrEee.Tests.csproj", "{16D44CA4-5037-4537-93BF-C18F21F1A335}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{E6AD02C7-FCE2-45BF-AB0D-8A5848DC4325}" @@ -20,6 +18,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrEee.UI.Blazor", "FrEee.UI EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrEee.UI.WinForms", "FrEee.UI.WinForms\FrEee.UI.WinForms.csproj", "{6AD78129-8271-44B7-A01A-FF75F61CCF2D}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrEee.Core.Utility", "FrEee.Core.Utility\FrEee.Core.Utility.csproj", "{84246F9D-DD31-4E8B-BA70-1006FA551083}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FrEee.Core", "FrEee.Core\FrEee.Core.csproj", "{ECA7A08B-992A-43EC-8D98-2AE887897343}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -30,18 +32,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|x64.ActiveCfg = Debug|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|x64.Build.0 = Debug|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|x86.ActiveCfg = Debug|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|x86.Build.0 = Debug|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|Any CPU.Build.0 = Release|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|x64.ActiveCfg = Release|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|x64.Build.0 = Release|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|x86.ActiveCfg = Release|Any CPU - {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|x86.Build.0 = Release|Any CPU {16D44CA4-5037-4537-93BF-C18F21F1A335}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {16D44CA4-5037-4537-93BF-C18F21F1A335}.Debug|Any CPU.Build.0 = Debug|Any CPU {16D44CA4-5037-4537-93BF-C18F21F1A335}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -90,6 +80,30 @@ Global {6AD78129-8271-44B7-A01A-FF75F61CCF2D}.Release|x64.Build.0 = Release|Any CPU {6AD78129-8271-44B7-A01A-FF75F61CCF2D}.Release|x86.ActiveCfg = Release|Any CPU {6AD78129-8271-44B7-A01A-FF75F61CCF2D}.Release|x86.Build.0 = Release|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Debug|x64.ActiveCfg = Debug|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Debug|x64.Build.0 = Debug|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Debug|x86.ActiveCfg = Debug|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Debug|x86.Build.0 = Debug|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Release|Any CPU.Build.0 = Release|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Release|x64.ActiveCfg = Release|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Release|x64.Build.0 = Release|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Release|x86.ActiveCfg = Release|Any CPU + {84246F9D-DD31-4E8B-BA70-1006FA551083}.Release|x86.Build.0 = Release|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|x64.ActiveCfg = Debug|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|x64.Build.0 = Debug|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|x86.ActiveCfg = Debug|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Debug|x86.Build.0 = Debug|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|Any CPU.Build.0 = Release|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|x64.ActiveCfg = Release|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|x64.Build.0 = Release|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|x86.ActiveCfg = Release|Any CPU + {ECA7A08B-992A-43EC-8D98-2AE887897343}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FrEee/Objects/AI/AI.cs b/FrEee/Objects/AI/AI.cs deleted file mode 100644 index 078597e7c..000000000 --- a/FrEee/Objects/AI/AI.cs +++ /dev/null @@ -1,72 +0,0 @@ -using FrEee.Modding; -using FrEee.Modding.Scripts; -using FrEee.Utility; -using System; -using System.Collections.Generic; - -namespace FrEee.Objects.AI; - -/// -/// An AI script which has control over a domain. -/// -/// The type of domain. -/// The type of contextual data that the AI needs to be aware of. -[Serializable] -public abstract class AI : IModObject -{ - public AI(string name, IScript script, SafeDictionary> ministerNames) - { - Name = name; - Script = script; - MinisterNames = ministerNames; - } - - public bool IsDisposed { get; private set; } - - /// - /// The names of any ministers that the AI can use, keyed by category. - /// - public SafeDictionary> MinisterNames { get; private set; } - - - public string ModID { get; set; } - - public string Name - { - get; - private set; - } - - /// - /// The script to run. - /// - public IScript Script { get; protected set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - /// - /// Allows the AI to act on its domain using information from its context. - /// - /// The AI's domain of control. - /// Contextual data that the AI needs to be aware of. - /// The names of any ministers that the player has enabled, keyed by category. - public abstract void Act(TDomain domain, TContext context, SafeDictionary> enabledMinisters); - - - public void Dispose() - { - // TODO - remove from mod? - IsDisposed = true; - } - - public override string ToString() - { - return Name; - } - - - -} \ No newline at end of file diff --git a/FrEee/Objects/AI/CSAI.cs b/FrEee/Objects/AI/CSAI.cs deleted file mode 100644 index a3efbe1fb..000000000 --- a/FrEee/Objects/AI/CSAI.cs +++ /dev/null @@ -1,64 +0,0 @@ -using FrEee.Objects.Civilization; -using FrEee.Modding; -using FrEee.Utility; -using Microsoft.CodeAnalysis.Scripting; -using System; -using System.Collections.Generic; -using FrEee.Objects.GameState; - -namespace FrEee.Objects.AI; - -[Serializable] - public class CSAI : AI where TDomain : Empire where TContext : Galaxy - { - public CSAI(string name, CSScript script, SafeDictionary> ministerNames) - : base(name, script, ministerNames) - { - ScriptRunner = script.CreateScriptObject(); - } - - - /// - /// The object that holds a cs script within memory. - /// - public ScriptRunner ScriptRunner; - - public override void Act(TDomain domain, TContext context, SafeDictionary> EnabledMinisters) - { - try - { - //NOTE: this really should be run as its own seperate program, passing information back and forth. - // Reason being, there is nothing to stop a script from doing things like creating files. - //This means it is a security risk to run scripts as mods are usually done so. - // By running in a seperate process, it can be sandboxed by the system, limiting its rights. - //however, such is a lot more intensive than this. - var global = new Globals() { Context = context, Domain = domain, EnabledMinisters = EnabledMinisters }; - - var task = ScriptRunner.Invoke(globals: global); - - task.Wait(); - var result = task.Result; - if (result != null) - domain = result; - - } - catch (Exception) - { - throw; - //error log? - } - } - } - - - /// - /// Local class containing the tdomain and tcontext. - /// - public class Globals - { - public Empire Domain; - - public Galaxy Context; - - public SafeDictionary> EnabledMinisters; - } diff --git a/FrEee/Objects/AI/PythonAI.cs b/FrEee/Objects/AI/PythonAI.cs deleted file mode 100644 index f4b8b73e2..000000000 --- a/FrEee/Objects/AI/PythonAI.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FrEee.Modding; -using FrEee.Utility; -using System; -using System.Collections.Generic; - -namespace FrEee.Objects.AI; - -[Serializable] - public class PythonAI : AI - { - public PythonAI(string name, PythonScript script, SafeDictionary> ministerNames) : base(name, script, ministerNames) - { - } - - public override void Act(TDomain domain, TContext context, SafeDictionary> EnabledMinisters) - { - - var variables = new Dictionary(); - variables.Add("domain", domain); - var readOnlyVariables = new Dictionary(); - readOnlyVariables.Add("context", context); - readOnlyVariables.Add("enabledMinisters", EnabledMinisters); - PythonScriptEngine.RunScript(Script as PythonScript, variables, readOnlyVariables); - - } - } diff --git a/FrEee/Objects/Abilities/Ability.cs b/FrEee/Objects/Abilities/Ability.cs deleted file mode 100644 index 1a4a11a80..000000000 --- a/FrEee/Objects/Abilities/Ability.cs +++ /dev/null @@ -1,212 +0,0 @@ -using FrEee.Objects.Civilization; -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Objects.Abilities; - -/// -/// A special ability of some game object, or just a tag used by the AI or by modders. -/// -[Serializable] -public class Ability : IContainable, IReferrable, IModObject, IDataObject, IFormulaHost -{ - public Ability(IAbilityObject container) - { - Container = container; - Values = new List>(); - } - - public Ability(IAbilityObject container, AbilityRule rule, Formula? description = null, params object[] values) - { - Container = container; - Rule = rule; - Description = description; - Values = new List>(); - foreach (var val in values) - { - if (val is IFormula f) - { - Values.Add(f.ToStringFormula()); - } - else if (val is IEnumerable fs) - { - foreach (var ff in fs) - { - Values.Add(ff.ToStringFormula()); - } - } - else - { - Values.Add(new LiteralFormula(val.ToString())); - } - } - } - - [DoNotCopy] - public IAbilityObject Container { get; private set; } - - public virtual SafeDictionary Data - { - get - { - var dict = new SafeDictionary(); - dict[nameof(rule)] = rule; - dict[nameof(Description)] = Description; - dict[nameof(Values)] = Values; - dict[nameof(Container)] = Container; - dict[nameof(ID)] = ID; - dict[nameof(IsDisposed)] = IsDisposed; - dict[nameof(ModID)] = ModID; - return dict; - } - - set - { - rule = value[nameof(rule)].Default>(); - Description = value[nameof(Description)].Default>(); - Values = value[nameof(Values)].Default>>(); - Container = value[nameof(Container)].Default(); - ID = value[nameof(ID)].Default(); - IsDisposed = value[nameof(IsDisposed)].Default(); - ModID = value[nameof(ModID)].Default(); - } - } - - /// - /// A description of the ability's effects. - /// Can use, e.g. [%Amount1%] to specify the amount in the Value 1 field. - /// - public Formula? Description { get; set; } - - /// - /// Key for ability groups. - /// - public IEnumerable Group - { - get - { - var list = new List(); - for (int i = 0; i < Rule.ValueRules.Count; i++) - { - if (Rule.ValueRules.Count > i && Rule.ValueRules[i] == AbilityValueRule.Group) - yield return Values[i]; - yield return ""; - } - } - } - - public long ID - { - get; - set; - } - - public bool IsDisposed - { - get; - set; - } - - public string ModID - { - get; - set; - } - - public string Name - { - get { return null; } // TODO - should abilities even have names? - } - - public Empire Owner - { - get - { - if (Container is IOwnable) - return (Container as IOwnable).Owner; - return null; - } - } - - /// - /// The ability rule which defines what ability this is. - /// - [DoNotCopy] - public AbilityRule Rule { get { return rule; } set { rule = value; } } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - /// - /// The first value of the ability. Not all abilities have values, so this might be null! - /// - public Formula Value1 - { - get - { - return Values.ElementAtOrDefault(0); - } - } - - /// - /// The second value of the ability. Not all abilities have two values, so this might be null! - /// - public Formula Value2 - { - get - { - return Values.ElementAtOrDefault(1); - } - } - - /// - /// Extra data for the ability. - /// - public IList> Values { get; set; } - - public IDictionary Variables - { - get - { - var dict = new Dictionary(); - for (var i = 0; i < Values.Count; i++) - dict.Add("Amount" + (i + 1), Values[i]); - if (Rule.Matches("Shield Generation") || Rule.Matches("Phased Shield Generation") || Rule.Matches("Planet - Shield Generation")) - dict.Add("ShieldPointsGenerated", Value1.ToInt()); // TODO - take into account mounts that affect shields - return dict; - } - } - - private ModReference rule { get; set; } - - public void Dispose() - { - if (IsDisposed) - return; - if (Container is IAbilityContainer) - (Container as IAbilityContainer).Abilities.Remove(this); - Galaxy.Current.UnassignID(this); - } - - public override string ToString() - { - // get basic description - string result; - if (Description != null) - result = Description.Evaluate(this, TemplateParameters); - else if (Rule.Description != null) - result = Rule.Description.Evaluate(this, TemplateParameters); - else - result = Rule.Name + ": " + string.Join(", ", Values.Select(v => v.Value)); - - return result; - } -} diff --git a/FrEee/Objects/Abilities/AbilityRule.cs b/FrEee/Objects/Abilities/AbilityRule.cs deleted file mode 100644 index 24f550c38..000000000 --- a/FrEee/Objects/Abilities/AbilityRule.cs +++ /dev/null @@ -1,290 +0,0 @@ -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; - -namespace FrEee.Objects.Abilities; - -/// -/// A rule for grouping and stacking abilities. -/// -[Serializable] -public class AbilityRule : IModObject -{ - public AbilityRule() - { - ValueRules = new List(); - GroupRules = new List(); - Aliases = new HashSet(); - } - - /// - /// Aliases for this ability's name. - /// These must not be aliases or names of other abilities. - /// - public ICollection Aliases { get; set; } - - /// - /// A default description for abilities which do not provide their own description. - /// Can use, e.g. [%Amount1%] to specify the amount in the Value 1 field. - /// - public Formula Description { get; set; } - - /// - /// The rules for stacking abilities after grouping. - /// - public IList GroupRules { get; set; } - - public bool IsActivatable - { - get - { - // TODO - scriptable ability rules - return Matches("Emergency Resupply") || - Matches("Emergency Energy") || - Matches("Self-Destruct") || - Matches("Open Warp Point") || - Matches("Close Warp Point") || - Matches("Create Planet Size") || - Matches("Destroy Planet Size") || - Matches("Create Star") || - Matches("Destroy Star") || - Matches("Create Storm") || - Matches("Destroy Storm") || - Matches("Create Nebulae") || - Matches("Destroy Nebulae") || - Matches("Create Black Hole") || - Matches("Destroy Black Hole") || - Matches("Create Constructed Planet - Star") || - Matches("Create Constructed Planet - Planet") || - Matches("Create Constructed Planet - Storm") || - Matches("Create Constructed Planet - Warp Point") || - Matches("Create Constructed Planet - Asteroids") || - Matches("Create Constructed Planet - Space"); - } - } - - public bool IsDisposed - { - get - { - // can't be disposed of - return false; - } - } - - public string ModID - { - get; - set; - } - - /// - /// The name of the ability to which this rule applies. - /// - public string Name { get; set; } - - /// - /// Valid targets for this ability. - /// - public AbilityTargets Targets { get; set; } - - /// - /// Parameters from the mod meta templates. - /// - public IDictionary TemplateParameters { get; set; } - - /// - /// The rules for grouping and stacking abilities. - /// - public IList ValueRules { get; set; } - - /// - /// Finds an ability rule in the current mod. - /// - /// The name or alias. - /// The ability rule, or null if none matches. - public static AbilityRule Find(string nameOrAlias) - { - return Mod.Current.AbilityRules.Where(r => r.Matches(nameOrAlias)).SingleOrDefault(); - } - - /// - /// Can this ability target something? - /// - /// - /// - public bool CanTarget(AbilityTargets target) - { - return Targets.HasFlag(target); - } - - public void Dispose() - { - // nothing to do - } - - /// - /// Groups and stacks abilities. - /// - /// - /// - public ILookup GroupAndStack(IEnumerable abilities, IAbilityObject stackingTo) - { - var ours = abilities.Where(a => a.Rule == this).ToArray(); - - // group abilities - var dict = new SafeDictionary, ICollection>(); - var groupIndices = new List(); - for (int i = 0; i < ValueRules.Count; i++) - { - if (ValueRules[i] == AbilityValueRule.Group) - groupIndices.Add(i); - } - foreach (var a in ours) - { - // treat non-group indices as "equal" for grouping purposes - var key = a.Values.Select((v, i) => groupIndices.Contains(i) ? v.Value : "").ToList(); - var existingKey = dict.Keys.SingleOrDefault(k => k.SequenceEqual(key)); - if (existingKey == null) - { - dict[key] = new List(); - dict[key].Add(a); - } - else - dict[existingKey].Add(a); - } - - // stack abilities - var stackedInGroups = new SafeDictionary>(); - foreach (var group in dict.Values) - { - var stacked = Stack(group, stackingTo, false); - foreach (var stack in stacked) - stackedInGroups.Add(stack.Key, stack); - } - - var final = new List>(); - - // stack grouped abilities if needed - if (ValueRules.Any(r => r == AbilityValueRule.Group)) - { - var groupLeaders = stackedInGroups.Select(g => g.Key); - var stacked = Stack(groupLeaders, stackingTo, true); - foreach (var stack in stacked) - { - foreach (var a in stack) - final.Add(Tuple.Create(stack.Key, a)); - } - } - else - { - foreach (var group in stackedInGroups) - final.Add(Tuple.Create(group.Key, group.Key)); - } - - return final.ToLookup(t => t.Item1, t => t.Item2); - } - - /// - /// Does the specified name match this ability's name or aliases? - /// - /// - /// - public bool Matches(string name) - { - return name == Name || Aliases.Contains(name); - } - - /// - /// Does this rule's name or any of its aliases start with the specified prefix? - /// - /// - /// - public bool StartsWith(string prefix) - { - return Name.StartsWith(prefix) || Aliases.Any(a => a.StartsWith(prefix)); - } - - public override string ToString() - { - return Name; - } - - private ILookup Stack(IEnumerable abilities, IAbilityObject stackingTo, bool groupStacking) - { - if (abilities.Count() <= 1) - return abilities.ToLookup(a => a, a => a); - - var results = new SafeDictionary(); // keys = original abilities, values = stacked abilities - foreach (var abil in abilities) - { - for (int i = 0; i < abil.Values.Count; i++) - { - AbilityValueRule rule; - if (groupStacking) - rule = GroupRules.ElementAtOrDefault(i); - else - rule = ValueRules.ElementAtOrDefault(i); - // TODO - don't repeatedly convert to/from strings, just do it once outside the loop - double? oldval = null; - if (results[abil] != null) - oldval = results[abil].Values.Count > i ? (double?)results[abil].Values[i].Value.ToDouble() : null; - else - { - var match = results.Values.Distinct().Where(a => a != null).SingleOrDefault(a => a.Rule == abil.Rule && a.Values.Select((val, idx) => rule != AbilityValueRule.Group && rule != AbilityValueRule.None || a.Values.Count >= abil.Values.Count && a.Values[idx] == abil.Values[idx]).All(b => b)); - - if (match != null) - { - results[abil] = match; - oldval = results[abil].Values.Count > i ? (double?)results[abil].Values[i].Value.ToDouble() : null; - } - else - results[abil] = new Ability(stackingTo, abil.Rule); - } - double incoming = abil.Values.Count > i ? abil.Values[i].Value.ToDouble() : 0; - double newval = oldval ?? 0; - if (rule == AbilityValueRule.Add) - newval = (oldval ?? 0) + incoming; - else if (rule == AbilityValueRule.TakeAverage) - newval = (oldval ?? 0) + incoming / abilities.Count(); - else if (rule == AbilityValueRule.TakeHighest) - { - if (oldval == null) - newval = incoming; - else - newval = Math.Max(oldval.Value, incoming); - } - else if (rule == AbilityValueRule.TakeLowest) - { - if (oldval == null) - newval = incoming; - else - newval = Math.Min(oldval.Value, incoming); - } - else // group or none - newval = incoming; - if (results[abil].Values.Count > i) - results[abil].Values[i] = newval.ToString(CultureInfo.InvariantCulture); - else - { - while (results[abil].Values.Count < i) - results[abil].Values.Add(null); - results[abil].Values.Add(newval.ToString(CultureInfo.InvariantCulture)); - } - } - } - foreach (var kvp in results) - { - if (results.Values.Where(a => a == kvp.Value).Count() == 1) - { - // ability is "stacked" alone, just use the original ability description - results[kvp.Key].Description = kvp.Key.Description; - } - } - return results.ToLookup(kvp => kvp.Value, kvp => kvp.Key); - } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/BeamWeaponDisplayEffect.cs b/FrEee/Objects/Combat/BeamWeaponDisplayEffect.cs deleted file mode 100644 index 0803c2dbb..000000000 --- a/FrEee/Objects/Combat/BeamWeaponDisplayEffect.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Drawing; - -namespace FrEee.Objects.Combat; - -[Serializable] -public class BeamWeaponDisplayEffect : WeaponDisplayEffect -{ - public BeamWeaponDisplayEffect(string name) - : base(name) - { - } - - public override Point GlobalSpriteOffset - { - get { return new Point(); } - } - - public override string GlobalSpriteSheetName - { - get { return "Beams"; } - } - - public override Point ShipsetSpriteOffset - { - get { return new Point(); } - } - - public override string ShipsetSpriteSheetName - { - get { return "Beams"; } - } - - public override Size SpriteSize - { - get { return new Size(20, 20); } - } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Grid/Battle.cs b/FrEee/Objects/Combat/Grid/Battle.cs deleted file mode 100644 index 9296a3e04..000000000 --- a/FrEee/Objects/Combat/Grid/Battle.cs +++ /dev/null @@ -1,761 +0,0 @@ -using FrEee.Objects.Civilization; -using FrEee.Objects.LogMessages; -using FrEee.Objects.Space; -using FrEee.Objects.Technology; -using FrEee.Objects.Vehicles; -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using static System.Math; -using FrEee.Objects.Civilization.CargoStorage; -using FrEee.Objects.GameState; - -namespace FrEee.Objects.Combat.Grid; - -public abstract class Battle : IBattle, IDisposable -{ - static Battle() - { - Current = new HashSet(); - Previous = new HashSet(); - } - - public Battle() - { - Log = new List(); - - double stardate = Galaxy.Current.Timestamp; - Timestamp = stardate; - } - - /// - /// Any battles that are currently ongoing. - /// This is a collection so we can multithread battle resolution if so desired. - /// - public static ICollection Current { get; private set; } - - /// - /// Any battles that have completed this turn. - /// - public static ICollection Previous { get; private set; } - - /// - /// The combatants in this battle. - /// - public ISet Combatants { get; protected set; } - - /// - /// Copies of the combatants from the start of the battle. - /// - public IDictionary StartCombatants { get; private set; } = new SafeDictionary(); - - /// - /// Copies of the combatants from the end of the battle. - /// - public IDictionary EndCombatants { get; private set; } = new SafeDictionary(); - - /// - /// Starting HP of all combatants. - /// - [Obsolete("OriginalHitpoints is obsolete, use StartCombatants.")] - // TODO - remove after games are over - public SafeDictionary OriginalHitpoints { get; private set; } = new SafeDictionary(); - - /// - /// Who originally owned each combatant? - /// - [Obsolete("OriginalOwners is obsolete, use StartCombatants.")] - // TODO - remove after games are over - public SafeDictionary OriginalOwners { get; private set; } = new SafeDictionary(); - - /// - /// Who launched each unit? So we can recover them after combat. - /// - [DoNotSerialize(false)] - private SafeDictionary Launchers { get; set; } = new SafeDictionary(); - - /// - /// Saved-up fractional combat speed from the previous round. - /// - [DoNotSerialize(false)] - public SafeDictionary CombatSpeedBuffer { get; private set; } = new SafeDictionary(); - - /// - /// The percentage of normal damage that weapons inflict. - /// - public abstract int DamagePercentage { get; } - - public PRNG Dice { get; set; } - - /// - /// The number of rounds this battle lasted. - /// - public int Duration => Events.Count; - - /// - /// The empires engaged in battle. - /// - public IEnumerable Empires { get; protected set; } - - public List> Events - { - get; private set; - } - - public Image Icon - { - get { return Combatants.OfType().Largest()?.Icon; } - } - - public Image Icon32 => Icon.Resize(32); - - public IEnumerable IconPaths - { - get - { - return Combatants.OfType().Largest()?.IconPaths ?? Enumerable.Empty(); - } - } - - private SafeDictionary DistancesToTargets { get; } = new SafeDictionary(); - - private SafeDictionary> IgnoredTargets { get; } = new SafeDictionary>(true); - - public IList Log { get; private set; } - - public IList> LowerRight { get; private set; } = new List>(); - - public abstract int MaxRounds { get; } - - /// - /// The name of the battle. Battles are typicaly named after their location. - /// - public abstract string Name { get; } - - public System.Drawing.Image Portrait - { - get { return Combatants.OfType().Largest()?.Portrait; } - } - - public IEnumerable PortraitPaths - { - get - { - return Combatants.OfType().Largest()?.PortraitPaths ?? Enumerable.Empty(); - } - } - - /// - /// The sector in which this battle took place. - /// - public Sector Sector { get; set; } - - /// - /// The star system in which this battle took place. - /// - public StarSystem StarSystem { get { return Sector.StarSystem; } } - - public double Timestamp { get; private set; } - - public IList> UpperLeft { get; private set; } = new List>(); - - public int GetDiameter(int round) - { - return UpperLeft[round].DistanceToEightWay(LowerRight[round]) + 1; - } - - public virtual void Initialize(IEnumerable combatants) - { - Combatants = combatants.ToHashSet(); - StartCombatants = combatants.Select(c => new { ID = c.ID, Copy = c.CopyAndAssignNewID() }).ToDictionary(q => q.ID, q => q.Copy); - } - - public abstract void PlaceCombatants(SafeDictionary> locations); - - /// - /// Resolves the battle. - /// - public void Resolve() - { - // update memories - foreach (var sobj in StarSystem.SpaceObjects.Where(x => !x.IsMemory).ToArray()) - sobj.UpdateEmpireMemories(); - - Current.Add(this); - - var reloads = new SafeDictionary(); - var locations = new SafeDictionary>(); - - PlaceCombatants(locations); - - Events = new List>(); - - UpdateBounds(0, locations.Values); - - // let all combatants scan each other - foreach (var c in Combatants) - c.UpdateEmpireMemories(); - - // make a query so we can check who's alive - var alives = Combatants.Where(q => q.IsAlive); - - for (int i = 0; i < MaxRounds; i++) - { - var combatSpeeds = new SafeDictionary(); - var multiplex = new SafeDictionary>(true); - foreach (var c in Combatants) - combatSpeeds[c] = c.CombatSpeed; - - int GetCombatSpeedThisRound(ICombatant c) - { - return (int)(combatSpeeds[c] + CombatSpeedBuffer[c]); - } - - Events.Add(new List()); - - if (i == 0) - { - // first round, all combatants appear - foreach (var c in Combatants) - Events.Last().Add(new CombatantAppearsEvent(this, c, locations[c])); - } - - var turnorder = alives.OrderBy(x => x is Seeker ? 1 : 0).ThenBy(x => combatSpeeds[x]).ThenShuffle(Dice).ToArray(); - - // phase 0: reload weapons - foreach (var w in turnorder.SelectMany(q => q.Weapons)) - { - reloads[w]--; - if (reloads[w] < 0) - reloads[w] = 0; - } - - // phase 1: combatants move starting with the slowest (so the faster ships get to react to their moves) - but seekers go last so they get a chance to hit - foreach (var c in turnorder) - { - var oldpos = locations[c]; - if (c is Seeker s) - { - if (locations[s] == null) - continue; // HACK - seeker is destroyed but still showing up in turn order - if (locations[s.Target] == null) - { - s.Hitpoints = 0; // seekers self destruct when their target is destroyed - Events.Last().Add(new CombatantDestroyedEvent(this, s, locations[s])); - continue; - } - s.DistanceTraveled += Math.Min(GetCombatSpeedThisRound(c), locations[s].DistanceToEightWay(locations[s.Target])); - locations[s] = Vector2.InterpolateEightWay(locations[s], locations[s.Target], GetCombatSpeedThisRound(c)); - if (s.DistanceTraveled > s.WeaponInfo.MaxRange) - { - s.Hitpoints = 0; - Events.Last().Add(new CombatantDestroyedEvent(this, s, locations[s])); - } - } - else - { - // TODO - both pursue target and evade scary enemies at the same time using heatmap - // find out how good each target is - var targetiness = new SafeDictionary(); - foreach (var target in alives.Where(x => - c.IsHostileTo(x.Owner) && - (c.CanTarget(x) || (x is Planet && c is ICargoContainer cc && cc.Cargo.Units.OfType().Any())))) - { - targetiness[target] = 1d / (locations[target] - locations[c]).LengthEightWay; - } - - if (!targetiness.Any()) - { - // evade enemies - var heatmap = new HeatMap(); - foreach (var e in alives.Where(x => x.IsHostileTo(c.Owner) && x.CanTarget(c))) - { - int threat; - if (e.Weapons.Any()) - threat = GetCombatSpeedThisRound(e) + e.Weapons.Where(w => w.CanTarget(c)).Max(w => w.Template.WeaponMaxRange); - else - threat = 0; - heatmap.AddLinearGradientEightWay(locations[e], threat, threat, -1); - } - if (c.FillsCombatTile) - { - // only one ship/base/planet per tile - foreach (var tile in heatmap.ToArray()) - { - if (locations.Any(q => q.Key.FillsCombatTile && q.Value == tile.Key)) - heatmap.Remove(tile.Key); - } - } - if (heatmap.Any()) - locations[c] = heatmap.FindMin(locations[c], GetCombatSpeedThisRound(c)); - } - else - { - // move to max range that we can inflict max damage on best target - var goodTargets = targetiness.Where(x => !IgnoredTargets[c].Contains(x.Key)).WithMax(x => x.Value); - ICombatant bestTarget = null; - if (goodTargets.Any()) - bestTarget = goodTargets.First().Key; - if (bestTarget == null) - { - // try previously ignored targets - IgnoredTargets[c].Clear(); - goodTargets = targetiness.Where(x => !IgnoredTargets[c].Contains(x.Key)).WithMax(x => x.Value); - if (goodTargets.Any()) - bestTarget = goodTargets.First().Key; - } - if (bestTarget != null) - { - gotosAreEvil: - var maxdmg = 0; - var maxdmgrange = 0; - if (c.Weapons.Any()) - { - for (var range = 0; range < c.Weapons.Max(w => w.Template.WeaponMaxRange); range++) - { - var dmg = c.Weapons.Where(w => w.CanTarget(bestTarget)).Sum(w => w.Template.GetWeaponDamage(range)); - if (dmg >= maxdmg) - { - maxdmg = dmg; - maxdmgrange = range; - } - } - } - if (c.Weapons.Any(w => w.Template.ComponentTemplate.WeaponInfo.IsSeeker) - && locations[c].DistanceToEightWay(locations[bestTarget]) > DistancesToTargets[c]) - { - // adjust desired range due to seeker speed and target speed if retreating - var roundsToClose = c.Weapons.Where(w => w.Template.ComponentTemplate.WeaponInfo.IsSeeker).Max(w => - (int)Math.Ceiling((double)w.Template.WeaponMaxRange / (double)(w.Template.ComponentTemplate.WeaponInfo as SeekingWeaponInfo).SeekerSpeed)); - var distanceAdjustment = (int)Ceiling(combatSpeeds[bestTarget] * roundsToClose); - maxdmgrange -= distanceAdjustment; - if (maxdmgrange < 0) - maxdmgrange = 0; - } - var targetPos = locations[bestTarget]; - var tiles = new HashSet>(); - for (var x = targetPos.X - maxdmgrange; x <= targetPos.X + maxdmgrange; x++) - { - tiles.Add(new Vector2(x, targetPos.Y - maxdmgrange)); - tiles.Add(new Vector2(x, targetPos.Y + maxdmgrange)); - } - for (var y = targetPos.Y - maxdmgrange; y <= targetPos.Y + maxdmgrange; y++) - { - tiles.Add(new Vector2(targetPos.X - maxdmgrange, y)); - tiles.Add(new Vector2(targetPos.X + maxdmgrange, y)); - } - if (c.FillsCombatTile) - { - foreach (var tile in tiles.ToArray()) - { - if (locations.Any(q => q.Key.FillsCombatTile && q.Value == tile)) - tiles.Remove(tile); - } - } - if (tiles.Any()) - { - var closest = tiles.WithMin(t => t.DistanceToEightWay(locations[c])).First(); - locations[c] = Vector2.InterpolateEightWay(locations[c], closest, GetCombatSpeedThisRound(c), vec => locations.Values.Contains(vec)); - var newdist = locations[c].DistanceToEightWay(locations[bestTarget]); - if (DistancesToTargets.ContainsKey(c) && newdist >= DistancesToTargets[c] && combatSpeeds[c] <= combatSpeeds[bestTarget] && !c.Weapons.Any(w => w.Template.WeaponMaxRange >= newdist)) - { - DistancesToTargets.Remove(c); - IgnoredTargets[c].Add(bestTarget); // can't catch it, might as well find a new target - goodTargets = targetiness.Where(x => !IgnoredTargets[c].Contains(x.Key)).WithMax(x => x.Value); - bestTarget = null; - if (goodTargets.Any()) - bestTarget = goodTargets.First().Key; - if (bestTarget == null) - goto gotosAreVeryEvil; - goto gotosAreEvil; - } - else - DistancesToTargets[c] = newdist; - } - } - else - DistancesToTargets.Remove(c); - } - } - gotosAreVeryEvil: - if (locations[c] != oldpos) - Events.Last().Add(new CombatantMovesEvent(this, c, oldpos, locations[c])); - } - - UpdateBounds(i, locations.Values); - - // phase 2: combatants launch units - foreach (var c in turnorder) - { - // find launchable units - var unitsToLaunch = new List<(ICombatant Launcher, SpaceVehicle Launchee)>(); - if (c is Planet) - { - // planets can launch infinite units per turn - var p = (Planet)c; - if (p.Cargo != null && p.Cargo.Units != null) - { - foreach (var u in p.Cargo.Units.OfType()) - unitsToLaunch.Add((p, u)); - } - } - else if (c is ICargoTransferrer) - { - // ships, etc. can launch units based on abilities - var ct = (ICargoTransferrer)c; - foreach (var vt in Enum.GetValues(typeof(VehicleTypes)).Cast().Distinct()) - { - var rate = ct.GetAbilityValue("Launch/Recover " + vt.ToSpacedString() + "s").ToInt(); - foreach (var u in ct.Cargo.Units.Where(u => u.Design.VehicleType == vt).OfType().Take(rate)) - unitsToLaunch.Add((c, u)); - } - } - - // launch them temporarily for combat - foreach (var info in unitsToLaunch) - { - Launchers[info.Launchee] = info.Launcher; - if (info.Launcher is ICargoTransferrer ct && info.Launchee is IUnit u) - ct.RemoveUnit(u); - - Combatants.Add(info.Item2); - StartCombatants[info.Item2.ID] = info.Item2.Copy(); - for (var ix = 0; ix < info.Item2.Weapons.Count(); ix++) - { - var w = info.Item2.Weapons.ElementAt(ix); - var wc = StartCombatants[info.Item2.ID].Weapons.ElementAt(ix); - } - locations[info.Launchee] = new Vector2(locations[info.Launcher]); - Events.Last().Add(new CombatantLaunchedEvent(this, info.Launcher, info.Launchee, locations[info.Launchee])); - } - } - - turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); - - // phase 3: combatants fire point defense non-warhead weapons starting with the fastest (so the faster ships get to inflict damage first and possibly KO enemies preventing them from firing back) - foreach (var c in turnorder.Reverse()) - { - foreach (var w in c.Weapons.Where(w => w.Template.ComponentTemplate.WeaponInfo.IsPointDefense && !w.Template.ComponentTemplate.WeaponInfo.IsWarhead)) - TryFireWeapon(c, w, reloads, locations, multiplex); - } - - turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); - - // phase 4: point defense seekers detonate - foreach (var s in turnorder.Reverse().OfType().Where(s => s.WeaponInfo.IsPointDefense)) - { - CheckSeekerDetonation(s, locations); - } - - turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); - - // phase 5: ships fire non-PD non-warhead weapons starting with the fastest (so the faster ships get to inflict damage first and possibly KO enemies preventing them from firing back) - foreach (var c in turnorder.Reverse()) - { - foreach (var w in c.Weapons.Where(w => !w.Template.ComponentTemplate.WeaponInfo.IsPointDefense && !w.Template.ComponentTemplate.WeaponInfo.IsWarhead)) - TryFireWeapon(c, w, reloads, locations, multiplex); - } - - turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); - - // phase 6: non-PD seekers detonate - foreach (var s in turnorder.Reverse().OfType().Where(s => !s.WeaponInfo.IsPointDefense)) - { - CheckSeekerDetonation(s, locations); - } - - turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); - - // phase 7: ramming! only activates if ship has no other weapons - foreach (var c in turnorder.Reverse()) - { - if (!c.Weapons.Any(w => !w.Template.ComponentTemplate.WeaponInfo.IsWarhead)) - { - // TODO - add damage from ship HP on both sides - foreach (var w in c.Weapons.Where(w => w.Template.ComponentTemplate.WeaponInfo.IsWarhead)) - TryFireWeapon(c, w, reloads, locations, multiplex); - } - } - - turnorder = alives.OrderBy(x => x.CombatSpeed).ThenShuffle(Dice).ToArray(); - - // TODO - boarding - - // phase 8: drop troops - foreach (var c in turnorder.Reverse()) - { - if (c is ICargoTransferrer cc && cc.AllUnits.OfType().Any()) - { - // find enemy planets in the same square - var dropTargets = locations.Where(q => q.Key != c && q.Value == locations[c] && q.Key is Planet p && c.IsHostileTo(p.Owner)).Select(q => q.Key).Cast(); - var dropTarget = dropTargets.PickRandom(Dice); - if (dropTarget != null) - { - var cd = new CargoDelta(); - cd.UnitTypeTonnage.Add(VehicleTypes.Troop, null); - cc.TransferCargo(cd, dropTarget, cc.Owner, true); - var groundBattle = new GroundBattle(dropTarget); - groundBattle.Resolve(); - } - } - } - - // clear used combat speed buffer speed - foreach (var x in Combatants) - { - CombatSpeedBuffer[x] += x.CombatSpeed - Floor(x.CombatSpeed); - CombatSpeedBuffer[x] -= Floor(CombatSpeedBuffer[x]); - } - - UpdateBounds(i, locations.Values); - - bool hostile = false; - foreach (var a in alives) - { - foreach (var b in alives) - { - // TODO - check if ships want to ram even if they have no weapons - if (a.IsHostileTo(b.Owner) && a.Weapons.Any()) - { - hostile = true; - break; - } - } - if (hostile) - break; - } - if (!hostile) - break; - } - - // recover units - var orphans = new List(); - foreach (var u in Combatants.OfType()) - { - if (Launchers[u] is ICargoTransferrer cc && cc.CargoStorageFree() >= u.Design.Hull.Size && u.Owner == cc.Owner) - cc.Cargo.Units.Add(u); - else - orphans.Add(u); - } - foreach (var u in orphans) - { - var recoverer = Combatants.OfType().Where(q => q.CargoStorageFree() >= u.Design.Hull.Size && q.Owner == u.Owner).FirstOrDefault(); - if (recoverer != null) - recoverer.Cargo.Units.Add(u); - else - u.Dispose(); // no one can recover this unit, it is destroyed - } - - // save state of combatants at end of battle - set to undisposed so they don't get purged! - EndCombatants = Combatants.Select(c => new { ID = c.ID, Copy = c.CopyAndAssignNewID() }).ToDictionary(q => q.ID, q => q.Copy); - foreach (var c in EndCombatants.Values) - c.IsDisposed = false; - - // validate fleets since some ships might have died - foreach (var fleet in Sector.SpaceObjects.OfType()) - fleet.Validate(); - - // replenish combatants' shields - foreach (var combatant in Sector.SpaceObjects.OfType()) - combatant.ReplenishShields(); - - // mark battle complete - Current.Remove(this); - Previous.Add(this); - - // update memories - foreach (var sobj in Combatants.OfType().Where(x => !x.IsMemory).ToArray()) - { - foreach (var emp in Empires) - { - emp.UpdateMemory(sobj); ; - } - } - - // modify happiness - ModifyHappiness(); - } - - public abstract void ModifyHappiness(); - - public override string ToString() - { - return Name; - } - - private void CheckSeekerDetonation(Seeker s, SafeDictionary> locations) - { - if (locations[s] == locations[s.Target]) - { - var range = s.DistanceTraveled; - var shot = new Shot(s.LaunchingCombatant, s.LaunchingComponent, s.Target, range); - var hit = new Hit(shot, s.Target, s.Damage.Evaluate(shot)); - bool wasArmed = s.Target is Seeker || s.Target.Weapons.Any(); - s.Target.TakeDamage(hit, Dice); - bool isArmed = s.Target is Seeker || s.Target.Weapons.Any(); - Events.Last().Add(new CombatantsCollideEvent(this, s, s.Target, locations[s.Target], s.Hitpoints, hit.NominalDamage, false, wasArmed && !isArmed)); - s.Hitpoints = 0; - Events.Last().Add(new CombatantDestroyedEvent(this, s, locations[s])); - locations.Remove(s); - if (s.Target.IsDestroyed) - { - var loc = locations[s.Target]; - Events.Last().Add(new CombatantDestroyedEvent(this, s.Target, locations[s.Target])); - locations.Remove(s.Target); - } - } - } - - private void TryFireWeapon(ICombatant c, Component w, SafeDictionary reloads, SafeDictionary> locations, SafeDictionary> multiplex) - { - // find suitable targets in range - ICombatant target; - if (w.Template.ComponentTemplate.WeaponInfo.IsWarhead) - { - // warheads only work at range zero and are unaffected by multiplex tracking limits - target = Combatants.Where(x => - { - if (!x.IsAlive) - return false; - if (!x.Owner.IsEnemyOf(w.Owner, StarSystem)) - return false; - if (!w.CanTarget(x)) - return false; - var range = locations[c].DistanceToEightWay(locations[x]); - return range == 0; - }).FirstOrDefault(); - } - else if (w.Template.ComponentTemplate.WeaponInfo.IsPointDefense) - { - // point defense weapons are unaffected by multiplex tracking limits - target = Combatants.Where(x => - { - if (!x.IsAlive) - return false; - if (!x.Owner.IsEnemyOf(w.Owner, StarSystem)) - return false; - if (!w.CanTarget(x)) - return false; - var range = locations[c].DistanceToEightWay(locations[x]); - return range >= w.Template.WeaponMinRange && range <= w.Template.WeaponMaxRange; - }).FirstOrDefault(); - } - else - { - target = Combatants.Where(x => - { - if (!x.IsAlive) - return false; - if (!x.Owner.IsEnemyOf(c.Owner, StarSystem)) - return false; - if (!w.CanTarget(x)) - return false; - var range = locations[c].DistanceToEightWay(locations[x]); - return range >= w.Template.WeaponMinRange && range <= w.Template.WeaponMaxRange; - }).FirstOrDefault(x => multiplex[c].Contains(x) || multiplex[c].Count < c.MaxTargets); - if (target != null) - multiplex[c].Add(target); - } - - if (target == null) - return; - - // fire! - while (reloads[w] <= 0) - { - if (w.BurnSupplies()) - { - if (w.Template.ComponentTemplate.WeaponType == WeaponTypes.Seeking || w.Template.ComponentTemplate.WeaponType == WeaponTypes.SeekingPointDefense) - { - var seeker = new Seeker(Sector, c.Owner, c, w, target); - Galaxy.Current.AssignID(seeker); - Combatants.Add(seeker); - StartCombatants[seeker.ID] = seeker.Copy(); - locations[seeker] = new Vector2(locations[c]); - Events.Last().Add(new CombatantLaunchedEvent(this, c, seeker, locations[seeker])); - } - else - { - // fire - int dmg = 0; - var winfo = w.Template.ComponentTemplate.WeaponInfo; - var minrng = w.Template.WeaponMinRange; - var maxrng = w.Template.WeaponMaxRange; - var range = locations[c].DistanceToEightWay(locations[target]); - var shot = new Shot(c, w, target, range); - bool wasArmed = target is Seeker || target.Weapons.Any(); - if (w.Template.ComponentTemplate.WeaponInfo.IsWarhead || shot.RollAccuracy(Dice)) - { - dmg += shot.FullDamage; - Hit hit; - if (w.Template.ComponentTemplate.WeaponInfo.IsWarhead) - { - hit = new Hit(shot, target, w.Template.GetWeaponDamage(range) * Mod.Current.Settings.RammingSourceHitpointsDamagePercent / 100); - // warheads have a damage modifer - target.TakeDamage(hit); - // warheads damage the firing ship too - c.TakeDamage(new Hit(shot, target, w.Template.GetWeaponDamage(range) * Mod.Current.Settings.RammingTargetHitpointsDamagePercent / 100)); - // warheads destroy themselves on activation - w.Hitpoints = 0; - } - else - { - hit = new Hit(shot, target, w.Template.GetWeaponDamage(range)); - target.TakeDamage(hit); - } - bool isArmed = target is Seeker || target.Weapons.Any(); - Events.Last().Add(new WeaponFiresEvent(this, c, locations[c], target, locations[target], w, hit, wasArmed && !isArmed)); - } - else - { - bool isArmed = target is Seeker || target.Weapons.Any(); - Events.Last().Add(new WeaponFiresEvent(this, c, locations[c], target, locations[target], w, null, wasArmed && !isArmed)); - } - } - // TODO - mounts that affect reload rate? - reloads[w] += w.Template.ComponentTemplate.WeaponInfo.ReloadRate.Evaluate(w.Template); - } - else - break; - } - - if (target.IsDestroyed) - { - Events.Last().Add(new CombatantDestroyedEvent(this, target, locations[target])); - locations.Remove(target); - } - } - - private void UpdateBounds(int round, IEnumerable> positions) - { - while (UpperLeft.Count() <= round) - UpperLeft.Add(new Vector2()); - while (LowerRight.Count() <= round) - LowerRight.Add(new Vector2()); - UpperLeft[round] = UpperLeft[round] with { X = positions.MinOrDefault(q => q.X) }; - LowerRight[round] = LowerRight[round] with { X = positions.MaxOrDefault(q => q.X) }; - UpperLeft[round] = UpperLeft[round] with { Y = positions.MinOrDefault(q => q.Y) }; - LowerRight[round] = LowerRight[round] with { Y = positions.MaxOrDefault(q => q.Y) }; - } - - public void Dispose() - { - foreach (var seeker in Combatants.OfType().ToArray()) - seeker.Dispose(); - Combatants.Clear(); - if (CombatSpeedBuffer != null) - CombatSpeedBuffer.Clear(); - Events.Clear(); - LowerRight.Clear(); - if (StartCombatants != null) - StartCombatants.Clear(); - if (EndCombatants != null) - EndCombatants.Clear(); - UpperLeft.Clear(); - } -} diff --git a/FrEee/Objects/Combat/Grid/BattleEvent.cs b/FrEee/Objects/Combat/Grid/BattleEvent.cs deleted file mode 100644 index 00ac7ffc4..000000000 --- a/FrEee/Objects/Combat/Grid/BattleEvent.cs +++ /dev/null @@ -1,32 +0,0 @@ -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; - -namespace FrEee.Objects.Combat.Grid; - -public abstract class BattleEvent : IBattleEvent -{ - protected BattleEvent(IBattle battle, ICombatant combatant, Vector2 startPosition, Vector2 endPosition) - { - Battle = battle; - Combatant = combatant; - StartPosition = startPosition; - EndPosition = endPosition; - } - - [DoNotCopy] - public IBattle Battle { get; set; } - - private GalaxyReference combatant { get; set; } - - [DoNotSerialize] - public ICombatant Combatant - { - get => combatant?.Value ?? Battle?.StartCombatants?[combatant.ID]; - set => combatant = value.ReferViaGalaxy(); - } - - public Vector2 EndPosition { get; set; } - - public Vector2 StartPosition { get; set; } -} diff --git a/FrEee/Objects/Combat/Grid/CombatantAppearsEvent.cs b/FrEee/Objects/Combat/Grid/CombatantAppearsEvent.cs deleted file mode 100644 index 1a0b0d6dc..000000000 --- a/FrEee/Objects/Combat/Grid/CombatantAppearsEvent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using FrEee.Utility; -using System.Linq; - -namespace FrEee.Objects.Combat.Grid; - -public class CombatantAppearsEvent : BattleEvent -{ - public CombatantAppearsEvent(IBattle battle, ICombatant combatant, Vector2 position) - : base(battle, combatant, position, position) - { - IsUnarmed = !(Combatant is Seeker) && !Combatant.Weapons.Any(); - } - - public bool IsUnarmed { get; set; } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Grid/CombatantDestroyedEvent.cs b/FrEee/Objects/Combat/Grid/CombatantDestroyedEvent.cs deleted file mode 100644 index c5a91f88b..000000000 --- a/FrEee/Objects/Combat/Grid/CombatantDestroyedEvent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FrEee.Utility; -namespace FrEee.Objects.Combat.Grid; - -public class CombatantDestroyedEvent : BattleEvent -{ - public CombatantDestroyedEvent(IBattle battle, ICombatant combatant, Vector2 position) - : base(battle, combatant, position, position) - { - } - -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Grid/CombatantDisappearsEvent.cs b/FrEee/Objects/Combat/Grid/CombatantDisappearsEvent.cs deleted file mode 100644 index 66fceb41e..000000000 --- a/FrEee/Objects/Combat/Grid/CombatantDisappearsEvent.cs +++ /dev/null @@ -1,14 +0,0 @@ -using FrEee.Utility; -using System; - -namespace FrEee.Objects.Combat.Grid; - -[Obsolete("This class is deprecated; use CombatantDestroyedEvent if a combatant is destroyed.")] -public class CombatantDisappearsEvent : BattleEvent -{ - public CombatantDisappearsEvent(IBattle battle, ICombatant combatant, Vector2 position) - : base(battle, combatant, position, position) - { - } - -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Grid/CombatantLaunchedEvent.cs b/FrEee/Objects/Combat/Grid/CombatantLaunchedEvent.cs deleted file mode 100644 index 991792445..000000000 --- a/FrEee/Objects/Combat/Grid/CombatantLaunchedEvent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; - -namespace FrEee.Objects.Combat.Grid; - -public class CombatantLaunchedEvent : BattleEvent -{ - public CombatantLaunchedEvent(Battle battle, ICombatant launcher, ICombatant combatant, Vector2 position) - : base(battle, combatant, position, position) - { - Launcher = launcher; - } - - private GalaxyReference launcher { get; set; } - - [DoNotSerialize] - public ICombatant Launcher - { - get => launcher?.Value ?? Battle?.StartCombatants?[launcher.ID]; - set => launcher = value.ReferViaGalaxy(); - } - -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Grid/CombatantMovesEvent.cs b/FrEee/Objects/Combat/Grid/CombatantMovesEvent.cs deleted file mode 100644 index 6bab57402..000000000 --- a/FrEee/Objects/Combat/Grid/CombatantMovesEvent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using FrEee.Utility; -namespace FrEee.Objects.Combat.Grid; - -public class CombatantMovesEvent : BattleEvent -{ - public CombatantMovesEvent(Battle battle, ICombatant combatant, Vector2 here, Vector2 there) - : base(battle, combatant, here, there) - { - } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Grid/CombatantsCollideEvent.cs b/FrEee/Objects/Combat/Grid/CombatantsCollideEvent.cs deleted file mode 100644 index 28a4df429..000000000 --- a/FrEee/Objects/Combat/Grid/CombatantsCollideEvent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; - -namespace FrEee.Objects.Combat.Grid; - -/// -/// When combatants collide - seeker detonation or ship ramming -/// -/// -public class CombatantsCollideEvent : BattleEvent -{ - public CombatantsCollideEvent(Battle battle, ICombatant combatant, ICombatant target, Vector2 location, int combatantDamage, int targetDamage, bool wasCombatantDisarmed, bool wasTargetDisarmed) - : base(battle, combatant, location, location) - { - Target = target; - CombatantDamage = combatantDamage; - TargetDamage = targetDamage; - WasCombatantDisarmed = wasCombatantDisarmed; - WasTargetDisarmed = wasTargetDisarmed; - } - - - private GalaxyReference target { get; set; } - - [DoNotSerialize] - public ICombatant Target - { - get => target?.Value ?? Battle?.StartCombatants?[target.ID]; - set => target = value.ReferViaGalaxy(); - } - - public int CombatantDamage { get; set; } - public int TargetDamage { get; set; } - - public bool WasCombatantDisarmed { get; set; } - public bool WasTargetDisarmed { get; set; } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Grid/GroundBattle.cs b/FrEee/Objects/Combat/Grid/GroundBattle.cs deleted file mode 100644 index d448f3c52..000000000 --- a/FrEee/Objects/Combat/Grid/GroundBattle.cs +++ /dev/null @@ -1,90 +0,0 @@ -using FrEee.Objects.Civilization; -using FrEee.Objects.Space; -using FrEee.Objects.Vehicles; -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Objects.Combat.Grid; - -/// -/// A battle which takes place on a planet's surface. -/// -/// -public class GroundBattle : Battle -{ - public GroundBattle(Planet location) - : base() - { - Planet = location; - OriginalPlanetOwner = Planet.Owner; - Sector = location.Sector ?? throw new Exception("Ground battles require a sector location."); - - // TODO - should weapon platforms participate in ground combat like in SE5? - Empires = Planet.Cargo.Units.OfType().Select(t => t.Owner).Distinct(); - var combatants = new HashSet(Planet.Cargo.Units.OfType()); - for (var i = 0; i < Planet.PopulationFill.Value / Mod.Current.Settings.PopulationFactor / (Mod.Current.Settings.PopulationPerMilitia == 0 ? 20 : Mod.Current.Settings.PopulationPerMilitia); i++) - { - var militia = Design.MilitiaDesign.Instantiate(); - militia.Owner = Planet.Owner; - combatants.Add(militia); - } - - Initialize(combatants); - } - - public override int DamagePercentage => Mod.Current.Settings.GroundCombatDamagePercent; - - public Planet Planet { get; private set; } - - public Empire OriginalPlanetOwner { get; private set; } - - public override void Initialize(IEnumerable combatants) - { - base.Initialize(combatants); - - Empires = Planet.Cargo.Units.OfType().Select(t => t.Owner).Distinct(); - - int moduloID = (int)(Planet.ID % 100000); - Dice = new PRNG((int)(moduloID / Galaxy.Current.Timestamp * 10)); - } - - public override void PlaceCombatants(SafeDictionary> locations) - { - // in ground combat, for now everyone is right on top of each other - foreach (var c in Combatants) - locations.Add(c, new Vector2()); - } - - public override int MaxRounds => Mod.Current.Settings.GroundCombatTurns; - - public override void ModifyHappiness() - { - foreach (var e in Empires) - { - switch (this.ResultFor(e)) - { - case "victory": - if (OriginalPlanetOwner != e) - e.TriggerHappinessChange(hm => hm.EnemyPlanetCaptured); - break; - case "defeat": - if (OriginalPlanetOwner == e) - { - e.TriggerHappinessChange(hm => hm.OurPlanetCaptured); - e.TriggerHappinessChange(hm => hm.OurPlanetLost); - if (Planet.Colony.IsHomeworld) - e.TriggerHappinessChange(hm => hm.OurHomeworldLost); - } - break; - } - - } - } - - public override string Name => $"Ground Battle at {Planet}"; -} diff --git a/FrEee/Objects/Combat/Grid/IBattleEvent.cs b/FrEee/Objects/Combat/Grid/IBattleEvent.cs deleted file mode 100644 index 55a303e33..000000000 --- a/FrEee/Objects/Combat/Grid/IBattleEvent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using FrEee.Utility; -namespace FrEee.Objects.Combat.Grid; - -public interface IBattleEvent -{ - IBattle Battle { get; } - ICombatant Combatant { get; } - Vector2 EndPosition { get; } - Vector2 StartPosition { get; } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Grid/SpaceBattle.cs b/FrEee/Objects/Combat/Grid/SpaceBattle.cs deleted file mode 100644 index b7a315fd0..000000000 --- a/FrEee/Objects/Combat/Grid/SpaceBattle.cs +++ /dev/null @@ -1,137 +0,0 @@ -using FrEee.Objects.Space; -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using static System.Math; -using FrEee.Objects.GameState; - -namespace FrEee.Objects.Combat.Grid; - -/// -/// A battle which takes place... IIIN... SPAAACE!!! -/// -/// -public class SpaceBattle : Battle -{ - public SpaceBattle(Sector location) - : base() - { - Sector = location ?? throw new Exception("Space battles require a sector location."); - - // TODO - what about cloaked ships? should they not participate in combat? - Empires = Sector.SpaceObjects.OfType().Select(sobj => sobj.Owner).Where(emp => emp != null).Distinct().ToArray(); - Combatants = new HashSet(Sector.SpaceObjects.OfType().Where(o => o.Owner != null).Union(Sector.SpaceObjects.OfType().SelectMany(f => f.Combatants)).Where(o => !(o is Fleet))); - - Initialize(new HashSet(Sector.SpaceObjects.OfType().Where(o => o.Owner != null).Union(Sector.SpaceObjects.OfType().SelectMany(f => f.Combatants)).Where(o => !(o is Fleet)))); - } - - public override int DamagePercentage => 100; - - public override void Initialize(IEnumerable combatants) - { - base.Initialize(combatants); - - Empires = Sector.SpaceObjects.OfType().Select(sobj => sobj.Owner).Where(emp => emp != null).Distinct().ToArray(); - - int moduloID = (int)(Sector.StarSystem.ID % 100000); - Dice = new PRNG((int)(moduloID / Galaxy.Current.Timestamp * 10)); - } - - public override void PlaceCombatants(SafeDictionary> locations) - { - if (Sector.SpaceObjects.OfType().Any()) - { - // HACK - warp point in sector, assume someone warped - // TODO - do this for warp point exits instead since warp points may be one way - // warp battles start with everyone mashed together to allow blockades - foreach (var c in Combatants.OrderByDescending(q => q.Size)) - PlaceCombatant(locations, 0, 0, c); - } - else - { - // place all combatants at the points of a regular polygon - var sideLength = 20 + (int)Math.Ceiling((double)Combatants.GroupBy(q => q.Owner).Max(q => q.Count())); // make sure no one can shoot each other at the start - // https://stackoverflow.com/questions/32169875/calculating-the-coordinates-of-a-regular-polygon-given-its-center-and-its-side-l - var radius = sideLength / (2 * Sin(PI / Empires.Count())); - var combs = Combatants.ToArray(); - for (int i = 0; i < Empires.Count(); i++) - { - var x = radius * Cos(PI / Empires.Count() * (1 + 2 * i)); - var y = radius * Sin(PI / Empires.Count() * (1 + 2 * i)); - foreach (var comb in Combatants.Where(q => q.Owner == Empires.ElementAt(i)).OrderByDescending(q => q.Size)) - { - PlaceCombatant(locations, x, y, comb); - } - } - } - } - - private void PlaceCombatant(SafeDictionary> locations, double x, double y, ICombatant comb) - { - // scramble all tile-filling combatants in rings around the largest - if (comb.FillsCombatTile) - { - for (int r = 0; ; r++) - { - bool done = false; - var tiles = Vector2Utility.AtRadius(r); - foreach (var tile in tiles.Shuffle(Dice)) - { - var atHere = locations.Where(q => q.Key.FillsCombatTile && q.Value == tile); - if (!atHere.Any()) - { - locations.Add(comb, new Vector2((int)x + tile.X, (int)y + tile.Y)); - done = true; - break; - } - } - if (done) - break; - } - } - else // put non-filling combatants in the center - locations.Add(comb, new Vector2((int)x, (int)y)); - } - - /// - /// Battles are named after any stellar objects in their sector; failing that, they are named after the star system and sector coordinates. - /// - public override string Name - { - get - { - if (Sector.SpaceObjects.OfType().Any()) - return "Battle at " + Sector.SpaceObjects.OfType().Largest(); - var coords = Sector.Coordinates; - return "Battle at " + Sector.StarSystem + " sector (" + coords.X + ", " + coords.Y + ")"; - } - } - - public override int MaxRounds => Mod.Current.Settings.SpaceCombatTurns; - - public override void ModifyHappiness() - { - foreach (var e in Empires) - { - switch (this.ResultFor(e)) - { - case "victory": - e.TriggerHappinessChange(StarSystem, hm => hm.BattleInSystemWin); - e.TriggerHappinessChange(Sector, hm => hm.BattleInSectorWin); - break; - case "defeat": - e.TriggerHappinessChange(StarSystem, hm => hm.BattleInSystemLoss); - e.TriggerHappinessChange(Sector, hm => hm.BattleInSectorLoss); - break; - case "stalemate": - case "Pyrrhic victory": - e.TriggerHappinessChange(StarSystem, hm => hm.BattleInSystemStalemate); - e.TriggerHappinessChange(Sector, hm => hm.BattleInSectorStalemate); - break; - } - } - } -} diff --git a/FrEee/Objects/Combat/Grid/WeaponFiresEvent.cs b/FrEee/Objects/Combat/Grid/WeaponFiresEvent.cs deleted file mode 100644 index 7a2ce8525..000000000 --- a/FrEee/Objects/Combat/Grid/WeaponFiresEvent.cs +++ /dev/null @@ -1,48 +0,0 @@ -using FrEee.Objects.Technology; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; - -namespace FrEee.Objects.Combat.Grid; - -public class WeaponFiresEvent : BattleEvent -{ - public WeaponFiresEvent(Battle battle, ICombatant attacker, Vector2 here, ICombatant target, Vector2 there, Component weapon, Hit hit, bool wasTargetDisarmed) - : base(battle, attacker, here, there) - { - Attacker = attacker; - Target = target; - Weapon = weapon; - Hit = hit; - IsHit = hit != null; - Damage = hit?.NominalDamage ?? 0; - WasTargetDisarmed = wasTargetDisarmed; - } - public bool IsHit { get; set; } - - private GalaxyReference attacker { get; set; } - - private GalaxyReference target { get; set; } - - [DoNotSerialize] - public ICombatant Attacker - { - get => attacker?.Value ?? Battle?.StartCombatants?[attacker.ID]; - set => attacker = value.ReferViaGalaxy(); - } - - [DoNotSerialize] - public ICombatant Target - { - get => target?.Value ?? Battle?.StartCombatants?[target.ID]; - set => target = value.ReferViaGalaxy(); - } - - // TODO - make this some sort of reference? - public Component Weapon { get; set; } - - public Hit Hit { get; set; } - public int Damage { get; set; } - - public bool WasTargetDisarmed { get; set; } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Hit.cs b/FrEee/Objects/Combat/Hit.cs deleted file mode 100644 index d4e36760d..000000000 --- a/FrEee/Objects/Combat/Hit.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System.Collections.Generic; -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; - -namespace FrEee.Objects.Combat; - -/// -/// A hit by a weapon or other source of damage. -/// -public class Hit : IFormulaHost -{ - public Hit(Shot shot, IDamageable target, int? nominalDamage = null) - { - Shot = shot; - DamageType = shot?.DamageType ?? DamageType.Normal; - Target = target; - NominalDamage = nominalDamage ?? shot.DamageLeft; - } - - public Hit(DamageType dt, int damage, IDamageable target) - { - DamageType = dt; - Target = target; - NominalDamage = damage; - } - - public DamageType DamageType { get; set; } - - /// - /// The nominal damage inflicted by this hit, not accounting for special damage types and target defenses. - /// - public int NominalDamage { get; set; } - - /// - /// The shot which inflicted this hit. - /// - public Shot Shot { get; set; } - - /// - /// The specific target of this hit. - /// - [DoNotSerialize] - public IDamageable Target - { - get { return target?.Value ?? _target; } - set - { - if (value is IDamageableReferrable dr) - target = dr.ReferViaGalaxy(); - else - _target = value; - } - } - - public IDictionary Variables - { - get - { - var sv = Shot.Variables; - var result = new SafeDictionary(); - foreach (var v in sv) - result.Add(v); - result["target"] = Target; - return result; - } - } - - private GalaxyReference target { get; set; } - - private IDamageable _target { get; set; } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/IBattle.cs b/FrEee/Objects/Combat/IBattle.cs deleted file mode 100644 index 2581b549b..000000000 --- a/FrEee/Objects/Combat/IBattle.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FrEee.Objects.Civilization; -using FrEee.Objects.GameState; -using FrEee.Objects.LogMessages; -using FrEee.Objects.Space; -using FrEee.Utility; -using System.Collections.Generic; - -namespace FrEee.Objects.Combat; - -public interface IBattle : INamed, IPictorial, ILocated -{ - ISet Combatants { get; } - PRNG Dice { get; set; } - IEnumerable Empires { get; } - IList Log { get; } - double Timestamp { get; } - IDictionary StartCombatants { get; } - IDictionary EndCombatants { get; } - - void Resolve(); -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/ProjectileWeaponDisplayEffect.cs b/FrEee/Objects/Combat/ProjectileWeaponDisplayEffect.cs deleted file mode 100644 index 570dbce02..000000000 --- a/FrEee/Objects/Combat/ProjectileWeaponDisplayEffect.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Drawing; - -namespace FrEee.Objects.Combat; - -[Serializable] -public class ProjectileWeaponDisplayEffect : WeaponDisplayEffect -{ - public ProjectileWeaponDisplayEffect(string name) - : base(name) - { - } - - public override Point GlobalSpriteOffset - { - get { return new Point(); } - } - - public override string GlobalSpriteSheetName - { - get { return "Torps"; } - } - - public override Point ShipsetSpriteOffset - { - get { return new Point(); } - } - - public override string ShipsetSpriteSheetName - { - get { return "Torps"; } - } - - public override Size SpriteSize - { - get { return new Size(20, 20); } - } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Seeker.cs b/FrEee/Objects/Combat/Seeker.cs deleted file mode 100644 index 115e97bdd..000000000 --- a/FrEee/Objects/Combat/Seeker.cs +++ /dev/null @@ -1,370 +0,0 @@ -using FrEee.Objects.Civilization; -using FrEee.Objects.Space; -using FrEee.Objects.Technology; -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Objects.Combat; - -/// -/// A seeking missile or torpedo. -/// -public class Seeker : ICombatant -{ - public Seeker(Sector sector, Empire owner, ICombatant attacker, Component launcher, ICombatant target) - { - Sector = sector; - Owner = owner; - if (launcher.Template.ComponentTemplate.WeaponInfo is SeekingWeaponInfo) - LaunchingComponent = launcher; - else - throw new Exception(launcher + " cannot launch seekers."); - Name = Owner.Name + " " + launcher.Name; - if (WeaponInfo.Targets.HasFlag(target.WeaponTargetType)) - Target = target; - else - throw new Exception(launcher + " cannot target a " + target.WeaponTargetType + "."); - Hitpoints = WeaponInfo.SeekerDurability; // TODO - can mounts affect seeker durability? - CombatSpeed = WeaponInfo.SeekerSpeed; - } - - /// - /// Seekers don't fire so it doesn't really matter... - /// - public int Accuracy - { - get { return 0; } - } - - /// - /// TODO - armored seekers? - /// - public int ArmorHitpoints - { - get { return 0; } - } - - /// - /// The battle in which this seeker was fired. - /// - [DoNotSerialize(false)] - [Obsolete("Seekers don't need to know what battle they're in; this property is obsolete.")] - public IBattle Battle { get; set; } - - public double CombatSpeed { get; set; } - - public Formula Damage - { - get - { - return LaunchingComponent.Template.GetWeaponDamage(1); // TODO - seekers that do different damage based on some sort of abstracted "range" - } - } - - public int DistanceTraveled { get; set; } - - /// - /// Seeker evasion is determined by Settings.txt. - /// TODO - add a field to Components.txt that lets seekers have custom evasion values? - /// - public int Evasion - { - get { return Mod.Current.Settings.SeekerEvasion; } - } - - public int HitChance - { - get { return 1; } - } - - /// - /// The remaining durability of this seeker. - /// - public int Hitpoints { get; set; } - - public int HullHitpoints - { - get { return Hitpoints; } - } - - public Image Icon - { - get { return Portrait; } - } - - public Image Icon32 => Icon.Resize(32); - - public IEnumerable IconPaths - { - get - { - return PortraitPaths; - } - } - - public long ID - { - get; - set; - } - - public bool IsAlive => !IsDestroyed; - - public bool IsDestroyed - { - get { return Hitpoints <= 0; } - } - - public bool IsDisposed { get; set; } - - public bool IsMemory - { - get; - set; - } - - /// - /// The combatant which launched the seeker. - /// - public ICombatant LaunchingCombatant { get; private set; } - - /// - /// The component which launched this seeker. - /// - public Component LaunchingComponent { get; private set; } - - public int MaxArmorHitpoints - { - get { return 0; } - } - - public int MaxHitpoints - { - get - { - return WeaponInfo.SeekerDurability; // TODO - let mounts affect seeker HP? - } - } - - public int MaxHullHitpoints - { - get { return MaxHitpoints; } - } - - public int MaxNormalShields - { - get { return 0; } - } - - public int MaxPhasedShields - { - get { return 0; } - } - - public int MaxShieldHitpoints - { - get { return MaxNormalShields + MaxPhasedShields; } - } - - public int MaxTargets => 0; - - /// - /// The name of the seeker. - /// - public string Name { get; private set; } - - /// - /// Seekers do not have shields. - /// TODO - maybe let seekers have shields? - /// - public int NormalShields - { - get - { - return 0; - } - set - { - // do nothing - } - } - - /// - /// The owner of the seeker. - /// - public Empire Owner { get; set; } - - /// - /// Seekers do not have shields. - /// TODO - maybe let seekers have shields? - /// - public int PhasedShields - { - get - { - return 0; - } - set - { - // do nothing - } - } - - public Image Portrait - { - // TODO - custom seeker images per shipset - get { return Pictures.GetGenericImage(1.0); } - } - - public IEnumerable PortraitPaths - { - get - { - var paths = new List(); - - var shipsetPath = Owner.ShipsetPath; - - if (Mod.Current?.RootPath != null) - { - paths.Add(Path.Combine("Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, "Seeker")); - paths.Add(Path.Combine("Mods", Mod.Current.RootPath, "Pictures", "Races", shipsetPath, shipsetPath + "_" + "Seeker")); - } - paths.Add(Path.Combine("Pictures", "Races", shipsetPath, "Seeker")); - paths.Add(Path.Combine("Pictures", "Races", shipsetPath, shipsetPath + "_" + "Seeker")); - return paths; - } - } - - public Sector Sector - { - get; set; - } - - public int ShieldHitpoints - { - get { return NormalShields + PhasedShields; } - } - - public StarSystem StarSystem - { - get { return Sector.StarSystem; } - } - - /// - /// The target of the seeker. - /// - public ICombatant Target { get; private set; } - - public double Timestamp { get; set; } - - public SeekingWeaponInfo WeaponInfo - { - get { return (SeekingWeaponInfo)LaunchingComponent.Template.ComponentTemplate.WeaponInfo; } - } - - /// - /// Seekers do not carry other weapons. - /// - public IEnumerable Weapons - { - get { return Enumerable.Empty(); } - } - - public WeaponTargets WeaponTargetType - { - get { return WeaponTargets.Seeker; } - } - - public bool CanTarget(ITargetable target) - { - return target != null && LaunchingComponent.Template.ComponentTemplate.WeaponInfo.Targets.HasFlag(target.WeaponTargetType); - } - - public Visibility CheckVisibility(Empire emp) - { - if (Owner == emp) - return Visibility.Owned; - if (Galaxy.Current.Battles.Any(b => - (b.Combatants.Contains(this) - || b.StartCombatants.Values.Contains(this) - || b.EndCombatants.Values.Contains(this)) - && b.Combatants.Any(c => c.Owner == emp))) - return Visibility.Scanned; - return Visibility.Unknown; - } - - public void Dispose() - { - if (IsDisposed) - return; - Target = null; - Galaxy.Current.UnassignID(this); - } - - public bool IsHostileTo(Empire emp) - { - return Owner == null ? false : Owner.IsEnemyOf(emp, StarSystem); - } - - public bool IsObsoleteMemory(Empire emp) - { - return Timestamp < Galaxy.Current.Timestamp - 1; - } - - public void Redact(Empire emp) - { - var vis = CheckVisibility(emp); - if (vis < Visibility.Fogged) - Dispose(); - } - - public int? Repair(int? amount = null) - { - if (amount == null) - { - Hitpoints = MaxHitpoints; - return amount; - } - else - { - var actual = Math.Min(MaxHitpoints - Hitpoints, amount.Value); - Hitpoints += actual; - return amount.Value - actual; - } - } - - public void ReplenishShields(int? amount = null) - { - // do nothing, seekers don't have shields - } - - public int TakeDamage(Hit hit, PRNG dice = null) - { - var damage = hit.Shot.DamageLeft; - damage *= hit.Shot.DamageType.SeekerDamage.Evaluate(this) / 100; - var pierced = damage * hit.Shot.DamageType.ComponentPiercing.Evaluate(this); - int realDamage; - realDamage = Math.Min(Hitpoints, damage); - Hitpoints -= realDamage; - return damage - realDamage; - } - - public override string ToString() - { - return Name; - } - - public IEnumerable Components => Enumerable.Empty(); - - public bool FillsCombatTile => false; - - public int Size => 0; -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/SeekerWeaponDisplayEffect.cs b/FrEee/Objects/Combat/SeekerWeaponDisplayEffect.cs deleted file mode 100644 index ab7ca11ff..000000000 --- a/FrEee/Objects/Combat/SeekerWeaponDisplayEffect.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Drawing; - -namespace FrEee.Objects.Combat; - -[Serializable] -public class SeekerWeaponDisplayEffect : WeaponDisplayEffect -{ - public SeekerWeaponDisplayEffect(string name) - : base(name) - { - } - - public override Point GlobalSpriteOffset - { - get { return new Point(); } - } - - public override string GlobalSpriteSheetName - { - get { return "Seekers"; } - } - - public override Point ShipsetSpriteOffset - { - get { return new Point(40, 0); } - } - - public override string ShipsetSpriteSheetName - { - get { return "Main"; } - } - - public override Size SpriteSize - { - get { return new Size(20, 20); } - } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/Shot.cs b/FrEee/Objects/Combat/Shot.cs deleted file mode 100644 index 378a2e453..000000000 --- a/FrEee/Objects/Combat/Shot.cs +++ /dev/null @@ -1,125 +0,0 @@ -using System.Collections.Generic; -using FrEee.Objects.Technology; -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; - -namespace FrEee.Objects.Combat; - -/// -/// A weapon's fire, or another source of damage. -/// -public class Shot : IFormulaHost -{ - public Shot(ICombatant attacker, Component weapon, IDamageable defender, int range) - { - Attacker = attacker; - Weapon = weapon; - Defender = defender; - Range = range; - DamageLeft = FullDamage; - } - - public GalaxyReference attacker { get; set; } - - [DoNotSerialize] - public ICombatant Attacker { get { return attacker == null ? null : attacker.Value; } set { attacker = value == null ? null : value.ReferViaGalaxy(); } } - - public int DamageLeft { get; private set; } - - public DamageType DamageType - { - get - { - if (Weapon != null && Weapon.Template.ComponentTemplate.WeaponInfo != null) - return Weapon.Template.ComponentTemplate.WeaponInfo.DamageType; - return Mod.Current.DamageTypes.FindByName("Normal") ?? new DamageType(); // TODO - moddable damage types for storms, etc. - } - } - - /// - /// The specific target of this hit. - /// - [DoNotSerialize] - public IDamageable Defender - { - get { return target?.Value ?? _target; } - set - { - if (value is IDamageableReferrable dr) - target = dr.ReferViaGalaxy(); - else - _target = value; - } - } - - /// - /// Effective range for damage purposes, due to mount range modifiers - /// - public int EffectiveRange - { - get - { - var r = Range - (Weapon.Template.Mount == null ? 0 : Weapon.Template.Mount.WeaponRangeModifier.Evaluate(Weapon)); - if (r < 1) - return 1; - return r; - } - } - - public int FullDamage - { - get - { - if (Weapon == null || Range < Weapon.Template.WeaponMinRange || Range > Weapon.Template.WeaponMaxRange) - return 0; - return Weapon.Template.GetWeaponDamage(EffectiveRange); // TODO - use PRNG - } - } - - public IEnumerable Hits { get; private set; } - public int Range { get; set; } - public GalaxyReference target { get; set; } - private IDamageable _target { get; set; } - - public IDictionary Variables - { - get - { - return new Dictionary - { - { "range", Range}, - }; - } - } - - // TODO - make this some sort of reference? - public Component Weapon { get; set; } - - public int InflictDamage(IDamageable target, PRNG dice = null) - { - var hit = new Hit(this, target, DamageLeft); - DamageLeft = target.TakeDamage(hit, dice); - return DamageLeft; - } - - public bool RollAccuracy(PRNG dice = null) - { - var accuracy = Weapon.Template.WeaponAccuracy + Attacker.Accuracy + Mod.Current.Settings.WeaponAccuracyPointBlank - Range * Mod.Current.Settings.WeaponAccuracyLossPerSquare; - int evasion = 0; - if (Defender is ITargetable t) - evasion = t.Evasion; - var netAccuracy = accuracy - evasion; - if (netAccuracy > 99) - netAccuracy = 99; - if (netAccuracy < 1) - netAccuracy = 1; - return RandomHelper.Range(0, 99, dice) < netAccuracy; - } - - public override string ToString() - { - return Attacker + "'s " + Weapon + " vs. " + Defender + " at range " + Range + " (" + DamageLeft + " damage left)"; - } -} \ No newline at end of file diff --git a/FrEee/Objects/Combat/WeaponDisplayEffect.cs b/FrEee/Objects/Combat/WeaponDisplayEffect.cs deleted file mode 100644 index 4f621faaf..000000000 --- a/FrEee/Objects/Combat/WeaponDisplayEffect.cs +++ /dev/null @@ -1,145 +0,0 @@ -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using FrEee.Objects.GameState; - -namespace FrEee.Objects.Combat; - -/// -/// The display effect to use for a weapon in combat. -/// -[Serializable] -public abstract class WeaponDisplayEffect : IPictorial -{ - protected WeaponDisplayEffect(string name) - { - Name = name; - } - - /// - /// The pixel offset to the first sprite in the global sprite sheet. - /// - public abstract Point GlobalSpriteOffset { get; } - - public Image GlobalSpriteSheet - { - get - { - return Pictures.GetModImage(Path.Combine("Pictures", "Combat", GlobalSpriteSheetName)); - } - } - - /// - /// The name of the sprite sheet to use. - /// - public abstract string GlobalSpriteSheetName { get; } - - public Image Icon - { - get { return GetIcon(null); } - } - - public Image Icon32 => Icon.Resize(32); - - public IEnumerable IconPaths - { - get - { - yield return Path.Combine("Races", "Default", Name); - yield return Path.Combine("Races", "Default", "Default" + "_" + Name); - yield return Path.Combine("Combat", Name); - } - } - - /// - /// The name or index of the effect to use. - /// - public string Name { get; set; } - - public Image Portrait - { - get { return Icon; } - } - - public IEnumerable PortraitPaths - { - get - { - return IconPaths; - } - } - - /// - /// The pixel offset to the first sprite in the shipset-specific sprite sheet. - /// - public abstract Point ShipsetSpriteOffset { get; } - - /// - /// The name of the sprite sheet to use. - /// - public abstract string ShipsetSpriteSheetName { get; } - - /// - /// The size of each sprite, in pixels. - /// - public abstract Size SpriteSize { get; } - - public Image GetIcon(string shipset) - { - // see if we have a positive number to use a sprite sheet - int index = 0; - int.TryParse(Name, out index); - - if (index > 0) - { - // use sprite sheets - var shipsetSpriteSheet = LoadShipsetSpriteSheet(shipset); - Image spriteSheet; - Point offset; - if (shipsetSpriteSheet != null) - { - // crop shipset sprite sheet - spriteSheet = shipsetSpriteSheet; - offset = ShipsetSpriteOffset; - } - else if (GlobalSpriteSheet != null) - { - // crop global sprite sheet - spriteSheet = GlobalSpriteSheet; - offset = GlobalSpriteOffset; - } - else - { - // no sprite sheets found - return Pictures.GetModImage( - Path.Combine("Pictures", "Races", shipset, Name), - Path.Combine("Pictures", "Races", shipset, shipset + "_" + Name), - Path.Combine("Pictures", "Combat", Name)); - } - - // make sprite - var spritesAcross = (spriteSheet.Width - offset.X) / SpriteSize.Width; - var num = index - 1; - var row = num / spritesAcross; - var col = num % spritesAcross; - var pos = new Point(offset.X + SpriteSize.Width * col, offset.Y + SpriteSize.Height * row); - return spriteSheet.Crop(pos, SpriteSize); - } - else - { - // use individual sprites - return Pictures.GetModImage( - Path.Combine("Pictures", "Races", shipset, Name), - Path.Combine("Pictures", "Races", shipset, shipset + "_" + Name), - Path.Combine("Pictures", "Combat", Name)); - } - } - - public Image LoadShipsetSpriteSheet(string shipset) - { - return Pictures.GetModImage(Path.Combine("Pictures", "Races", shipset, ShipsetSpriteSheetName)); - } -} \ No newline at end of file diff --git a/FrEee/Serialization/GalaxyReference.cs b/FrEee/Serialization/GalaxyReference.cs deleted file mode 100644 index 0509920c5..000000000 --- a/FrEee/Serialization/GalaxyReference.cs +++ /dev/null @@ -1,182 +0,0 @@ -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using FrEee.Utility; -using FrEee.Objects.GameState; -namespace FrEee.Serialization; - -/// -/// A lightweight reference to some object in the current galaxy. -/// Can be passed around on the network as a surrogate for said object. -/// This class should be used when referencing a server side object from the client. -/// It is not necessary to use GalaxyReference when entirely within either the client or the server. -/// -/// -[Serializable] -public class GalaxyReference : IReference, IPromotable - where T : IReferrable -{ - - /// - /// Either will create a new Galaxy Reference with the given id, or return null. - /// Useful to allow a client to store an ID locally for reference, when the server might destroy said ID. - /// - /// - /// - public static GalaxyReference GetGalaxyReference(long id) - { - if (Galaxy.Current.referrables.ContainsKey(id)) - return new GalaxyReference(id); - - return null; - } - - public GalaxyReference() - { - InitializeCache(); - } - - public GalaxyReference(T t) - : this() - { - if (t is IReferrable) - { - var r = (IReferrable)t; - if (Galaxy.Current == null) - throw new ReferenceException("Can't create a reference to an IReferrable without a galaxy."); - else if (t == null) - ID = 0; - else if (r.ID > 0) - ID = r.ID; - else - ID = Galaxy.Current.AssignID(r); - if (!HasValue) - { - Galaxy.Current.referrables[r.ID] = r; - cache = null; // reset cache - if (!HasValue) - throw new ArgumentException("{0} does not exist in the current galaxy so it cannot be referenced.".F(t)); - } - } - else - { - value = t; - } - } - - public GalaxyReference(long id) - : this() - { - if (Galaxy.Current == null) - throw new ReferenceException("Can't create a reference to an IReferrable without a galaxy."); - else if (!Galaxy.Current.referrables.ContainsKey(id)) - throw new IndexOutOfRangeException($"The id of {id} is not currently a valid reference"); - else if (Galaxy.Current.referrables[id] is T) - ID = id; - else - throw new Exception("Object with ID " + id + " is not a " + typeof(T) + "."); - } - - private void InitializeCache() - { - cache = new ClientSideCache(() => - { - if (ID <= 0) - return value; - var obj = (T)Galaxy.Current.GetReferrable(ID); - if (obj == null) - return default(T); - /*if (obj is IReferrable && (obj as IReferrable).IsDisposed) - return default(T);*/ - return obj; - } - ); - } - - /// - /// Does the reference have a valid value? - /// - public bool HasValue => Value != null; - - public long ID { get; internal set; } - - /// - /// Resolves the reference. - /// - /// - public T Value - { - get - { - if (cache == null) - InitializeCache(); - return cache.Value; - } - } - - [field: NonSerialized] - private T value { get; set; } - - [NonSerialized] - private ClientSideCache cache; - - public static implicit operator GalaxyReference(T t) - { - if (t == null) - return null; - return new GalaxyReference(t); - } - - public static implicit operator T(GalaxyReference r) - { - if (r == null) - return default(T); - return r.Value; - } - - public static bool operator !=(GalaxyReference r1, GalaxyReference r2) - { - return !(r1 == r2); - } - - public static bool operator ==(GalaxyReference r1, GalaxyReference r2) - { - if (r1 is null && r2 is null) - return true; - if (r1 is null || r2 is null) - return false; - return r1.ID == r2.ID; - } - - public override bool Equals(object? obj) - { - // TODO - upgrade equals to use "as" operator - if (obj is GalaxyReference) - return this == (GalaxyReference)obj; - return false; - } - - public override int GetHashCode() - { - return ID.GetHashCode(); - } - - public void ReplaceClientIDs(IDictionary idmap, ISet done = null) - { - if (done == null) - done = new HashSet(); - if (!done.Contains(this)) - { - done.Add(this); - if (idmap.ContainsKey(ID)) - ID = idmap[ID]; - if (HasValue && Value is IPromotable) - ((IPromotable)Value).ReplaceClientIDs(idmap, done); - } - } - - public override string ToString() - { - return "ID=" + ID + ", Value=" + Value; - } -} diff --git a/FrEee/Setup/EmpireTemplate.cs b/FrEee/Setup/EmpireTemplate.cs deleted file mode 100644 index d61c6a8ca..000000000 --- a/FrEee/Setup/EmpireTemplate.cs +++ /dev/null @@ -1,191 +0,0 @@ -using FrEee.Objects.Civilization; -using FrEee.Modding; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Setup; - -/// -/// A template for configuring an empire. -/// -public class EmpireTemplate : ITemplate -{ - public EmpireTemplate() - { - } - - /// - /// The name of the AI used by this empire. - /// - public string AIName { get; set; } - - /// - /// Can random AI empires use this empire template? - /// - public bool AIsCanUse { get; set; } - - /// - /// The color used to represent this empire. - /// - public Color Color { get; set; } - - /// - /// The empire's culture. - /// - [DoNotSerialize] - public Culture Culture - { - get { return Mod.Current.Cultures.SingleOrDefault(c => c.Name == CultureName); } - set { CultureName = value == null ? null : value.Name; } - } - - public string CultureName { get; set; } - - /// - /// The insignia of the empire. - /// - public Image Insignia - { - get - { - return Pictures.GetIcon(this); - } - } - - /// - /// The name of this empire's insignia. - /// - public string InsigniaName { get; set; } - - /// - /// Is this a minor empire? Minor empires cannot use warp points. - /// - public bool IsMinorEmpire { get; set; } - - /// - /// Is this empire controlled by a human player? - /// - public bool IsPlayerEmpire { get; set; } - - /// - /// The name of the leader of this empire. - /// - public string LeaderName { get; set; } - - /// - /// The name of the leader portrait used by this empire. - /// - public string LeaderPortraitName { get; set; } - - /// - /// The name of the empire. - /// - public string Name { get; set; } - - /// - /// Empire setup points spent. - /// - public int PointsSpent - { - get - { - int result = 0; - foreach (var t in PrimaryRace.Traits) - result += t.Cost.Value; - result += PrimaryRace.Aptitudes.Sum(kvp => Aptitude.All.FindByName(kvp.Key).GetCost(kvp.Value)); - return result; - } - } - - /// - /// The native race of this empire. - /// - public Race PrimaryRace { get; set; } - - /// - /// The name of the shipset used by this empire. - /// - public string ShipsetName { get; set; } - - /// - /// The name of the design names file used by this empire. - /// - public string DesignNamesFile { get; set; } - - public static EmpireTemplate Load(string filename) - { - var fs = new FileStream(filename, FileMode.Open); - var race = Serializer.Deserialize(fs); - fs.Close(); fs.Dispose(); - return race; - } - - public IEnumerable GetWarnings(int maxPoints) - { - if (PrimaryRace == null) - yield return "You must specify a primary race for your empire."; - else - { - foreach (var w in PrimaryRace.Warnings) - yield return w; - } - if (string.IsNullOrWhiteSpace(Name)) - yield return "You must specify a name for your empire."; - if (string.IsNullOrWhiteSpace(LeaderName)) - yield return "You must specify a leader name for your empire."; - if (string.IsNullOrWhiteSpace(LeaderPortraitName)) - yield return "You must specify a leader portrait for your empire."; - if (string.IsNullOrWhiteSpace(InsigniaName)) - yield return "You must specify an insignia for your empire."; - if (string.IsNullOrWhiteSpace(ShipsetName)) - yield return "You must specify a shipset for your empire."; - if (Color.R < 85 && Color.G < 85 & Color.B < 85) - yield return "The color you specified for your empire is too dark to be visible. Please make sure that at least one of the RGB values is 85 or more."; - if (Color.A < 255) - yield return "Transparent empire colors are not allowed."; - if (Culture == null) - yield return "You must specify a culture for your empire."; - if (!IsPlayerEmpire && Mod.Current.EmpireAIs.FindByName(AIName) == null) - yield return "AI empires require an AI script."; - if (PointsSpent > maxPoints) - yield return "You have spent too many empire setup points. Only " + maxPoints + " are available."; - } - - public Empire Instantiate() - { - var emp = new Empire(); - emp.Name = Name; - emp.LeaderName = LeaderName; - emp.Color = Color; - emp.PrimaryRace = PrimaryRace; - emp.LeaderPortraitName = LeaderPortraitName; - emp.InsigniaName = InsigniaName ?? PrimaryRace.Name; - emp.ShipsetPath = ShipsetName ?? PrimaryRace.Name; - emp.LeaderPortraitName = LeaderPortraitName ?? PrimaryRace.Name; - emp.Culture = Culture; - emp.IsPlayerEmpire = IsPlayerEmpire; - emp.IsMinorEmpire = IsMinorEmpire; - emp.AI = Mod.Current.EmpireAIs.FindByName(AIName); - emp.DesignNamesFile = DesignNamesFile; - - return emp; - } - - public void Save(string filename) - { - var fs = new FileStream(filename, FileMode.Create); - Serializer.Serialize(this, fs); - fs.Close(); fs.Dispose(); - } - - public override string ToString() - { - return Name; - } -} diff --git a/FrEee/Setup/GameSetup.cs b/FrEee/Setup/GameSetup.cs deleted file mode 100644 index 8aaa1c528..000000000 --- a/FrEee/Setup/GameSetup.cs +++ /dev/null @@ -1,693 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using FrEee.Objects.Civilization; -using FrEee.Objects.Space; -using FrEee.Objects.Technology; -using FrEee.Objects.VictoryConditions; -using FrEee.Setup.WarpPointPlacementStrategies; -using FrEee.Modding; -using FrEee.Modding.Templates; -using FrEee.Utility; -using FrEee.Serialization; -using FrEee.Extensions; -using FrEee.Objects.GameState; -using FrEee.Objects.Civilization.Diplomacy; - -namespace FrEee.Setup; - -/// -/// Setup parameters for a game. -/// -[Serializable] -public class GameSetup -{ - public GameSetup() - { - EmpireTemplates = new List(); - ForbiddenTechnologyNames = new List(); - VictoryConditions = new List(); - VictoryConditions.Add(new TotalEliminationVictoryCondition()); - } - - /// - /// Allowed trades in this game. - /// - public AllowedTrades AllowedTrades { get; set; } - - /// - /// Should all systems start explored for all players? - /// - public bool AllSystemsExplored { get; set; } - - public bool CanColonizeOnlyBreathable { get; set; } - - public bool CanColonizeOnlyHomeworldSurface { get; set; } - - public EmpirePlacement EmpirePlacement { get; set; } - - public int EmpirePoints { get; set; } - - /// - /// Empire templates in this game setup. - /// - public IList EmpireTemplates { get; private set; } - - /// - /// Per mille chance of a random event occurring, per turn, per player. - /// - public double EventFrequency { get; set; } - - /// - /// The maximum event severity in this game. - /// - public EventSeverity MaximumEventSeverity { get; set; } - - /// - /// Technologies that are locked at level zero. - /// - public IList ForbiddenTechnologyNames { get; private set; } - - /// - /// The size of the galaxy. - /// - public System.Drawing.Size GalaxySize { get; set; } - - /// - /// The galaxy template to use. - /// - [DoNotSerialize] - public GalaxyTemplate GalaxyTemplate - { - get { return Mod.Current.GalaxyTemplates.FindByName(GalaxyTemplateName); } - set { GalaxyTemplateName = value.Name; } - } - - public string GalaxyTemplateName - { - get; - private set; - } - - /// - /// The name of the game. Used in save file names. - /// - public string GameName { get; set; } - - public bool GenerateRandomRuins { get; set; } - - public bool GenerateUniqueRuins { get; set; } - - public StellarObjectSize HomeworldSize { get; set; } - - public int HomeworldsPerEmpire { get; set; } - - public int HomeworldValue { get; set; } - - public bool IsAnalysisAllowed { get; set; } - - /// - /// Is this a "humans vs. AI" game? - /// - public bool IsHumansVsAI { get; set; } - - public bool IsIntelligenceAllowed { get; set; } - - /// - /// Are we setting up a single player game? - /// - public bool IsSinglePlayer { get { return EmpireTemplates.Where(et => et.IsPlayerEmpire).Count() == 1; } } - - public bool IsSurrenderAllowed { get; set; } - - public int MaxHomeworldDispersion { get; set; } - - public int MaxPlanetValue { get; set; } - - public int MaxSpawnedAsteroidValue { get; set; } - - public int MaxSpawnedPlanetValue { get; set; } - - public int MinAsteroidValue { get; set; } - - public int MinorEmpires { get; set; } - - public int MinPlanetValue { get; set; } - - public int MinSpawnedAsteroidValue { get; set; } - - public int MinSpawnedPlanetValue { get; set; } - - /// - /// Should players have an omniscient view of all explored systems? - /// Does not prevent cloaking from working; this is just basic sight. - /// Also does not give battle reports for other empires' battles. - /// - public bool OmniscientView { get; set; } - - public int RandomAIs { get; set; } - - /// - /// Model to use for remote mining. - /// - public MiningModel RemoteMiningModel { get; set; } - - /// - /// The research points granted to empires per unspent empire point. - /// - public decimal ResearchPointsPerUnspentEmpirePoint { get; set; } - - public int ResourceStorage { get; set; } - - public ScoreDisplay ScoreDisplay { get; set; } - - public int Seed { get; set; } - - /// - /// Model to use for standard planetary mining. - /// - public MiningModel StandardMiningModel { get; set; } - - /// - /// How many star systems will be in the galaxy? - /// - public int StarSystemCount { get; set; } - - /// - /// Number of groups of connected star systems to generate. - /// 1 = all warp points connected - /// 2 = 2 distinct groups - /// ... - /// StarSystemCount = no warp points - /// - public int StarSystemGroups { get; set; } - - public int StartingResearch { get; set; } - - public int StartingResources { get; set; } - - /// - /// The starting technology level for empires. - /// TODO - have a separate starting tech level setting for neutrals? - /// - public StartingTechnologyLevel StartingTechnologyLevel { get; set; } - - /// - /// Technology research cost formula. - /// Low = Level * BaseCost - /// Medium = BaseCost for level 1, Level ^ 2 * BaseCost / 2 otherwise - /// Hight = Level ^ 2 * BaseCost - /// - public TechnologyCost TechnologyCost { get; set; } - - /// - /// The technology uniqueness factor. - /// Tech cost is increased if other players know a tech and this factor is positive, or decreased if it's negative. - /// - public int TechnologyUniqueness { get; set; } - - /// - /// Game victory conditions. - /// - public IList VictoryConditions { get; private set; } - - /// - /// Delay in turns before victory conditions take effect. - /// - public int VictoryDelay { get; set; } - - /// - /// Problems with this game setup. - /// - public IEnumerable Warnings - { - get - { - if (string.IsNullOrWhiteSpace(GameName)) - yield return "You must specify a name for the game."; - if (GalaxyTemplate == null) // TODO - default to first galaxy template? - yield return "You must specify a galaxy type."; - if (StarSystemCount > GalaxySize.Width * GalaxySize.Height) - yield return "The galaxy is too small to contain " + StarSystemCount + " star systems."; - if (EmpirePlacement != EmpirePlacement.CanStartInSameSystem && EmpireTemplates.Count + RandomAIs + MinorEmpires > StarSystemCount) - yield return "There are not enough star systems to give " + (EmpireTemplates.Count + RandomAIs + MinorEmpires) + " empires and minor races each their own home system."; - if (HomeworldSize == null) - yield return "You must specify a homeworld size."; - if (!EmpireTemplates.Any() && RandomAIs == 0) - yield return "You must add at least one empire."; - foreach (var et in EmpireTemplates) - { - if (et.PointsSpent > EmpirePoints) - yield return "The " + et + " has spent too many empire points."; - } - } - } - - /// - /// Strategy for placing warp points within systems. - /// - public WarpPointPlacementStrategy WarpPointPlacementStrategy { get; set; } - - public static GameSetup Load(string filename) - { - var fs = new FileStream(filename, FileMode.Open); - var gsu = Serializer.Deserialize(fs); - fs.Close(); fs.Dispose(); - return gsu; - } - - // TODO - status messages for the GUI - public void PopulateGalaxy(Galaxy gal, PRNG dice) - { - gal.Name = GameName; - - gal.CleanGameState(); - - // remove forbidden techs - foreach (var tname in ForbiddenTechnologyNames.Distinct()) - Mod.Current.Technologies.Single(t => t.Name == tname).Dispose(); - - // set omniscient view and all systems seen flags - gal.OmniscientView = OmniscientView; - gal.AllSystemsExploredFromStart = AllSystemsExplored; - - // set up mining models and resource stuff - gal.StandardMiningModel = StandardMiningModel; - gal.RemoteMiningModel = RemoteMiningModel; - gal.MinPlanetValue = MinPlanetValue; - gal.MinSpawnedPlanetValue = MinSpawnedPlanetValue; - gal.MaxSpawnedPlanetValue = MaxSpawnedPlanetValue; - gal.MaxPlanetValue = MaxPlanetValue; - gal.MinAsteroidValue = MinAsteroidValue; - gal.MinSpawnedAsteroidValue = MinSpawnedAsteroidValue; - gal.MaxSpawnedAsteroidValue = MaxSpawnedAsteroidValue; - - // set score display setting - gal.ScoreDisplay = ScoreDisplay; - - // set up victory conditions - foreach (var vc in VictoryConditions) - gal.VictoryConditions.Add(vc); - gal.VictoryDelay = VictoryDelay; - - // set up misc. game options - gal.TechnologyCost = TechnologyCost; - gal.TechnologyUniqueness = TechnologyUniqueness; - gal.IsHumansVsAI = IsHumansVsAI; - gal.AllowedTrades = AllowedTrades; - gal.IsSurrenderAllowed = IsSurrenderAllowed; - gal.IsIntelligenceAllowed = IsIntelligenceAllowed; - gal.CanColonizeOnlyBreathable = CanColonizeOnlyBreathable; - gal.CanColonizeOnlyHomeworldSurface = CanColonizeOnlyHomeworldSurface; - gal.WarpPointPlacementStrategy = WarpPointPlacementStrategy; - - // create player empires - foreach (var et in EmpireTemplates) - { - var emp = et.Instantiate(); - gal.Empires.Add(emp); - } - - // TODO - make sure empires don't reuse colors unless we really have to? - - // create random AI empires - for (int i = 1; i <= RandomAIs; i++) - { - // TODO - load saved EMP files for random AI empires - var surface = Mod.Current.StellarObjectTemplates.OfType().Where(p => !p.Size.IsConstructed).Select(p => p.Surface).Distinct().PickRandom(dice); - var atmosphere = Mod.Current.StellarObjectTemplates.OfType().Where(p => !p.Size.IsConstructed && p.Surface == surface).Select(p => p.Atmosphere).Distinct().PickRandom(dice); - var et = new EmpireTemplate - { - Name = "Random Empire #" + i, - LeaderName = "Random Leader #" + i, - PrimaryRace = new Race - { - Name = "Random Race #" + i, - NativeAtmosphere = atmosphere, - NativeSurface = surface, - }, - IsPlayerEmpire = false, - Color = RandomColor(dice), - Culture = Mod.Current.Cultures.PickRandom(dice), - AIName = Mod.Current.EmpireAIs.PickRandom(dice).Name, - }; - foreach (var apt in Aptitude.All) - et.PrimaryRace.Aptitudes[apt.Name] = 100; - var emp = et.Instantiate(); - gal.Empires.Add(emp); - } - - // create minor empires - for (int i = 1; i <= MinorEmpires; i++) - { - // TODO - load saved EMP files for minor empires - var surface = Mod.Current.StellarObjectTemplates.OfType().Where(p => !p.Size.IsConstructed).Select(p => p.Surface).Distinct().PickRandom(dice); - var atmosphere = Mod.Current.StellarObjectTemplates.OfType().Where(p => !p.Size.IsConstructed && p.Surface == surface).Select(p => p.Atmosphere).Distinct().PickRandom(dice); - var et = new EmpireTemplate - { - Name = "Minor Empire #" + i, - LeaderName = "Minor Leader #" + i, - PrimaryRace = new Race - { - Name = "Minor Race #" + i, - NativeAtmosphere = atmosphere, - NativeSurface = surface, - }, - IsPlayerEmpire = false, - IsMinorEmpire = true, - Color = RandomColor(dice), - Culture = Mod.Current.Cultures.PickRandom(dice), - AIName = Mod.Current.EmpireAIs.PickRandom(dice).Name, - }; - foreach (var apt in Aptitude.All) - et.PrimaryRace.Aptitudes[apt.Name] = 100; - var emp = et.Instantiate(); - gal.Empires.Add(emp); - } - - // place empires - // don't do them in any particular order, so P1 and P2 don't always wind up on opposite sides of the galaxy when using equidistant placement - foreach (var emp in gal.Empires.Shuffle(dice)) - PlaceEmpire(gal, emp, dice); - - - //Enabled AI ministers, so the AI's actually can do stuff. - foreach (var emp in gal.Empires.Where(x => !x.IsPlayerEmpire && x.AI != null)) - emp.EnabledMinisters = emp.AI.MinisterNames; - - // remove ruins if they're not allowed - if (!GenerateRandomRuins) - { - foreach (var p in gal.FindSpaceObjects()) - { - foreach (var abil in p.IntrinsicAbilities.ToArray()) - { - if (abil.Rule.Matches("Ancient Ruins")) - p.IntrinsicAbilities.Remove(abil); - } - } - } - if (!GenerateUniqueRuins) - { - foreach (var p in gal.FindSpaceObjects()) - { - foreach (var abil in p.IntrinsicAbilities.ToArray()) - { - if (abil.Rule.Matches("Ancient Ruins Unique")) - p.IntrinsicAbilities.Remove(abil); - } - } - } - - // also remove ruins from homeworlds, that's just silly :P - foreach (var p in gal.FindSpaceObjects().Where(p => p.Colony != null)) - { - foreach (var abil in p.IntrinsicAbilities.ToArray()) - { - if (abil.Rule.Matches("Ancient Ruins") || abil.Rule.Matches("Ancient Ruins Unique")) - p.IntrinsicAbilities.Remove(abil); - } - } - - // set up omniscient view - if (OmniscientView) - { - foreach (var emp in gal.Empires) - { - foreach (var sys in gal.StarSystemLocations.Select(l => l.Item)) - sys.ExploredByEmpires.Add(emp); - } - } - } - - public void Save(string filename) - { - var fs = new FileStream(filename, FileMode.Create); - Serializer.Serialize(this, fs); - fs.Close(); fs.Dispose(); - } - - /// - /// Makes a suitable homeworld for an empire. - /// - /// - private Planet MakeHomeworld(Empire emp, string hwName, PRNG dice) - { - var hw = Mod.Current.StellarObjectTemplates.OfType().Where(p => - p.Surface == emp.PrimaryRace.NativeSurface && - p.Atmosphere == emp.PrimaryRace.NativeAtmosphere && - p.Size == HomeworldSize) - .PickRandom(dice); - if (hw == null) - throw new Exception("No planets found in SectType.txt with surface " + emp.PrimaryRace.NativeSurface + ", atmosphere " + emp.PrimaryRace.NativeAtmosphere + ", and size " + HomeworldSize + ". Such a planet is required for creating the " + emp + " homeworld."); - hw = hw.Instantiate(); - hw.Name = hwName; - hw.Size = HomeworldSize; - hw.ConditionsAmount = Mod.Current.Settings.HomeworldConditions; - return hw; - } - - // TODO - status messages for the GUI - private void PlaceEmpire(Galaxy gal, Empire emp, PRNG dice) - { - if (AllSystemsExplored) - { - // set all systems explored - foreach (var sys in gal.StarSystemLocations.Select(ssl => ssl.Item)) - sys.ExploredByEmpires.Add(emp); - } - - // give empire starting techs - Galaxy.Current.CleanGameState(); // need to know what the techs in the game are! - foreach (var tech in Mod.Current.Technologies.Where(t => !t.IsRacial || emp.Abilities().Any(a => a.Rule.Matches("Tech Area") && a.Value1 == t.RacialTechID))) - { - switch (StartingTechnologyLevel) - { - case StartingTechnologyLevel.Low: - emp.ResearchedTechnologies[tech] = tech.StartLevel; - break; - - case StartingTechnologyLevel.Medium: - emp.ResearchedTechnologies[tech] = Math.Max(tech.StartLevel, tech.RaiseLevel); - break; - - case StartingTechnologyLevel.High: - emp.ResearchedTechnologies[tech] = tech.MaximumLevel; - break; - } - } - - // give empire starting resources and storage capacity - foreach (var r in Resource.All.Where(r => r.IsGlobal)) - { - emp.StoredResources.Add(r, StartingResources); - emp.IntrinsicResourceStorage.Add(r, ResourceStorage); - } - - // give empire starting research - emp.BonusResearch = StartingResearch + (int)(ResearchPointsPerUnspentEmpirePoint * (EmpirePoints - emp.PrimaryRace.PointsSpent)); - - // TODO - moddable colony techs? - string colonyTechName = null; - if ((emp.PrimaryRace.NativeSurface) == "Rock") - colonyTechName = "Rock Planet Colonization"; - else if ((emp.PrimaryRace.NativeSurface) == "Ice") - colonyTechName = "Ice Planet Colonization"; - else if ((emp.PrimaryRace.NativeSurface) == "Gas Giant") - colonyTechName = "Gas Giant Colonization"; - var colonyTech = Mod.Current.Technologies.SingleOrDefault(t => t.Name == colonyTechName); - if (colonyTech != null && emp.ResearchedTechnologies[colonyTech] < 1) - emp.ResearchedTechnologies[colonyTech] = 1; - - // find facilities to place on homeworlds - var facils = emp.UnlockedItems.OfType(); - var sy = facils.LastOrDefault(facil => facil.HasAbility("Space Yard")); - var sp = facils.LastOrDefault(facil => facil.HasAbility("Spaceport")); - var rd = facils.LastOrDefault(facil => facil.HasAbility("Supply Generation")); - var min = facils.WithMax(facil => facil.GetAbilityValue("Resource Generation - Minerals").ToInt()).LastOrDefault(); - var org = facils.WithMax(facil => facil.GetAbilityValue("Resource Generation - Organics").ToInt()).LastOrDefault(); - var rad = facils.WithMax(facil => facil.GetAbilityValue("Resource Generation - Radioactives").ToInt()).LastOrDefault(); - var res = facils.WithMax(facil => facil.GetAbilityValue("Point Generation - Research").ToInt()).LastOrDefault(); - // TODO - game setup option for intel facilities on homeworlds? HomeworldStartingFacilities.txt ala se5? - - // SY rate, for colonies - var rate = new ResourceQuantity(); - if (sy != null) - { - // TODO - define mappings between SY ability numbers and resource names in a mod file - rate.Add(Resource.Minerals, sy.GetAbilityValue("Space Yard", 2, true, true, a => a.Value1 == "1").ToInt()); - rate.Add(Resource.Organics, sy.GetAbilityValue("Space Yard", 2, true, true, a => a.Value1 == "2").ToInt()); - rate.Add(Resource.Radioactives, sy.GetAbilityValue("Space Yard", 2, true, true, a => a.Value1 == "3").ToInt()); - } - - // build connectivity graph for computing warp distance - var graph = new ConnectivityGraph(); - foreach (var s in Galaxy.Current.StarSystemLocations.Select(ssl => ssl.Item)) - graph.Add(s); - foreach (var s in Galaxy.Current.StarSystemLocations.Select(ssl => ssl.Item)) - { - foreach (var wp in s.FindSpaceObjects()) - graph.Connect(s, wp.TargetStarSystemLocation.Item, true); - } - - for (int i = 0; i < HomeworldsPerEmpire; i++) - { - // TODO - respect Empire Placement and Max Homeworld Dispersion settings - var planets = gal.StarSystemLocations.SelectMany(ssl => ssl.Item.FindSpaceObjects(p => p.Owner == null && p.MoonOf == null)); - var okSystems = gal.StarSystemLocations.Select(ssl => ssl.Item).Where(sys => sys.EmpiresCanStartIn); - if (i > 0) - { - // make sure subsequent homeworlds are placed within a limited number of warps from the first homeworld - okSystems = okSystems.Where(sys => graph.ComputeDistance(sys, emp.OwnedSpaceObjects.OfType().First().FindStarSystem()) <= MaxHomeworldDispersion); - } - switch (EmpirePlacement) - { - case EmpirePlacement.CanStartInSameSystem: - // no further filtering - break; - - case EmpirePlacement.DifferentSystems: - // filter to systems containing no other empires' homeworlds - okSystems = okSystems.Where(sys => !sys.FindSpaceObjects(p => p.Owner != null && p.Owner != emp).Any()); - break; - - case EmpirePlacement.Equidistant: - // filter to systems containing no other empires' homeworlds - okSystems = okSystems.Where(sys => !sys.FindSpaceObjects(p => p.Owner != null && p.Owner != emp).Any()); - // filter to systems that are the maximum distance away from any other empire's homeworlds - var otherEmpireHomeSystems = gal.StarSystemLocations.SelectMany(ssl => ssl.Item.FindSpaceObjects(p => p.Owner != null && p.Owner != emp).Select(p => p.FindStarSystem()).Distinct()).ToArray(); - okSystems = okSystems.WithMax(sys => otherEmpireHomeSystems.Min(o => graph.ComputeDistance(sys, o))); - break; - } - okSystems = okSystems.ToArray(); - if (!okSystems.Any()) - { - // replace an inhospitable system with a hospitable one - var convertSys = gal.StarSystemLocations.Select(ssl => ssl.Item).Where(sys => !sys.EmpiresCanStartIn).PickRandom(dice); - if (convertSys == null) - throw new Exception("No suitable system found to place " + emp + "'s homeworld #" + (i + 1) + ". (Try increasing the number of star systems.)"); - var newSys = Mod.Current.StarSystemTemplates.Where(q => q.EmpiresCanStartIn).PickRandom(dice).Instantiate(); - var sid = convertSys.ID; - newSys.CopyTo(convertSys); - convertSys.ID = sid; - convertSys.Name = Mod.Current.StarSystemNames.Except(gal.StarSystemLocations.Select(q => q.Item.Name)).PickRandom(dice); - foreach (var l in Galaxy.Current.StarSystemLocations) - { - foreach (var wp in l.Item.FindSpaceObjects().Where(q => q.Target.StarSystem == convertSys).ToArray()) - { - wp.Dispose(); - WarpPointPlacementStrategy.PlaceWarpPoints(Galaxy.Current.StarSystemLocations.Single(q => q.Item == convertSys), l); - } - } - GalaxyTemplate.NameStellarObjects(convertSys); - okSystems = new[] { convertSys }; - } - Planet hw; - planets = planets.Where(p => okSystems.Contains(p.FindStarSystem())); - if (!planets.Any()) - { - // make sure we're placing the homeworld in a system with at least one empty sector - okSystems = okSystems.Where(sys2 => sys2.Sectors.Any(sec => !sec.SpaceObjects.Any())); - - if (!okSystems.Any()) - throw new Exception("No suitable system found to place " + emp + "'s homeworld #" + (i + 1) + ". (Try regenerating the map or increasing the number of star systems.)"); - - // make brand new planet in an OK system - var sys = okSystems.PickRandom(dice); - var nextNum = sys.FindSpaceObjects(p => p.MoonOf == null).Count() + 1; - hw = MakeHomeworld(emp, sys.Name + " " + nextNum.ToRomanNumeral(), dice); - var okSectors = sys.Sectors.Where(sector => !sector.SpaceObjects.Any()); - okSectors.PickRandom(dice).Place(hw); - } - else - hw = planets.PickRandom(dice); - if (hw.Surface != emp.PrimaryRace.NativeSurface || hw.Atmosphere != emp.PrimaryRace.NativeAtmosphere || hw.Size != HomeworldSize) - { - var replacementHomeworld = MakeHomeworld(emp, hw.Name, dice); - replacementHomeworld.CopyTo(hw); - } - hw.ResourceValue[Resource.Minerals] = hw.ResourceValue[Resource.Organics] = hw.ResourceValue[Resource.Radioactives] = HomeworldValue; - hw.Colony = new Colony - { - Owner = emp, - ConstructionQueue = new(hw), - IsHomeworld = true, - }; - hw.AddPopulation(emp.PrimaryRace, hw.Size.MaxPopulation); - - // function to create a facility if possible - void TryCreateFacility(FacilityTemplate? template) - { - if (template is not null && hw.Colony.Facilities.Count < hw.MaxFacilities) - { - var facility = template.Instantiate(); - hw.Colony.Facilities.Add(facility); - facility.ConstructionProgress = facility.Cost; - } - } - - // create basic facilities, one each - TryCreateFacility(sy); - if (!emp.PrimaryRace.HasAbility("No Spaceports")) - { - TryCreateFacility(sp); - } - TryCreateFacility(rd); - TryCreateFacility(rad); - TryCreateFacility(org); - - // fill remaining space with half mineral miners and half research facilities - var lastCount = 0; - while (hw.Colony.Facilities.Count < hw.MaxFacilities && hw.Colony.Facilities.Count > lastCount) - { - lastCount = hw.Colony.Facilities.Count; - - TryCreateFacility(min); - - // no research facilities needed at max tech! - if (StartingTechnologyLevel != StartingTechnologyLevel.High) - { - TryCreateFacility(res); - } - } - } - - // mark home systems explored - foreach (var sys in gal.StarSystemLocations.Select(ssl => ssl.Item)) - { - if (!sys.ExploredByEmpires.Contains(emp) && sys.FindSpaceObjects().Any(planet => planet.Owner == emp)) - sys.ExploredByEmpires.Add(emp); - } - - // in case two empires started in the same system - foreach (var x in gal.FindSpaceObjects().Owned().ToArray()) - x.UpdateEmpireMemories(); - } - - /// - /// Picks a random color from a limited palette of 63 colors. - /// - /// - private Color RandomColor(PRNG dice) - { - int r = 0, g = 0, b = 0; - while (r == 0 && g == 0 && b == 0) - { - r = RandomRGB(dice); - g = RandomRGB(dice); - b = RandomRGB(dice); - } - return Color.FromArgb(r, g, b); - } - - /// - /// Generates a random number used to pick a color from a limited palette of 63 colors. - /// - /// - private int RandomRGB(PRNG dice) - { - return RandomHelper.Range(0, 3, dice) * 85; - } -} diff --git a/FrEee/Setup/StarSystemPlacementStrategies/ClusteredStarSystemPlacementStrategy.cs b/FrEee/Setup/StarSystemPlacementStrategies/ClusteredStarSystemPlacementStrategy.cs deleted file mode 100644 index ba425af30..000000000 --- a/FrEee/Setup/StarSystemPlacementStrategies/ClusteredStarSystemPlacementStrategy.cs +++ /dev/null @@ -1,62 +0,0 @@ -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Setup.StarSystemPlacementStrategies; - -/// -/// Places stars grouped together in tight clusters separated by long distances. -/// -[Serializable] -public class ClusteredStarSystemPlacementStrategy : IStarSystemPlacementStrategy -{ - public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) - { - var openPositions = bounds.GetAllPoints(); - foreach (var sspos in galaxy.StarSystemLocations.Select(sspos => sspos.Location)) - openPositions = openPositions.BlockOut(sspos, buffer); - if (!openPositions.Any()) - return null; - - // sort positions by distance to nearest star - var ordered = openPositions.Select(p => new - { - Position = p, - Distances = galaxy.StarSystemLocations.Select(sspos => sspos.Location.ManhattanDistance(p)).OrderBy(dist => dist) - }).OrderBy(p => p.Distances.MinOrDefault()); - var minDist = ordered.SelectMany(p => p.Distances).MinOrDefault(); - - if (dice.Next(2) == 0) - { - // place a star near other stars, but not near TOO many other stars - var ok = ordered.Where(item => item.Distances.FirstOrDefault() == minDist); - Dictionary dict; - if (ok.Any()) - { - dict = new Dictionary(); - foreach (var p in ok) - dict.Add(p.Position, 1d / p.Distances.Sum(d => Math.Pow(d, 3))); - } - else - { - // place a star off in the middle of nowhere - dict = new Dictionary(); - foreach (var p in ordered) - dict.Add(p.Position, p.Distances.Sum(d => Math.Pow(d, 3))); - } - return dict.PickWeighted(dice); - } - else - { - // place a star off in the middle of nowhere - var dict = new Dictionary(); - foreach (var p in ordered) - dict.Add(p.Position, p.Distances.Sum(d => Math.Pow(d, 3))); - return dict.PickWeighted(dice); - } - } -} \ No newline at end of file diff --git a/FrEee/Setup/StarSystemPlacementStrategies/DiffuseStarSystemPlacementStrategy.cs b/FrEee/Setup/StarSystemPlacementStrategies/DiffuseStarSystemPlacementStrategy.cs deleted file mode 100644 index 9a1d26b00..000000000 --- a/FrEee/Setup/StarSystemPlacementStrategies/DiffuseStarSystemPlacementStrategy.cs +++ /dev/null @@ -1,30 +0,0 @@ -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Drawing; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Setup.StarSystemPlacementStrategies; - -/// -/// Places stars spaced roughly evenly. -/// -[Serializable] -public class DiffuseStarSystemPlacementStrategy : IStarSystemPlacementStrategy -{ - public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) - { - var openPositions = bounds.GetAllPoints(); - foreach (var sspos in galaxy.StarSystemLocations.Select(sspos => sspos.Location)) - openPositions = openPositions.BlockOut(sspos, buffer); - if (!openPositions.Any()) - return null; - - // sort positions by distance to nearest star - var ordered = openPositions.OrderBy(p => galaxy.StarSystemLocations.Select(sspos => sspos.Location).MinOrDefault(p2 => p2.ManhattanDistance(p))); - - // place a star off in the middle of nowhere - return ordered.Last(); - } -} \ No newline at end of file diff --git a/FrEee/Setup/StarSystemPlacementStrategies/GridStarSystemPlacementStrategy.cs b/FrEee/Setup/StarSystemPlacementStrategies/GridStarSystemPlacementStrategy.cs deleted file mode 100644 index 7ac470283..000000000 --- a/FrEee/Setup/StarSystemPlacementStrategies/GridStarSystemPlacementStrategy.cs +++ /dev/null @@ -1,49 +0,0 @@ -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Drawing; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Setup.StarSystemPlacementStrategies; - -/// -/// Places stars in a grid. -/// -[Serializable] -public class GridStarSystemPlacementStrategy : IStarSystemPlacementStrategy -{ - public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) - { - var openPositions = bounds.GetAllPoints(); - foreach (var sspos in galaxy.StarSystemLocations.Select(sspos => sspos.Location)) - openPositions = openPositions.BlockOut(sspos, buffer); - if (!openPositions.Any()) - return null; - - int totalStars = starsLeft + galaxy.StarSystemLocations.Count; - double xfactor = Math.Sqrt(totalStars) * (double)bounds.Height / (double)bounds.Width; - double yfactor = Math.Sqrt(totalStars) * (double)bounds.Width / (double)bounds.Height; - int xstars = (int)(totalStars / xfactor); - int ystars = (int)(totalStars / yfactor); - - if (xstars * ystars <= galaxy.StarSystemLocations.Count) - return null; - - int row = galaxy.StarSystemLocations.Count % xstars; - int col = galaxy.StarSystemLocations.Count / xstars; - int rowsize, colsize; - if (xstars == 1) - rowsize = bounds.Width / 2; - else - rowsize = bounds.Width / (xstars - 1); - if (ystars == 1) - colsize = bounds.Height / 2; - else - colsize = bounds.Height / (ystars - 1); - - var idealPos = new Point(row * rowsize + bounds.Left, col * colsize + bounds.Top); - - return openPositions.OrderBy(p => p.ManhattanDistance(idealPos)).First(); - } -} \ No newline at end of file diff --git a/FrEee/Setup/StarSystemPlacementStrategies/RandomStarSystemPlacementStrategy.cs b/FrEee/Setup/StarSystemPlacementStrategies/RandomStarSystemPlacementStrategy.cs deleted file mode 100644 index 1896ea991..000000000 --- a/FrEee/Setup/StarSystemPlacementStrategies/RandomStarSystemPlacementStrategy.cs +++ /dev/null @@ -1,25 +0,0 @@ -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Drawing; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Setup.StarSystemPlacementStrategies; - -/// -/// Places stars randomly. -/// -[Serializable] -public class RandomStarSystemPlacementStrategy : IStarSystemPlacementStrategy -{ - public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) - { - var openPositions = bounds.GetAllPoints(); - foreach (var sspos in galaxy.StarSystemLocations) - openPositions = openPositions.BlockOut(sspos.Location, buffer); - if (!openPositions.Any()) - return null; - return openPositions.PickRandom(dice); - } -} \ No newline at end of file diff --git a/FrEee/Setup/StarSystemPlacementStrategies/SpiralStarSystemPlacementStrategy.cs b/FrEee/Setup/StarSystemPlacementStrategies/SpiralStarSystemPlacementStrategy.cs deleted file mode 100644 index ce8fe9335..000000000 --- a/FrEee/Setup/StarSystemPlacementStrategies/SpiralStarSystemPlacementStrategy.cs +++ /dev/null @@ -1,33 +0,0 @@ -using FrEee.Utility; -using FrEee.Extensions; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Setup.StarSystemPlacementStrategies; - -/// -/// Places stars clustered around the center of the galaxy. -/// -[Serializable] -public class SpiralStarSystemPlacementStrategy : IStarSystemPlacementStrategy -{ - public Point? PlaceStarSystem(Galaxy galaxy, int buffer, Rectangle bounds, int starsLeft, PRNG dice) - { - var openPositions = bounds.GetAllPoints(); - foreach (var sspos in galaxy.StarSystemLocations.Select(sspos => sspos.Location)) - openPositions = openPositions.BlockOut(sspos, buffer); - if (!openPositions.Any()) - return null; - - // weight locations based on gradient from distance to center - var center = new Point(bounds.X + bounds.Width / 2, bounds.Y + bounds.Height / 2); - var ordered = openPositions.Select(p => new KeyValuePair(p, Math.Pow(p.ManhattanDistance(center), 2))).ToDictionary(kvp => kvp.Key, kvp => kvp.Value); - var max = ordered.Max(kvp => kvp.Value); - foreach (var p in ordered.Keys.ToArray()) - ordered[p] = max / ordered[p]; - return ordered.PickWeighted(dice); - } -} \ No newline at end of file diff --git a/FrEee/Setup/WarpPointPlacementStrategies/CenterWarpPointPlacementStrategy.cs b/FrEee/Setup/WarpPointPlacementStrategies/CenterWarpPointPlacementStrategy.cs deleted file mode 100644 index 126ac8f28..000000000 --- a/FrEee/Setup/WarpPointPlacementStrategies/CenterWarpPointPlacementStrategy.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FrEee.Objects.Space; - -namespace FrEee.Setup.WarpPointPlacementStrategies; - -/// -/// Places warp points at the center of the system. Exploration is easy, but so is setting up chokepoints. -/// -public class CenterWarpPointPlacementStrategy : WarpPointPlacementStrategy -{ - static CenterWarpPointPlacementStrategy() - { - Instance = new CenterWarpPointPlacementStrategy(); - } - - private CenterWarpPointPlacementStrategy() - : base("Center", "Places warp points at the center of the system. Exploration is easy, but so is setting up chokepoints.") - { - } - - public static CenterWarpPointPlacementStrategy Instance { get; private set; } - - public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) - { - return here.Item.GetSector(0, 0); - } -} \ No newline at end of file diff --git a/FrEee/Setup/WarpPointPlacementStrategies/EdgeAlignedWarpPointPlacementStrategy.cs b/FrEee/Setup/WarpPointPlacementStrategies/EdgeAlignedWarpPointPlacementStrategy.cs deleted file mode 100644 index 4273831eb..000000000 --- a/FrEee/Setup/WarpPointPlacementStrategies/EdgeAlignedWarpPointPlacementStrategy.cs +++ /dev/null @@ -1,34 +0,0 @@ -using FrEee.Objects.Space; -using FrEee.Extensions; -using System; - -namespace FrEee.Setup.WarpPointPlacementStrategies; - -/// -/// Places warp points along the edge of the system, aligned with the star systems they lead to. -/// -public class EdgeAlignedWarpPointPlacementStrategy : WarpPointPlacementStrategy -{ - static EdgeAlignedWarpPointPlacementStrategy() - { - Instance = new EdgeAlignedWarpPointPlacementStrategy(); - } - - private EdgeAlignedWarpPointPlacementStrategy() - : base("Edge Aligned", "Places warp points along the edge of the system, aligned with the star systems they lead to.") - { - } - - public static EdgeAlignedWarpPointPlacementStrategy Instance { get; private set; } - - public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) - { - var angle = here.Location.AngleTo(there.Location); - var y = Math.Sin(angle / 180d * Math.PI) * here.Item.Radius; - var x = Math.Cos(angle / 180d * Math.PI) * here.Item.Radius; - var multiplier = here.Item.Radius / Math.Max(Math.Abs(x), Math.Abs(y)); - x *= multiplier; - y *= multiplier; - return here.Item.GetSector((int)Math.Round(x), (int)Math.Round(y)); - } -} \ No newline at end of file diff --git a/FrEee/Setup/WarpPointPlacementStrategies/PlanetWarpPointPlacementStrategy.cs b/FrEee/Setup/WarpPointPlacementStrategies/PlanetWarpPointPlacementStrategy.cs deleted file mode 100644 index e17b55f48..000000000 --- a/FrEee/Setup/WarpPointPlacementStrategies/PlanetWarpPointPlacementStrategy.cs +++ /dev/null @@ -1,35 +0,0 @@ -using FrEee.Objects.Space; -using FrEee.Extensions; -using System.Linq; - -namespace FrEee.Setup.WarpPointPlacementStrategies; - -/// -/// Places warp points at the location of planets. If there are no planets, warp points will be placed randomly. Planets on warp points will be particularly vulnerable to attack. -/// -public class PlanetWarpPointPlacementStrategy : WarpPointPlacementStrategy -{ - static PlanetWarpPointPlacementStrategy() - { - Instance = new PlanetWarpPointPlacementStrategy(); - } - - private PlanetWarpPointPlacementStrategy() - : base("Planet", "Places warp points at the location of planets. If there are no planets, warp points will be placed randomly. Planets on warp points will be particularly vulnerable to attack.") - { - } - - public static PlanetWarpPointPlacementStrategy Instance { get; private set; } - - public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) - { - var planets = here.Item.FindSpaceObjects(); - if (planets.Any()) - { - var planet = planets.PickRandom(); - return planet.Sector; - } - else - return RandomWarpPointPlacementStrategy.Instance.GetWarpPointSector(here, there); - } -} \ No newline at end of file diff --git a/FrEee/Setup/WarpPointPlacementStrategies/RandomAlignedWarpPointPlacementStrategy.cs b/FrEee/Setup/WarpPointPlacementStrategies/RandomAlignedWarpPointPlacementStrategy.cs deleted file mode 100644 index 1f3d4ae9d..000000000 --- a/FrEee/Setup/WarpPointPlacementStrategies/RandomAlignedWarpPointPlacementStrategy.cs +++ /dev/null @@ -1,35 +0,0 @@ -using FrEee.Objects.Space; -using FrEee.Utility; -using FrEee.Extensions; -using System; - -namespace FrEee.Setup.WarpPointPlacementStrategies; - -/// -/// Places warp points randomly within a system, but aligned with the star system they lead to. Exploration is difficult due to needing to traverse entire systems. -/// -public class RandomAlignedWarpPointPlacementStrategy : WarpPointPlacementStrategy -{ - static RandomAlignedWarpPointPlacementStrategy() - { - Instance = new RandomAlignedWarpPointPlacementStrategy(); - } - - private RandomAlignedWarpPointPlacementStrategy() - : base("Random Aligned", "Places warp points randomly within a system, but aligned with the star system they lead to. Exploration is difficult due to needing to traverse entire systems.") - { - } - - public static RandomAlignedWarpPointPlacementStrategy Instance { get; private set; } - - public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) - { - var angle = here.Location.AngleTo(there.Location); - var y = Math.Sin(angle / 180d * Math.PI) * here.Item.Radius; - var x = Math.Cos(angle / 180d * Math.PI) * here.Item.Radius; - var multiplier = RandomHelper.Next(here.Item.Radius / Math.Max(Math.Abs(x), Math.Abs(y))); - x *= multiplier; - y *= multiplier; - return here.Item.GetSector((int)Math.Round(x), (int)Math.Round(y)); - } -} \ No newline at end of file diff --git a/FrEee/Setup/WarpPointPlacementStrategies/RandomWarpPointPlacementStrategy.cs b/FrEee/Setup/WarpPointPlacementStrategies/RandomWarpPointPlacementStrategy.cs deleted file mode 100644 index 0a7c6f8b5..000000000 --- a/FrEee/Setup/WarpPointPlacementStrategies/RandomWarpPointPlacementStrategy.cs +++ /dev/null @@ -1,28 +0,0 @@ -using FrEee.Objects.Space; -using FrEee.Utility; -namespace FrEee.Setup.WarpPointPlacementStrategies; - -/// -/// Places warp points randomly within a system. -/// -public class RandomWarpPointPlacementStrategy : WarpPointPlacementStrategy -{ - static RandomWarpPointPlacementStrategy() - { - Instance = new RandomWarpPointPlacementStrategy(); - } - - private RandomWarpPointPlacementStrategy() - : base("Random", "Places warp points randomly within a system.") - { - } - - public static RandomWarpPointPlacementStrategy Instance { get; private set; } - - public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) - { - var x = RandomHelper.Range(-here.Item.Radius, here.Item.Radius); - var y = RandomHelper.Range(-here.Item.Radius, here.Item.Radius); - return here.Item.GetSector(x, y); - } -} \ No newline at end of file diff --git a/FrEee/Setup/WarpPointPlacementStrategies/StarWarpPointPlacementStrategy.cs b/FrEee/Setup/WarpPointPlacementStrategies/StarWarpPointPlacementStrategy.cs deleted file mode 100644 index 39da8a179..000000000 --- a/FrEee/Setup/WarpPointPlacementStrategies/StarWarpPointPlacementStrategy.cs +++ /dev/null @@ -1,35 +0,0 @@ -using FrEee.Objects.Space; -using FrEee.Extensions; -using System.Linq; - -namespace FrEee.Setup.WarpPointPlacementStrategies; - -/// -/// Places warp points at the location of stars. If there are no stars, warp points will be placed randomly. Exploration is easy, but so is setting up chokepoints. -/// -public class StarWarpPointPlacementStrategy : WarpPointPlacementStrategy -{ - static StarWarpPointPlacementStrategy() - { - Instance = new StarWarpPointPlacementStrategy(); - } - - private StarWarpPointPlacementStrategy() - : base("Star", "Places warp points at the location of stars. If there are no stars, warp points will be placed randomly. Exploration is easy, but so is setting up chokepoints.") - { - } - - public static StarWarpPointPlacementStrategy Instance { get; private set; } - - public override Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there) - { - var stars = here.Item.FindSpaceObjects(); - if (stars.Any()) - { - var star = stars.PickRandom(); - return star.Sector; - } - else - return RandomWarpPointPlacementStrategy.Instance.GetWarpPointSector(here, there); - } -} \ No newline at end of file diff --git a/FrEee/Setup/WarpPointPlacementStrategies/WarpPointPlacementStrategy.cs b/FrEee/Setup/WarpPointPlacementStrategies/WarpPointPlacementStrategy.cs deleted file mode 100644 index 7afb2f48f..000000000 --- a/FrEee/Setup/WarpPointPlacementStrategies/WarpPointPlacementStrategy.cs +++ /dev/null @@ -1,101 +0,0 @@ -using FrEee.Objects.Abilities; -using FrEee.Objects.Space; -using FrEee.Modding; -using FrEee.Extensions; -using System.Collections.Generic; -using System.Linq; -using FrEee.Objects.GameState; - -namespace FrEee.Setup.WarpPointPlacementStrategies; - -/// -/// Strategy for placing warp points in a star system. -/// -public abstract class WarpPointPlacementStrategy -{ - static WarpPointPlacementStrategy() - { - all.Add(EdgeAlignedWarpPointPlacementStrategy.Instance); - all.Add(RandomAlignedWarpPointPlacementStrategy.Instance); - all.Add(RandomWarpPointPlacementStrategy.Instance); - all.Add(CenterWarpPointPlacementStrategy.Instance); - all.Add(StarWarpPointPlacementStrategy.Instance); - all.Add(PlanetWarpPointPlacementStrategy.Instance); - } - - protected WarpPointPlacementStrategy(string name, string description) - { - Name = name; - Description = description; - } - - public static IEnumerable All { get { return all; } } - public string Description { get; set; } - public string Name { get; set; } - private static ICollection all = new List(); - - /// - /// Gets the sector that a warp point should be placed in. - /// - /// - /// - /// - public abstract Sector GetWarpPointSector(ObjectLocation here, ObjectLocation there); - - public void PlaceWarpPoints(ObjectLocation here, ObjectLocation there) - { - var abil1 = here.Item.WarpPointAbilities.Instantiate(); - var abil2 = there.Item.WarpPointAbilities.Instantiate(); - ITemplate wpTemplate; - if (abil1 != null || abil2 != null) - { - // use unusual warp point templates - wpTemplate = Mod.Current.StellarObjectTemplates.OfType().Where(wp => wp.IsUnusual).PickRandom(); - } - else - { - // use normal warp point templates - wpTemplate = Mod.Current.StellarObjectTemplates.OfType().Where(wp => !wp.IsUnusual).PickRandom(); - } - - Sector sector1, sector2; - // HACK - for sectors with null systems - int retries = 0; - do - { - sector1 = GetWarpPointSector(here, there); - retries++; - } while (sector1.StarSystem == null && retries < 10); - do - { - sector2 = GetWarpPointSector(there, here); - retries++; - } while (sector2.StarSystem == null && retries < 10); - - var wp1 = wpTemplate.Instantiate(); - wp1.IsOneWay = false; - wp1.Name = "Warp Point to " + there.Item; - wp1.Target = sector2; - sector1.Place(wp1); - var wp2 = wpTemplate.Instantiate(); - wp2.IsOneWay = false; - wp2.Name = "Warp Point to " + here.Item; - wp2.Target = sector1; - sector2.Place(wp2); - Ability abil = null; - if (abil1 != null && abil2 != null) - { - var abils = new Ability[] { abil1, abil2 }; - abil = abils.PickRandom(); - } - else if (abil1 != null) - abil = abil1; - else if (abil2 != null) - abil = abil2; - if (abil != null) - { - wp1.IntrinsicAbilities.Add(abil); - wp2.IntrinsicAbilities.Add(abil); - } - } -} \ No newline at end of file