From 2f52fd0031faf4f3cffd5d0c1a42f18acaf32069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Thu, 8 Feb 2018 16:16:03 +0100 Subject: [PATCH] New ship upgrade system, replacing equipments --- README.md | 66 +- TODO.md | 36 +- graphics/exported/action/damageprotector.png | Bin 0 -> 56864 bytes .../{equipment => action}/forcefield.png | Bin .../{equipment => action}/fractalhull.png | Bin .../{equipment => action}/gatlinggun.png | Bin .../{equipment => action}/gravitshield.png | Bin .../{equipment => action}/hardcoatedhull.png | Bin .../{equipment => action}/invertershield.png | Bin .../{equipment => action}/ionthruster.png | Bin .../{equipment => action}/ironhull.png | Bin .../{equipment => action}/kelvingenerator.png | Bin .../{equipment => action}/nuclearreactor.png | Bin .../{equipment => action}/powerdepleter.png | Bin graphics/exported/action/precisionboost.png | Bin 0 -> 39478 bytes .../{equipment => action}/prokhorovlaser.png | Bin .../{equipment => action}/repairdrone.png | Bin .../{equipment => action}/rocketengine.png | Bin .../{equipment => action}/shieldtransfer.png | Bin .../submunitionmissile.png | Bin .../{equipment => action}/voidhawkengine.png | Bin .../hull_capacity.png} | Bin .../maneuvrability.png} | Bin .../power_capacity.png} | Bin .../precision.png} | Bin .../shield_capacity.png} | Bin .../exported/battle/tooltip/ship-portrait.png | Bin 1831 -> 1447 bytes .../character/attribute-precision.png | Bin 4821 -> 0 bytes graphics/exported/character/attribute.png | Bin 1305 -> 0 bytes graphics/exported/character/cargo-slot.png | Bin 1043 -> 0 bytes .../exported/character/close-button-hover.png | Bin 0 -> 11910 bytes graphics/exported/character/close-button.png | Bin 0 -> 10910 bytes graphics/exported/character/close.png | Bin 4243 -> 0 bytes graphics/exported/character/entry.png | Bin 0 -> 13398 bytes .../exported/character/equipment-slot.png | Bin 4794 -> 0 bytes graphics/exported/character/experience.png | Bin 323 -> 0 bytes graphics/exported/character/initial.png | Bin 0 -> 6844 bytes graphics/exported/character/level-display.png | Bin 0 -> 2360 bytes .../exported/character/level-experience.png | Bin 0 -> 849 bytes .../exported/character/level-separator.png | Bin 0 -> 6166 bytes .../exported/character/level-upgrades.png | Bin 0 -> 2523 bytes .../exported/character/name-button-hover.png | Bin 0 -> 3958 bytes graphics/exported/character/name-button.png | Bin 0 -> 4023 bytes graphics/exported/character/name-display.png | Bin 0 -> 4631 bytes .../exported/character/portrait-hover.png | Bin 0 -> 1367 bytes graphics/exported/character/portrait-on.png | Bin 0 -> 474 bytes graphics/exported/character/portrait.png | Bin 0 -> 416 bytes graphics/exported/character/price-tag.png | Bin 2340 -> 0 bytes graphics/exported/character/random-off.png | Bin 3963 -> 0 bytes graphics/exported/character/random-on.png | Bin 4383 -> 0 bytes graphics/exported/character/rename-off.png | Bin 1173 -> 0 bytes graphics/exported/character/rename-on.png | Bin 1783 -> 0 bytes graphics/exported/character/ship-column.png | Bin 0 -> 35980 bytes .../exported/character/ship-description.png | Bin 0 -> 3641 bytes graphics/exported/character/ship-model.png | Bin 0 -> 4608 bytes graphics/exported/character/ship-selected.png | Bin 8344 -> 0 bytes graphics/exported/character/ship.png | Bin 3107 -> 0 bytes graphics/exported/character/skill-upgrade.png | Bin 1694 -> 0 bytes graphics/exported/character/slot-engine.png | Bin 3134 -> 0 bytes .../exported/character/upgrade-available.png | Bin 1153 -> 0 bytes graphics/exported/character/upgrade-hover.png | Bin 0 -> 463 bytes .../exported/character/upgrade-locked.png | Bin 0 -> 11758 bytes graphics/exported/character/upgrade-on.png | Bin 0 -> 3552 bytes graphics/exported/character/upgrade-point.png | Bin 0 -> 373 bytes graphics/exported/character/upgrade.png | Bin 0 -> 4937 bytes graphics/exported/character/validate.png | Bin 4400 -> 0 bytes graphics/exported/character/value-hull.png | Bin 3063 -> 0 bytes graphics/exported/character/value-power.png | Bin 2024 -> 0 bytes .../exported/equipment/damageprotector.png | Bin 56232 -> 0 bytes graphics/exported/map/options-hover.png | Bin 0 -> 5763 bytes graphics/exported/map/options.png | Bin 0 -> 4954 bytes graphics/exported/map/zoom-in-hover.png | Bin 0 -> 6239 bytes graphics/exported/map/zoom-in.png | Bin 0 -> 4850 bytes graphics/exported/map/zoom-out-hover.png | Bin 0 -> 6239 bytes graphics/exported/map/zoom-out.png | Bin 0 -> 4719 bytes graphics/ui/actions.svg | 6 +- graphics/ui/battle.svg | 46 +- graphics/ui/character.svg | 4120 +++++++++-------- graphics/ui/map.svg | 70 +- graphics/ui/pics/action.png | Bin 0 -> 63327 bytes .../pics/attribute.png} | Bin graphics/ui/pics/portrait.png | Bin 0 -> 90985 bytes graphics/ui/pics/sprite.png | Bin 0 -> 8248 bytes out/assets/images/character/sheet.png | Bin 42814 -> 148199 bytes out/assets/images/map/buttons.png | Bin 24869 -> 0 bytes out/loot.html | 129 - src/common | 2 +- src/core/Battle.spec.ts | 67 +- src/core/Battle.ts | 5 +- src/core/BattleCheats.spec.ts | 16 - src/core/BattleCheats.ts | 18 - src/core/BattleOutcome.spec.ts | 56 - src/core/BattleOutcome.ts | 73 +- src/core/BattleStats.spec.ts | 21 - src/core/BattleStats.ts | 18 - src/core/Drone.spec.ts | 20 +- src/core/Equipment.spec.ts | 117 - src/core/Equipment.ts | 180 - src/core/Fleet.spec.ts | 35 - src/core/Fleet.ts | 14 - src/core/FleetGenerator.ts | 2 +- src/core/GameSession.spec.ts | 4 - src/core/GameSession.ts | 5 - src/core/LootGenerator.spec.ts | 28 - src/core/LootGenerator.ts | 79 - src/core/LootQualityModifiers.ts | 112 - src/core/LootTemplate.spec.ts | 192 - src/core/LootTemplate.ts | 249 - src/core/MoveFireSimulator.spec.ts | 13 +- src/core/MoveFireSimulator.ts | 20 +- src/core/Ship.spec.ts | 297 +- src/core/Ship.ts | 340 +- src/core/ShipGenerator.spec.ts | 15 +- src/core/ShipGenerator.ts | 48 +- src/core/ShipLevel.spec.ts | 27 +- src/core/ShipLevel.ts | 44 +- src/core/ShipModel.spec.ts | 21 - src/core/ShipModel.ts | 91 - src/core/ShipValue.ts | 32 +- src/core/Shop.spec.ts | 31 - src/core/Shop.ts | 98 +- src/core/Slot.spec.ts | 42 - src/core/Slot.ts | 45 - src/core/TestTools.spec.ts | 22 +- src/core/TestTools.ts | 156 +- src/core/actions/ActionList.spec.ts | 45 + src/core/actions/ActionList.ts | 132 + src/core/actions/BaseAction.spec.ts | 95 +- src/core/actions/BaseAction.ts | 45 +- src/core/actions/DeployDroneAction.spec.ts | 24 +- src/core/actions/DeployDroneAction.ts | 48 +- src/core/actions/EndTurnAction.spec.ts | 80 +- src/core/actions/EndTurnAction.ts | 29 +- src/core/actions/MoveAction.spec.ts | 37 +- src/core/actions/MoveAction.ts | 50 +- src/core/actions/ToggleAction.spec.ts | 22 +- src/core/actions/ToggleAction.ts | 56 +- src/core/actions/TriggerAction.spec.ts | 65 +- src/core/actions/TriggerAction.ts | 74 +- src/core/ai/Maneuver.spec.ts | 24 +- src/core/ai/TacticalAIHelpers.spec.ts | 87 +- src/core/ai/TacticalAIHelpers.ts | 16 +- src/core/diffs/EndBattleDiff.spec.ts | 17 - src/core/diffs/EndBattleDiff.ts | 16 - src/core/diffs/ProjectileFiredDiff.ts | 6 +- src/core/diffs/ShipActionToggleDiff.spec.ts | 13 +- src/core/diffs/ShipActionToggleDiff.ts | 7 +- src/core/diffs/ShipActionUsedDiff.spec.ts | 21 +- src/core/diffs/ShipActionUsedDiff.ts | 20 +- src/core/diffs/ShipCooldownDiff.spec.ts | 17 +- src/core/diffs/ShipCooldownDiff.ts | 36 +- src/core/diffs/ShipDamageDiff.spec.ts | 10 +- src/core/diffs/ShipDamageDiff.ts | 20 +- src/core/diffs/ShipMoveDiff.spec.ts | 2 +- src/core/diffs/ShipMoveDiff.ts | 4 +- .../effects/AttributeMultiplyEffect.spec.ts | 4 +- src/core/effects/CooldownEffect.spec.ts | 20 +- src/core/effects/CooldownEffect.ts | 8 +- src/core/effects/DamageEffect.spec.ts | 24 +- src/core/effects/ValueTransferEffect.spec.ts | 4 +- src/core/equipments/DamageProtector.spec.ts | 31 - src/core/equipments/DamageProtector.ts | 14 - src/core/equipments/Engines.spec.ts | 99 - src/core/equipments/Engines.ts | 36 - src/core/equipments/Generators.spec.ts | 83 - src/core/equipments/Generators.ts | 27 - src/core/equipments/Hulls.spec.ts | 107 - src/core/equipments/Hulls.ts | 36 - src/core/equipments/PowerDepleter.spec.ts | 35 - src/core/equipments/PowerDepleter.ts | 15 - src/core/equipments/RawWeapons.spec.ts | 87 - src/core/equipments/RawWeapons.ts | 40 - src/core/equipments/RepairDrone.spec.ts | 31 - src/core/equipments/RepairDrone.ts | 17 - src/core/equipments/ShieldTransfer.spec.ts | 35 - src/core/equipments/ShieldTransfer.ts | 15 - src/core/equipments/Shields.spec.ts | 99 - src/core/equipments/Shields.ts | 34 - src/core/missions/Mission.spec.ts | 13 - src/core/missions/Mission.ts | 16 +- src/core/missions/MissionGenerator.spec.ts | 34 - src/core/missions/MissionGenerator.ts | 43 +- src/core/missions/MissionPartEscort.spec.ts | 2 +- src/core/models/BaseModel.spec.ts | 59 + src/core/models/BaseModel.ts | 182 + src/core/models/ModelAvenger.ts | 120 + src/core/models/ModelBreeze.ts | 66 + src/core/models/ModelCommodore.ts | 63 + src/core/models/ModelCreeper.ts | 74 + src/core/models/ModelFalcon.ts | 62 + src/core/models/ModelFlea.ts | 60 + src/core/models/ModelJumper.ts | 72 + src/core/models/ModelRhino.ts | 62 + src/core/models/ModelTomahawk.ts | 91 + src/core/models/ModelTrapper.ts | 72 + src/core/models/ModelXander.ts | 72 + src/ui/AssetLoading.ts | 1 - src/ui/BaseView.ts | 8 +- src/ui/battle/ActionBar.spec.ts | 4 +- src/ui/battle/ActionBar.ts | 8 +- src/ui/battle/ActionIcon.spec.ts | 33 +- src/ui/battle/ActionIcon.ts | 21 +- src/ui/battle/ActionTooltip.spec.ts | 15 +- src/ui/battle/ActionTooltip.ts | 10 +- src/ui/battle/Arena.ts | 43 + src/ui/battle/ArenaDrone.ts | 3 +- src/ui/battle/ArenaShip.spec.ts | 4 +- src/ui/battle/ArenaShip.ts | 46 +- src/ui/battle/BattleView.spec.ts | 7 +- src/ui/battle/BattleView.ts | 12 +- src/ui/battle/LogProcessor.ts | 66 +- src/ui/battle/OutcomeDialog.ts | 22 +- src/ui/battle/ShipList.spec.ts | 6 +- src/ui/battle/ShipTooltip.spec.ts | 13 +- src/ui/battle/ShipTooltip.ts | 53 +- src/ui/battle/Targetting.spec.ts | 39 +- src/ui/battle/Targetting.ts | 10 +- src/ui/battle/WeaponEffect.spec.ts | 13 +- src/ui/battle/WeaponEffect.ts | 16 +- src/ui/character/CharacterCargo.spec.ts | 29 - src/ui/character/CharacterCargo.ts | 69 - src/ui/character/CharacterEquipment.spec.ts | 159 - src/ui/character/CharacterEquipment.ts | 213 - src/ui/character/CharacterFleetMember.spec.ts | 68 - src/ui/character/CharacterFleetMember.ts | 90 - src/ui/character/CharacterLootSlot.spec.ts | 43 - src/ui/character/CharacterLootSlot.ts | 29 - src/ui/character/CharacterPortrait.ts | 25 + src/ui/character/CharacterSheet.spec.ts | 116 +- src/ui/character/CharacterSheet.ts | 535 +-- src/ui/character/CharacterShopSlot.spec.ts | 56 - src/ui/character/CharacterShopSlot.ts | 46 - src/ui/character/CharacterSlot.spec.ts | 48 - src/ui/character/CharacterSlot.ts | 73 - src/ui/character/CharacterUpgrade.ts | 104 + src/ui/character/FleetCreationView.spec.ts | 17 - src/ui/character/FleetCreationView.ts | 12 +- src/ui/common/Tooltip.ts | 19 + src/ui/common/UIBuilder.spec.ts | 84 +- src/ui/common/UIBuilder.ts | 140 +- src/ui/common/UITools.spec.ts | 80 + src/ui/common/UITools.ts | 90 +- src/ui/map/MissionsDialog.spec.ts | 9 +- src/ui/map/StarSystemDisplay.ts | 2 +- src/ui/map/UniverseMapView.ts | 28 +- 245 files changed, 5376 insertions(+), 7571 deletions(-) create mode 100644 graphics/exported/action/damageprotector.png rename graphics/exported/{equipment => action}/forcefield.png (100%) rename graphics/exported/{equipment => action}/fractalhull.png (100%) rename graphics/exported/{equipment => action}/gatlinggun.png (100%) rename graphics/exported/{equipment => action}/gravitshield.png (100%) rename graphics/exported/{equipment => action}/hardcoatedhull.png (100%) rename graphics/exported/{equipment => action}/invertershield.png (100%) rename graphics/exported/{equipment => action}/ionthruster.png (100%) rename graphics/exported/{equipment => action}/ironhull.png (100%) rename graphics/exported/{equipment => action}/kelvingenerator.png (100%) rename graphics/exported/{equipment => action}/nuclearreactor.png (100%) rename graphics/exported/{equipment => action}/powerdepleter.png (100%) create mode 100644 graphics/exported/action/precisionboost.png rename graphics/exported/{equipment => action}/prokhorovlaser.png (100%) rename graphics/exported/{equipment => action}/repairdrone.png (100%) rename graphics/exported/{equipment => action}/rocketengine.png (100%) rename graphics/exported/{equipment => action}/shieldtransfer.png (100%) rename graphics/exported/{equipment => action}/submunitionmissile.png (100%) rename graphics/exported/{equipment => action}/voidhawkengine.png (100%) rename graphics/exported/{character/slot-hull.png => attribute/hull_capacity.png} (100%) rename graphics/exported/{character/attribute-maneuvrability.png => attribute/maneuvrability.png} (100%) rename graphics/exported/{character/slot-power.png => attribute/power_capacity.png} (100%) rename graphics/exported/{character/slot-weapon.png => attribute/precision.png} (100%) rename graphics/exported/{character/slot-shield.png => attribute/shield_capacity.png} (100%) delete mode 100644 graphics/exported/character/attribute-precision.png delete mode 100644 graphics/exported/character/attribute.png delete mode 100644 graphics/exported/character/cargo-slot.png create mode 100644 graphics/exported/character/close-button-hover.png create mode 100644 graphics/exported/character/close-button.png delete mode 100644 graphics/exported/character/close.png create mode 100644 graphics/exported/character/entry.png delete mode 100644 graphics/exported/character/equipment-slot.png delete mode 100644 graphics/exported/character/experience.png create mode 100644 graphics/exported/character/initial.png create mode 100644 graphics/exported/character/level-display.png create mode 100644 graphics/exported/character/level-experience.png create mode 100644 graphics/exported/character/level-separator.png create mode 100644 graphics/exported/character/level-upgrades.png create mode 100644 graphics/exported/character/name-button-hover.png create mode 100644 graphics/exported/character/name-button.png create mode 100644 graphics/exported/character/name-display.png create mode 100644 graphics/exported/character/portrait-hover.png create mode 100644 graphics/exported/character/portrait-on.png create mode 100644 graphics/exported/character/portrait.png delete mode 100644 graphics/exported/character/price-tag.png delete mode 100644 graphics/exported/character/random-off.png delete mode 100644 graphics/exported/character/random-on.png delete mode 100644 graphics/exported/character/rename-off.png delete mode 100644 graphics/exported/character/rename-on.png create mode 100644 graphics/exported/character/ship-column.png create mode 100644 graphics/exported/character/ship-description.png create mode 100644 graphics/exported/character/ship-model.png delete mode 100644 graphics/exported/character/ship-selected.png delete mode 100644 graphics/exported/character/ship.png delete mode 100644 graphics/exported/character/skill-upgrade.png delete mode 100644 graphics/exported/character/slot-engine.png delete mode 100644 graphics/exported/character/upgrade-available.png create mode 100644 graphics/exported/character/upgrade-hover.png create mode 100644 graphics/exported/character/upgrade-locked.png create mode 100644 graphics/exported/character/upgrade-on.png create mode 100644 graphics/exported/character/upgrade-point.png create mode 100644 graphics/exported/character/upgrade.png delete mode 100644 graphics/exported/character/validate.png delete mode 100644 graphics/exported/character/value-hull.png delete mode 100644 graphics/exported/character/value-power.png delete mode 100644 graphics/exported/equipment/damageprotector.png create mode 100644 graphics/exported/map/options-hover.png create mode 100644 graphics/exported/map/options.png create mode 100644 graphics/exported/map/zoom-in-hover.png create mode 100644 graphics/exported/map/zoom-in.png create mode 100644 graphics/exported/map/zoom-out-hover.png create mode 100644 graphics/exported/map/zoom-out.png create mode 100644 graphics/ui/pics/action.png rename graphics/{exported/character/value-shield.png => ui/pics/attribute.png} (100%) create mode 100644 graphics/ui/pics/portrait.png create mode 100644 graphics/ui/pics/sprite.png delete mode 100644 out/assets/images/map/buttons.png delete mode 100644 out/loot.html delete mode 100644 src/core/Equipment.spec.ts delete mode 100644 src/core/Equipment.ts delete mode 100644 src/core/LootGenerator.spec.ts delete mode 100644 src/core/LootGenerator.ts delete mode 100644 src/core/LootQualityModifiers.ts delete mode 100644 src/core/LootTemplate.spec.ts delete mode 100644 src/core/LootTemplate.ts delete mode 100644 src/core/ShipModel.spec.ts delete mode 100644 src/core/ShipModel.ts delete mode 100644 src/core/Slot.spec.ts delete mode 100644 src/core/Slot.ts create mode 100644 src/core/actions/ActionList.spec.ts create mode 100644 src/core/actions/ActionList.ts delete mode 100644 src/core/equipments/DamageProtector.spec.ts delete mode 100644 src/core/equipments/DamageProtector.ts delete mode 100644 src/core/equipments/Engines.spec.ts delete mode 100644 src/core/equipments/Engines.ts delete mode 100644 src/core/equipments/Generators.spec.ts delete mode 100644 src/core/equipments/Generators.ts delete mode 100644 src/core/equipments/Hulls.spec.ts delete mode 100644 src/core/equipments/Hulls.ts delete mode 100644 src/core/equipments/PowerDepleter.spec.ts delete mode 100644 src/core/equipments/PowerDepleter.ts delete mode 100644 src/core/equipments/RawWeapons.spec.ts delete mode 100644 src/core/equipments/RawWeapons.ts delete mode 100644 src/core/equipments/RepairDrone.spec.ts delete mode 100644 src/core/equipments/RepairDrone.ts delete mode 100644 src/core/equipments/ShieldTransfer.spec.ts delete mode 100644 src/core/equipments/ShieldTransfer.ts delete mode 100644 src/core/equipments/Shields.spec.ts delete mode 100644 src/core/equipments/Shields.ts create mode 100644 src/core/models/BaseModel.spec.ts create mode 100644 src/core/models/BaseModel.ts create mode 100644 src/core/models/ModelAvenger.ts create mode 100644 src/core/models/ModelBreeze.ts create mode 100644 src/core/models/ModelCommodore.ts create mode 100644 src/core/models/ModelCreeper.ts create mode 100644 src/core/models/ModelFalcon.ts create mode 100644 src/core/models/ModelFlea.ts create mode 100644 src/core/models/ModelJumper.ts create mode 100644 src/core/models/ModelRhino.ts create mode 100644 src/core/models/ModelTomahawk.ts create mode 100644 src/core/models/ModelTrapper.ts create mode 100644 src/core/models/ModelXander.ts delete mode 100644 src/ui/character/CharacterCargo.spec.ts delete mode 100644 src/ui/character/CharacterCargo.ts delete mode 100644 src/ui/character/CharacterEquipment.spec.ts delete mode 100644 src/ui/character/CharacterEquipment.ts delete mode 100644 src/ui/character/CharacterFleetMember.spec.ts delete mode 100644 src/ui/character/CharacterFleetMember.ts delete mode 100644 src/ui/character/CharacterLootSlot.spec.ts delete mode 100644 src/ui/character/CharacterLootSlot.ts create mode 100644 src/ui/character/CharacterPortrait.ts delete mode 100644 src/ui/character/CharacterShopSlot.spec.ts delete mode 100644 src/ui/character/CharacterShopSlot.ts delete mode 100644 src/ui/character/CharacterSlot.spec.ts delete mode 100644 src/ui/character/CharacterSlot.ts create mode 100644 src/ui/character/CharacterUpgrade.ts diff --git a/README.md b/README.md index 7040c35..9ed911a 100644 --- a/README.md +++ b/README.md @@ -84,17 +84,16 @@ AI-piloted ships quickly colonized whole galaxies. A ship gains experience during battles. When reaching a certain amount of experience points, a ship will automatically level up (which is, gain 1 level). Each level up will grant -upgrade points that may be spent on Attributes. +upgrade points that may be spent to unlock options. -A ship starts at level 1. There is no upper limit to level value (except 99, for display sake, -but it may not be reached in a classic campaign). +A ship starts at level 1, and may reach up to level 10. ### In-combat values (HSP) In combat, a ship's vitals are represented by the HSP system (Hull-Shield-Power): * **Hull** - Amount of damage that a ship can sustain before having to engage emergency stasis -* **Shield** - Amount of damage that the shield equipments may absorb to protect the Hull +* **Shield** - Amount of damage that the shields may absorb to protect the Hull * **Power** - Available action points (some actions require more power than others) These values will be changed by various effects (usage of equipments, sustained damage...). @@ -115,54 +114,12 @@ Attributes represent a ship's ability to use its HSP system and weapons: * **Maneuverability** - Ability to move first and fast * **Precision** - Ability to target far and good -These attributes are the sum of all currently applied effects (being permanent by an equipped item, -or a temporary effect caused by a weapon or a drone). +These attributes are the sum of all currently applied effects (permanent effects from the ship design, +or temporary effects caused by a weapon or a drone). -For example, a ship that equips a power generator with "power generation +3", but has a sticky effect -of "power generation -1" from a previous weapon hit, will have an effective power generation of 2. +## Battle actions -### Skills - -Skills represent a ship's ability to use equipments: - -* **Materials** - Usage of physical materials such as bullets, shells... -* **Photons** - Forces of light, and electromagnetic radiation -* **Antimatter** - Manipulation of matter and antimatter particles -* **Quantum** - Application of quantum uncertainty principle -* **Gravity** - Interaction with gravitational forces -* **Time** - Control of relativity's time properties - -Each equipment has minimal skill requirements to be used. For example, a weapon may require "materials >= 2" -and "photons >= 3" to be equipped. A ship that does not meet these requirements will not be able to use -the equipment. - -Skills are defined by the player, using points given while leveling up. -As for attributes, skill values may also be altered by equipments. - -If an equipped item has a requirement of "time skill >= 2", that the ship has "time skill" of exactly 2, and -that a temporary effect of "time skill -1" is active, the requirement is no longer fulfilled and the equipped -item is then temporarily disabled (no more effects and cannot be used), until the "time skill -1" effect is lifted. - -## Equipments - -### Overheat/Cooldown - -Equipments may overheat, and need to cooldown for some time, during which it cannot be used. - -If an equipment has "overheat 2 / cooldown 3", using it twice in the same turn will cause it to -overheat. It then needs three "end of turns" to cool down and be available again. Using this equipment -only once per turn is safe, and will never overheat it. - -If an equipment has multiple actions associated, any of these actions will increase the shared heat. - -*Not done yet :* Some equipments may have a "cumulative overheat", meaning that the heat is stored between turns, -cooling down 1 point at the end of turn. - -*Not done yet :* Some equipments may have a "stacked overheat", which -is similar to "cumulative overheat", except it does not cool down at -the end of turn (it will only start cooling down after being overheated). - -## Drones +### Drones Drones are static objects, deployed by ships, that apply effects in a circular zone around themselves. @@ -173,12 +130,13 @@ Drones are fully autonomous, and once deployed, are not controlled by their owne They are small and cannot be the direct target of weapons. -*Not done yet :* They are not affected by area effects, -except for area damage and area effects specifically designed for drones. +### Overheat/Cooldown -## Dockyards +Equipments may overheat, and need to cooldown for some time, during which it cannot be used. -Dockyards are locations where ships can dock to buy or sell equipments, meet other ships and find jobs. +If an action has "overheat 2 / cooldown 3", using it twice in the same turn will cause it to +overheat. It then needs three "end of turns" to cool down and be available again. Using this action +only once per turn is safe, and will never overheat it. ## Keyboard shortcuts diff --git a/TODO.md b/TODO.md index d24ff87..b4b873c 100644 --- a/TODO.md +++ b/TODO.md @@ -8,6 +8,8 @@ Menu/settings/saves * Allow to delete cloud saves * Fix cloud save games with "Level 0 - 0 ships" * Store the game version in saves (for future work on compatibility) +* Add simple options to quick battle (fleet level / difficulty) +* Add optional fleet customization (both player and enemy) to quick battle Map/story --------- @@ -17,39 +19,27 @@ Map/story * Allow to cancel secondary missions * Forbid to end up with more than 5 ships in the fleet because of escorts * Fix problems when several dialogs are active at the same time -* Handle case where cargo is full to give a reward (give money?) +* Add a zoom level, to see the location only Character sheet --------------- -* Add a randomization button in creation view +* Fix the hover/on not working on fleet members +* Improve tooltip content * Replace the close icon by a validation icon in creation view -* Allow to cancel spent skill points (and confirm when closing the sheet) -* Highlight matched/unmatched skills when dragging an equipment to a slot -* Highlight attribute changes when dragging an equipment to a slot -* Propose to auto upgrade skills if enough points are available, when equipping an equipment with unmatched skills -* Improve eye-catching for shop and loot section -* Highlight allowed destinations during drag-and-drop -* Effective skill is sometimes not updated when upgrading base skill -* Add merged cargo display for the whole fleet * Allow to change/buy ship model +* Allow to rename a personality (in creation view only) * Add personality indicators (editable in creation view) -* Add filters and sort options for cargo and shop -* Display level and slot type on equipment -* Fixed tooltips not being visible in loot mode (at the end of battle) Battle ------ * Add a voluntary retreat option -* Add scroll buttons when there are too many actions * Toggle bar/text display in power section of action bar -* Display effects description instead of attribute changes * Show a cooldown indicator on move action icon, if the simulation would cause the engine to overheat * Add engine trail effect, and sound * Allow to skip animations, and allow no animation mode * Find incentives to move from starting position (permanent drones or anomalies?) -* Add a "loot all" button (on the character sheet or outcome dialog?) * Mark targetting in error when target is refused by the action (there is already an arrow for this) * Allow to undo last moves * Add a battle log display @@ -61,10 +51,9 @@ Battle * Add a turn count marker in the ship list * BattleChecks should be done proactively when all diffs have been simulated by an action, in addition to reactively after applying -Ships models and equipments ---------------------------- +Ships models and actions +------------------------ -* Add permanent effects and actions to ship models * Add critical hit/miss (or indicate lucky/unlucky throws) * Add damage over time effect (tricky to make intuitive) * Add actions with cost dependent of distance (like current move actions) @@ -73,11 +62,14 @@ Ships models and equipments * Add mines equivalent (drones that apply only at the end) * RepelEffect should apply on ships in a good order (distance decreasing) * Add hull points to drones and make them take area damage -* Quality modifiers should be based on an "quality difference" to reach +* Add a target type filter (all, enemies, allies, self or not) +* Shields should be able to absorb (some type of) damage, even with 1 remaining +* Add a balance testing page, using AI battles with or without an upgrade, to help in balancing Artificial Intelligence ----------------------- +* Fix tendency to use moves for nothing * Produce interesting "angle" areas * Evaluate active effects * Account for luck @@ -92,7 +84,8 @@ Artificial Intelligence Common UI --------- -* UIBuilder.button should be able to handle hover and pushed images +* Fix calling setHoverClick several times on the same button not working as expected +* Fix tooltip remaining when the hovered object is hidden by animations * If ProgressiveMessage animation performance is bad, show the text directly * Add caret/focus to text input * Mobile: think UI layout so that fingers do not block the view (right and left handed) @@ -105,7 +98,6 @@ Technical * Pack all images in atlases, and split them by stage * Pack sounds * Add toggles for shaders, automatically disable them if too slow, and initially disable them on mobile -* Replace jasmine with mocha+chai Network ------- diff --git a/graphics/exported/action/damageprotector.png b/graphics/exported/action/damageprotector.png new file mode 100644 index 0000000000000000000000000000000000000000..d65f79bafcf6490c924b371bb488fca3dd1f7ff7 GIT binary patch literal 56864 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ν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 literal 1831 zcmeHIiBr-E6sFCx-0@i3N<*MgCuci6+FC3$H`9VK#Z=4`Gb?qK6ci0Fa>r7)!E{^; zQe5dkQ%ubpQE{7f#qz)r0|E*22E_Xyf1>+q_TT86_ue<}&6{~MZ{~aNp|8&+W1~Yx z5D3H=gZA(PS@qTT>;~goq}ez~24r_kz#b6kdv5;$=6gx#Yh(z-r0c8icyi1H3KlIB zJ%bYciIItv@Pr5mg+j59jw6t7g_9!ei3w56IhR8a$Zj^q<9tAJiB|4L9`A+;J}dpU zt%M!Lr)q}Eumx9(?LBz`aZ52Sa3#jp&+JWL+A|-62;tTC>7tK2JTQlisF4Q`2kZie zeT5l23t@VWqv|kOfnRwfNY*~Jo(gV1@LAVE%j~c%Zm#cKlaLRV;@E3 z)+fCTTyvnhp~**k;xlqrXMI~d8V*Fd-91(tOLaguAD9ThzsDI7vD+W?B+;Rhjb)~T1KBN@n zN$6hbUXNRrxf=fUo3JRHu16dxq~cur<${#X{xFA5k>SQvP|Ii{9BUj=4_5O!J=*atl>GTf0;5lJ7Ja zu^Ha0Xo6m(ve$8|3zAN~9^tmBQ@x5lJK~e0isVEiy+t(~S$lPH*E>T=UO|)C1a}$? z)w1VW8NW#(B6e;qEpKlDtc(vE{p>Op(lG7aX%%;vs{1U!y6GoHuQE#GFLML8YgU

0mekl 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 Bnq&X~ diff --git a/graphics/exported/character/close-button-hover.png b/graphics/exported/character/close-button-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..992859096a1d8614ec85e6c05e817350ce2c8e97 GIT binary patch literal 11910 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 M07*qoM6N<$f(*AWJOBUy literal 0 HcmV?d00001 diff --git a/graphics/exported/character/close-button.png b/graphics/exported/character/close-button.png new file mode 100644 index 0000000000000000000000000000000000000000..63793f4f2d20cf3df9ef0190155240fb5bbad978 GIT binary patch literal 10910 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 AD*ylh literal 0 HcmV?d00001 diff --git a/graphics/exported/character/close.png b/graphics/exported/character/close.png deleted file mode 100644 index 09ce13c3bebe2a415dbb8c2cae39a619857b5f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4243 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 diff --git a/graphics/exported/character/entry.png b/graphics/exported/character/entry.png new file mode 100644 index 0000000000000000000000000000000000000000..3679966127abb52cd604d4dab58e5ff53d27599c GIT binary patch literal 13398 zcmZX42{@GP`?lWpB<~w3vLs`tWM?dGmO&$A&z3> zk)@f2P!ZX8WB1+9cz?g||Np*@!_hI%bMMb}o!5C@*ByHssl{@F>jV=M6AME7rXds4 zK{ylBfjh^JfF}n}UyKF+9rC@7xN{8r3q6MV2mC(nrETuZ#B}Nd^miax{M32ykke1Y z%+JWv(J#Qx$AKvzAmEa-hpVr>otMKUPamg@ITbD@rVC7no7e6H;%0|-p58SNAE9^G z)_4pR3Mt*~O02KsVi90*3Sc`CdqMk7c;#p^s^!72L%o`aKU*H)FKGXHsC=jC!-US#mjtcLp}g1UllkmPniVU361RQZc<9zCzB+R4 zm(`VUmVYK=l=GT~##rft6QNBuInUQG?``eP(go?=HfzdY2TY2Rt#3#6BKBUW?+!n) z?hBl}^m^;TJyXlu(91u?(2K1d*7it3&&baFE>#ubd06WZ^ybIf?vVP{XpPNU_V1gP zoc@2e8~{%vgK;A2O6G*olcZD7&stk#;JM|cbRGo8sEun14fX7_77fWpP27}&V>?H7 zJola-#a`NsVGQ~%d~<$xV{gM4aalE9i6$pcQgW7&5Q2Ig`=zXWEn6USfhz;XIjT%f z+iQpKzZetxE$sCZrFCgan<9PzYMXz9yOvEDE=+9AjhQH##s*ve1ugFC+ugLOx;;?d+YE_V%M%V;jMYcOuH0n@51TvB-ICv19s{ez z^=an(C7y6kBVOB^T{IysThWAD<8iijyokxSbB(IoX2puUL_V#UviKZr18x@jd&6}`1t(z*Xb7n3cE|zZR$>)hBeJmt%J#ch>TVZdRg>z>L zKMi^@U1*M1-#Z(zZ*x;J-({Yn}%nY@Xd+6rM=BUq&(~DaW(~!bKY2aRVuX3=2%60-$a>YF$S*S^ZhBgnN0+6<5DZ$E5hm*k?2M!C0fE;k*WXS5bT z+I1brDOgXF~H%!RGbBGBF{K=4%7F#_IA*} z<>NiWrWL|Ta#pu{jgr5_7;s}|px(zEJC<5Jck@i6mY9>yJ6+ma`l3I!Qj!=?A!kxe zt?SPb7=EUWZCszcv3iO(#{J$(%cG>}b7?P8!h9r(z3I-K(C_KQ@T-TQ5>C08_U!bS;kSFmq-5(^X9JI)EPeH1&Q zS{6@lT6Ycm^`6>5fqF#3RKr({k~QY4s%gqHNIz7ZmFLXtx39#|UsGWS8+}XHcGaZJ zC@uBA4Qk_56$i8s*yQ&oFM`V4s|H3D)Q5I{Z(85L;yNE;wvYoBeT@^XTTjC^hZrz- zVe6?H-Fnb1le4MzQhdx~Wh$m8Abm1zLL#Jg_?^A6LxD&Fkq(VnURPYwKff7Z=gONo zn}NsXR`?;jOI zp3TgJ`AkxNiPP5vGhM66z$37J3+qnGTkWR%n>BMk`gEtP{PpC(Z%N+;W*c}7acgm% zE2Ghr(|6TsVr9_T_0~{ZxW=`iwiiY`>uw z_Yzg7jgHk*jfqujzw~Cj{RyS@o#r`-M$+cI|=}O{r~O zFIh7$W4N`6kwX5jl^?TjvPZ;fTIaci;Oe#EMEY8CQ4Mb8d{-nYFJM8ttWKffAY@VH z!PiU6t29XoNwtef)6|gBrwR#8pW6N7Iz91{dqMD_oo>M%JhYBxl0SVXDRWWEK!B>W zyZCz@-m1Za&`F=Pdpdw-+F>fw?6u3p#}A~ zSuW@2Z^?C;4&GFn|i~#%#nw$2-^15ziVF~wza8$8JPZ{&!$ObRqi#zr7qL6%EEO?^~EHQO12vVO=DNqnij0# zS!`2r%K8y=x}*dgEpbH)F_3ZvgR5kVcvn1PWX=&oEQRp#yLlnuw){fThC-_d!g4e~ zA!|2uW#wpG0p&%7*FApv9CQH1j}pb*5OqTKk3{3Ipm!#_BSdMm!P*M($wogv*jNr# zkOqylaF0I*R$>yeJ)T$3XEhSCxoo2Y(3s?=t@Tk&EqKch1zF9)Jz^x1+@`D@F?mNT z7)cOtQosujyuIc2dGL8vGCdfYu%l~0Cu;ZsebbvT`tA9&Ki&z%2Gre#OZKcsSJ*ek z4u<1=x%}u==(+6=449W_x)v}}#Geimbk;Rs*Tr58tF?v(ucVV+TRt!QHu&7Hl%_nI zJfm$0JcUBWGN5Oj;Bl2mHXy|-tw)z-4i4|Eca#OK$;pS6No&sQ*xfp@DJu#sXMuYs z66vO8`gLZ!%9YygL>yNlC7?3T%ZnaEpil93DCItZ;35#~i`*%V@cp|*MNqoCn2O2r zjlYGBi>3U+{nX5Ui^&&z5_>SeP$%k|X~`NbmJvbBtfRtBjek);yWw)Qu?8!h!90_P zg&`|1#os-Ft7+MXH~r(BLcztq{CYf-ExSX8eD%@cK0Cqlv*M>YF>}Z0oCKjc+(Z1XuMdLiX z#XWDQT0r<@j5@gQQ7QUatHvC))PY5b+X!q(xbGj6hpAs-qFm3WOKDzMy?sj+e+l3! z)3f?t9J#a;*3@tvn?BoO>4Zd#Mw7_Q`e<~3XSh(#U@x1-Rkl$v#`G1|%_?N?*mz9% z+Zy7=f<{@`B8Wd8eypWmTtber_o_p!nti~|mFL)J* zbg@->c-Iad&SW1KHYe3n@mvTV0#`s^wy6!a>818j(gO&6^J)}xEJQGDU$3s+7@y`& zp@i0L^{f(~6L)XYdvT9UY468p*8}c?CQRkr!3S2i+tPE1D|fV%-;okvBpM6na;Cle zu#o)k*$$IrdIKYX6p#nk7hots?c^*bHaxBn-Qg&?`=&VRX4$~G*Gfs_tLSBy5w3{ z1@*7nm7wq9ckbzL<%nzIFFo?=FHhk1UGfP@DeoG!$(d%ydpeEn%d|Ed433@DHvFc| zu7D+7JYP_#ljbz-0v*K@@$-Jh#>v!yQKf%4e+deE|3o=`uAbL!e_h^}spby{O`6*$ zk9Ja(C_Z(HY^>GDy15TwFX{6mm#yp9Tj#Zda|(6l$u8dgwv6qS-&5P05gx8-AQP7g z)157m<5Bu*b&GAnRtoO`+uyh8A+6zkB*?V}KK)kU4d*WbVSmD_Y03CCeu0dX7}%6LKgUCo{{^YA1agIbtPons)gyQdlsHG30${n{SYT9YEx$=(|W z_ie~w1dA`WL-FrKL65^^imQ%)bXp+U{EO}WXq4e2bL}bpH`bDVtJJ6 z`RyBhi&?&XAnZO6vlM-NZ=S)5J1@JI5W=Y;JBl>G-Gg~Zd4TTzv>PI`9Sj#5!x>SQ z_gW#x?5rscxG+&n9l)pY^2Vhaj6@>9Zk}H%9>P9S_?liKqh_gnZy2IO<(+?ndB-`& zzjsjw`8H>MB+uLhq(WA6{#4XLQ@i}{9t;a;W@Zw_HRX@1%%GN9iHEH%)VB%&&cPoo z2;Twjl7nENfg8^ETFm*FAWc-mls|0b$YCt34}*V;5%GXo-?;8>EXud?_i2U>To(S< zRJ{}U5suFS))&-hN`s$%2-qo_7*1vDDnz;VI;PmENQspM=2^&3;~dJ_ z%7IxWF*t)KhIO;B-O!txm%&_V6~+ajQVSNYaRyjk%Fu?ZZ|5kU68~hL${dZ`%{yNiC=ZOA@7FD$is4-L{0`=6lVqNLKJRa>KU77({_G z&jc*b#Ct##l)2co4Y~bMnb{&Hy?VxDv=5ew6VFyz`_-0pB>ACbDO!QGP2WDg67}DY#M*DH+Bfzkx%eB_*~G)LatV?LPm+q@Q7bieOcv% zO_7W&G_p}I>wRhTS6uV&wc)k#mh|h`J9J2)zV%1A9L}8iyblQM{N3|y$`xNM$^>o! zvmL2~=)q`BSQZPah(IZa2I}uNdA;QJy^3-!2j(6>QnGp?&hBVzBL$cHzLI*n}_P1Yi1S2^>48`=CXmwjILBPGWj#x$0NI zf-QBgw)IBaT`g?7`yLRjehwui zk_`M=^`VIItqa4uKvF{_BHwZcWQ^Fgc+B%e9w*BhmGQqKEB)FjwQ!xt{qq7e=ItnJ zQ?gQ76%c;xAF;5}>;f3vNQqYKXE&RI51WkTzs5E#!$?7;TJm>KYX$wS6u7*)7PESD z1s}+jFUC@!cVuT_{E$g{`x$v>9qQLddLR}+ zgg0>3R=h}pe*QL;r?U+v6koP9wsw6wam?|Vf?i8MHnTE*#tIS5F7GMKe9n;3Ncjjr z(YB?iee+#8X{3v;uBoZVdLY^?+JnwXc|sB=6>iS5>>uZ6@8smHIl#f14zK$qhh|OBYRV_MN+DgMkb5euRCNFVDLuA{siMS ztsMRiIxq!tu1u$v z2>|_OpnJ9Z$`@C+`g#TRBtNYa+?Ti(TA;1mE-Sao&N+QHXE0`Ec1C_UK3%!iOM+Ers?vB!D5 zmq6>tv*pGGD$5zs&H#9;A9?C~gLSS{9zE-in)#uS!WwKncrw^3Q+3bxarXU{HW6t| z=Wlm5jmKR*gKg>x+ic>}nyqoeykXx`fzaU$V_{1ZrpI06v}f09Ta#a0uwU%4Zat^5 zD8&G-(X9Ri`dWVqonINlEn8&B8i8Q!yxDTI4Jo+qSF#Q7IHWzDKGVA|LL)vb za7xYpuUFm6!!mfvvp0f=m3(^5XF)a-nc zjR&4g>BIU}V~B&2eb)`K)s%jC;8<1n%lb0MN@Gt3a9Q8~yvlQN`NM4Kz61IFk%uN! z5{W~}e!3uK^2t~}9m+s3ex+PK{= z)%5|Px{65u!O(hM!S74UdB`+B9j^0Lhy1RC0cYlhxAl5?ME%~1?6a7@UREw4Wih)e zbwnTs%X1TvWBqj%@tkQ1Nn4IZUnut7s*gyg_PI)5;$axP#DFl01TtTFHl2s(jG*9T zdfejHl12*2Bv0D!3|O6+b9LbzRJh!7>p8(mFSkx-GL;j)n#5C^FJRBwv>5t5V9)dO zwDatYxZF_)R=&Tz*1d0_rxXi+>7(bu8~i7hl8fkqVXE#W8$gvGtU@rjQUTXW{jlrP zcwA6lzd0EDU(vU1R&$RF!789C|2>Vu@f1xMW9B*#d799Jf+Gc=t{nv7-+?0 zn8k_`Z+c|g_F~cLik_dF<9}$%iH3H{egfcjjdE!@LdKOSmC!>NLYjx9hnNrJDohq~xUB`nHH)7!L9%$ne<(XgZa_3wUc`9_n|jkIZHPz@bgzW|=i(skwTyyM+6fv!47EiDb*E+GEaqm9PW z+~ks86@y02h85L@7$Bqt!?!w>{mT7cvbp*i(6{h6s`UJ{rn#qwZ&X|vc zg!yi(%sT=Zk{$!T`{SI1Vk7pCI_U+b*8q^3Q%nceJnbN0E+$A!16!4E+qYFmb@2T! z{l5e|fF1+#kX%w_kms2>L|HtFO^;Hr@r-y&N2p$jPJQC)21z_Ycf^BRC;oWE2Yr*G zORRxeyy|V|M~698N4me=#m#7AF*GlqrZduaW%*WMPJ;F>aVMbx50FK>-vb6PAwP9O zw4c#1+44F5ZO@%=+S_a8CP6;}4ntbT%pnLvG6`pC`l;!&e$rD<_H5=?ypj%@EKdj! zJY)FPxEdG4kN_W+!q?BpBOG*x=q|_ekN7724|9EZ@*0HKCdTr|?klN+K<+U!GsE3~ z#wfoQ0TQ4}GPoMHUi^g%0+5@T7=L>8E-*F!OK2yRGouKlwYU(I1SBBF=Dx9Up~R9! z3p7@Wx%pUO`+HY+b`720JH6Xb+YApkEIUiPKh;eUkxR4adpQyCM+!^u@GXWYGiLKC zl);tR!$_jeowtPLoyo}ktlMOQU#LjWSU$t0ke4KAoXIcGG320`k#OUFO6D*%(qn@=)R<9$MUl*XN7fD0gF5DBIO6O#r64^`+sw{WE;d zjT27eQveM>W00a%U5#2!yu#pVfdz>Z<1qJ*R689zJvjvsQ^zm;R|A4Po~yim1agy3fE*S(*4(5IWNT`m)Ku13W*MvU%s%~QB7B*&Ma!+sQ2*8*gg;08|z zWYryA1)sJ(ug62yI!>_GN(V`V_7YvgZ}-Jw&ZYp9VQYi#0(ii}L(GaUcDuww=}WUC zL0Ke==_>hzq!uSXnZlYETFbQfTfIOFderDKBM|AO1*U3C1E50IkiiW)Fm;Hro&z~# zS09kZAX@y9{&#ILsMj53EHFHPD8abssg*$@v7>2J&h^$)!cKxjjpW1j@84YUfLIy(KJ4$>JHW@;4?gVK(v*UuSs z&4Mg)tvbWJGdoO6ho7&k%32xC1&yV!Zn{);Q_e$Qq1-m~Mc!*+&G#z*Dn}#PJz+Ql zlKoK~(ntookXWAoAP-^k`0gDoi$s)GtGl)#WbN&t7o6PP8Ci@ctx84GtoPxn;k*Ip zIgt1`j6fFy-Ni_I5ZAoO1;^H(Kybrhg>kTEX@ZG5=V}3zyFUl7Krr8~6hJ(`lvTSi z8Z#7zm;m*IGeP53`YEelPTprgxC9|_BT38ma@V`p%&s+a6t>3w`C%e$L>6o6+R~j zr_@I0Q!yN4;5LT&gmSC4cTNGLDng-{;ya16+>(W|zDRXc(unQMLe7qFIpU z?q2mV&xW5#dgdq}GKB-WUm@j*s}y_E2{DL<*_rpCdcd4M^VLAB zdOyvfit`oo*=q^}Ep3N^C4Tv=i^Vzy_kR|*ZUB3@230+}zdd_%**h8H7lBzoS&uqe zkALrtuCiRc=~u@=pf3?a=rcuUN7k$HHMpv&0KSk}`#6LD0-0}i{a!7|Sy_bq?`)i0 z3|fq%^!#Aze`v&;Pg~exn2{wT%!PW1Ek%wW$~k`rm@X*jajZb5tAP8?rH~Ft?+7oY zKxA9m3R-v88I4P>J6t{=y?tgl2PIGdWSRlzg@tGt^7B-ESpKUw06O0;#8kgv1h^ zvMK|1QG`~dgg|9ExXf`_AB~G;mFY?hf}cDKnl(!wpL{PLTFQ$SuSRCbMa!}=TLQdL z-@HHl4zdsJO--oo*FCRnm$mxE@f zXz<$ooR5G{rCgw4;+1=iBChZ*#WA2)qEW>*0fnu0=oHcL>bV|pFA21%-6Dn52o62} zBj$+@!%}oF;FaE0^d=q+P#>-{(!DD4<}=HQ*0?v5_z~A?3ap8i-M*|>I$REBjWl|G z*pG{skN2&C)poY!V+eIWrH$x9`2+_Hsdno3S4OyzBAXjWM-ckB)%D@^3m`0DVQ`aN zdzgknF+MH0tIL~Q&?zH$Yp)Kvc4M2;F7ezqoSuwzEEIVhGyma<4e;b^z^Vv zr|=*XuEafEyUR4DYPR%IXa zMB3s59(7Znc#2|q5Yix5tYf)L{R{#`PcCS}#O!RA^1~H3qgea;?Rz0faARa>;j*BI z>=}jAO{&F4=9?_G5X*Ed5IJG)N~E+xMmvx=)0t6;SWCbgg2HpszOOyWI~kauO8N5E zEo0b3@<7*vK+1vsU+)?w(~a95oR3@cGqDCQvEbi@TR-o75VqbSJCN>WJ)v8+!Du8+?? z^s4}^n2?sAmZukLY1-K0KF3@9UD2;~(BUgRl!J%>{O5luXY-fSdIY%$UY925vqOPoZY7s zdqwv-GdM~+zMRv(Uk^~=Z$1FtbOQ+j=lx-%RBh7wW%3Pj14I`jA`_J`K(K8d zZhDg92n2kuARI#7YP>#F5n3j|zpEm$d|OyXsM^DS)u7P7M* zL{qMLMj{(#&6uSnU>Ll(@V&sGKe<4}N3hFe=Ky3Caw3nv74bjcFOaZ~#6B;x*0ShD zP4s@0QHalWzw&dL2~TtFtt{?TZpEtFVHu1$|3_ zz1F&c72@bEV<2F4;zr`=_#w?;r}gcI&=hG9^#o*!2c0)+UR*k%42f^s@ZE4SOwMvwGXKf@rew%(r6e7i zeWwB&6Yv=jZ2)){lOhk+$;J{RAP0&l5B=VPR!q5qV@j*#)@_pWAn_dwRlt(LwX}$S zH^_dAGefoWtCHP}MIJxj)B?B~dH7zDA;pA|WyU777JcX##9g&mO5$<)+0vxK$U4}X zKU8^f>cx|I7)jZk!rpt=Vruj;U)Y<~?;tz`z`}C&RUc1<2;n6PlIHnFSz8Li_j$Ws zHH3Li?C855zmJq$1?6W>XIW2SyhjW}yr%NmwcL#H73n%%gX6W_M71S6g30w&$6c`w zx#Pe;A+(<=opQ`HhHhKMUvZHKc5L+%6n%8V09iuiBwQ4>zbNQzx$$zM>K4YqC3iMG z3UYNJqa&SEL~pg8tn$3qUnFvNJ%qsE62)c#p4#Wv1*eHV(d&A%pPX!d2qghi&?;|1 z);AL<5PMyyY9c!&eT`A-lc;-%bjtyey>88+<}~o@NA$n?B7bBXr*$ZqGO}gOc*u_5 zLw5YN?pGNVV*-+DIY>4Gc5&xi>yVRscHVUmtk8~c91ew~-Qq%K;07?EGYIr0D-~ZO z>7xuqU*rbXp886K6>wKv*(iPvBDqtKowGhxp878PufCgzFzU4=TddYUC9Yj*m0}cC zWMrV59O3SH-I)=$5S4-gJKx8*GDb?2-qgNX8T#59r`JZ>ajg6`qE;s%9ZP_mzEj(L zvnG?5mCavV%Ermf0jdMFoh#_MF9wRy(N<*TWQS5sfwX-Fx14Ou@3a%X%-aSEf4(bO z=4mJ=L4ZD!Zdjr~!85$FQm%o6v2%BI6!S7v5rl*JzwOyWr(YZCjYB`F%4i@YVct4tXH3_TfF!v0ZwH3uAU^GRCavnp`GL*y}#|K>@H zQ?kN|CK5Dnp}BJkdR{o1aJ_NS?Zt;g67`yq-Ln}LYsCAeZR3)rB^yaF`GA|{cS>uyePs1lyW@!Gv zEEU%KNGa$7Uo!j)#$*9x0`$hfmGqHYgW!(pttQnmm;e`)wzhS_`ATaJcNfPfVB!Yz zuM|gDV1ZnnJclq~pI%jH`a#rBa~f{R1WhBK$BvrWY(>{Z(JREi#@@2%`Cll_zm+PI zqIp9H+D~1Y$hP+oVhCc=4VE`lo;W(p+Y)zP>`XNMsWctHt7v#?sma`8E6@KUR1e`k ztFg!@Ye{0gzE&>O9#B)WODIj{Ahip@{R6jVYivkgcGK{I6e#4{PJVsl-WW`uTh*#O zg)+d*9NK(3yqj!^-AXoZgQkA%JH0nJwEM;UXvHTJf@7W|59bX=_z$lA;&#?5?+dQd zNPtag_b-6zFVR95X~#d3kS`4#iFR*Uj)DHca>Z68nxg+tl<;Sp;oXHY*ieQ)6iUp* z)CY!!tVyR_z`ML7>jxIR`gUd+?O`Xe&keY^arsdpm{Ir6DBqR%$ z!IuJw97t{7ekzuG+=M5;xGZMl_1-#FO{Uki@)UFg%=1nG-~y=uHq-yYlZ2$qU`4jH zTS|2J{@W*AiqyYik&@bImwPy659)X^EkIPJd zb9eqAg1CPmhaLO%N9R_}V=5#-cS2=l5_~dh|5fzbFqw>0o4$~8n1qavQ}h8Vxq8e3 zNsUG2nWRMEz`Bk#U+$j1NiY&fYCA7o=*RQkRWhMl+49+Cj4X2jAe?}_E zfyNN}W{!DVh2DKtD;WrWcG`~~42*dk+#Py69M?o`f%OH6$zx582$j{<-d!XQd*)h-q$AQgswiAI0TF7R_DgWGP zl#`By_y0ZTS_$SXF^l&nmy%!gv@Back534{s##9 z_4d8I25v^r=w<~c7}+{<;$y)@TG~Z$+StPVHnk|Lkp>y?jW|hU_SrcP)s#N1$^-z6 zOuo)rb3@Zl9eF-T3((T!Z!o)nhoNa#`ls~<_gFu@(%5FdcDEEfV?t;kZ;C;BphtY zDM|{cL{u)*f_7)&6mvQnw~X}Mk$KU^xfR&iw1qCX5K0SCTIhluohVvi)vt=U|PqB$G;|?hEdu8AifjDB?hV zboAQaC`Qffu$e|IaJ-`o<}qT}ak5m+-tyiqPyPgHWp(`hIyYBZaALjPo+6}Cr^ucd zxcM&CyulpJaRu|`YV%3ohku&=R(=NnIW+QsYC*<~W;~famZ3E~VLAm8b~L@6eX`^I zK4*pE(K9-3`pbkv9Di6*+q^@*l)J|q{!LgfRRSo>5&dyt6Kx%HM-z}G1qW9y22M6R zC_Gyf2WC=lX*DUZCl{ zpn0INWps1a?q-*y?MP?d7l;Wxjz)50l`NLdrURMO9P(>WN;=f$aCGrkga$o&vpmx3 zdrpV;)y1#RFP`-yTr)GvBzsPz;_affXv06Ekq1)Zn~ZPErvYCrO_@V)fWrvgsIoVj z*9C$I`?exu`Q>3E^h}Ze-~2yBBjTTBfmiWG;P1=E94MEQ{rVOYI6CC(NE)0D6-1JV z2e(368C&U*AV-is#tQ{ajutR_{rMwOf}&_V1So_=>Q`S@_)h*lqCV`I3&bBXZSCf5^dek53dQ~FBH zbCd*Aq+C}1!dm^<8aI|Zi$!}RUy30Trq2ixPu}nvd%w~N126d7fL_&I%MEO$u-3kN z_cH4WrtkER&nITR(b3Uw05@2k$q_zRXaLqvJM-6^Rv@uf$F$d^IT)+~gzNN2W*Q2+ zeU^V=*k(w&82XErB5OYoLc-xf@7ccN8L{)*dtr+WIxH=# zJbTMV$~^ z99g9z=C<@LwRF`wVC_QDoow}%l;XG(A1ezu?XmXMi-?E_^?xRg4{l+b7iLvfn-5pV zqMdSRzSHvRw7C-#xWt}$qM+^P&*dzrm*r{T z8&=aS9gY_S0{*OTjW^-Kz>^F>IsirGDnB|WY%UyW_WfneWf&L;WQJ(nyB{^NgbsA! zzMBl~cX(+Dx9eB@F)%@*x{=x&ynXB1*4ii5)0(O(Z{hGvAPX1-e6GuBa%!;Cq3)Hu z{2*3FOQaDh7^EOafE?E1e) z25Ll9-y{C~;Ah&upcs63xLsLUxo`X4b6++521rr+=AVbcI^z@Hn27Nu@sAgng~d_~ zbpBRT2OtuokQ8J~=vHA;XdV7==MeY;z#cc=x9Z&uiHtB$c5j1~KaW~h;8VT8j(SCE zxi!%eb{apIi(4fTmc&2+mK@aIhb-0kx0prFLi)p}Qty~V+|Z$6r$A4*b>6Zx&P^&R{|6hM8oMxoI2|{X;QgTFPHkB_vne=Gae~kl zopuQ5@cPB~ROfmA)D#kfnNtG>KzmMAN#yBm9{niB!NKc9bhj*c_V&bN_eJ3wqY4J23*PzAl1fmuqtm+33vjkD7UP%3QX( zsO!Z_A%A(i=}_0DqEa;G>}Es=mNgP)ad|i6p1-HjwUE6vk=`2K2PdB_m?Hbib_3aN zv_Ea)Lpv3l$=@!n4xo(F5;h4reQuWt4CYJgBDqGKIF)!ePmKZrHUE2{npxpge1#pD zjSz!R^IJjD%KLKxpfU#5Dh21bI^X4=)vAOgVL`GyYqu(lwjel+UAzm!tuOY~nWAed zZhT%_TRY$9D*t09olZEt2*O*@lMWKmf70ldw$6>scx_%CP*@TPGcg}h3tXFY?P73I z*d#n72f#6CuF@K>XalU#rnoDGT&X_dPo2YWE8*7x%%MmAwhak?Sd*dS>Z7e z(3x{kt-{SF@N{0>S9^|$UPYDm=)r*4j_HHU+}ua-by)A?#x|eR19eKUwZ-#A>l#_p zOg$J;dj5(~s%x=P&dQ2cl*ZGvbHue6D{Gl9jQZ9@{i7B2+KJ#LkBv5zxlH^q6r4h` zOzkFe%~f?~HL$hk#t?<`rscttFVGP5#S{uV ziIDCE%VvBwhk&m^3kYdT%{0o-5{cQ$B&|#p1vOrM(!d<{CdnsO5*p-ER4Qk&iAY}C zW@h2UrN{RbEoJOCQIeWBdZhUPe$aOaqSB6Rjv%Q^OU0*fqKJq&5zg?R2|QQm0z3~t z+$HoL{W>r9*_2y~yj#DpHudSL&}hT&fZ3&ELr`v*MCnF$!*>fdE8O zjANq)+f-a!98j8@ZMp$(U3t{$q=gQsxs+O)ZHeK8t(YjJ=dHz91eP{+*x1^}M8X)p zxpklCR8ms9`>zl*-uW5g*M&b$9~#08Z@03vfgOW2a!W>6o_S==mhE()YNt2{NVl|T zgB0&NrNme_{%KMmf--==ZI1HgWk=P)*K*BmZAa4y5g8d|C(f4C8OooiLZIO6ouZ}6 zQlWY!3k$bzxp=VeWn6!Z6%$dx1JGynA?O_Ev&yP8?JR9=-&tDnH87UlsR$NQAkg?)(K{j1 zM49(TeaY`fvAAB3I<%6YThJI*QAuU@p9dWrc@XX=csh?7);$*l2V!Y)ktRI3-f!;2 zTU$bLQaM3{@@tUs0P=b%UFH|PBWz>i;(68bPO7Zr%orWu47nR$O%PTVm^c2$Pi~A< zP|wR|W=H4-;R;FHn9j^vLCBfUt`<9Ht68PuR%h2SPLdpeL9KdU$l_FB(2#TcszqYH zR~y0H`W+d88Aa~DGqbS`3yGhlc+gabBP-QvYHBCUNG-Cy+5+uIrZbP2HzL4+vggmW z2CYeGc*RE#mZ)+L={t=>KY#A2lBX>A!_#`_LGpxn1t&Pqu;NNDvjAV{=p-vq zYCqw{$n6ZstIzB2~xNX`9#I3m&{uEZxmuHvQ>RaUd9aO+HLb3|7@Eh&vB zXb~3Y=L3i36R?02*?kM3imjf2b1s|Gw7!+ev-#S?bw56n?61MSOoAsgc-m#={Sx!>f$jD&)i{jY`Jt6!S z4?seM35yX({}m+TXIpFvkkT(XoE$273^xw{{`uTYdU8`lGl`x#0_jX$1Gjji*Hy`x zWfI}$&415y_3)zq5-<;MYVJ)wIjtc#ERB13+?QK2_%P~Xg19{SFh~L*@|g77^=#xTm9{!b$qf8KsO;ft+;k@kwyM%vj7SH9ZdV zdI>!^j?)tiB2&`k><@5VSLu90$4v#wb0B4%?6OMw1D#AM)Ju~4U46H+c3s+1pV&daj2iCO zQqzZ?<|{39`{9{tfG{x7(9lr1N`?6xxjXerjGo>*eVJ0DAxMzFv9<*FTaD;Zn`-9{ zTRs(R$S?VX^8{(K_SLY{xyHPTgA3Fg$T%Z?4{>oV5%^8b_L`zDHEs3(UR_B>7NPV;J}D_PW!%4qy_vZx-X_*dd(Wx*d*@TMq!HJCWH98lzLcy`dB)?2i259_|r z6xyAF_ZX?fkDmN{TZ;AX&g5cROhJJ9r-s(V{1eEGkY*~UvUaj0pCWA z`Ya1Gvyw#V{mkOmI?krDuGaA|u!t;Txx=#~)UBYn)Q1l{wH;`dRVo!<5bHirj8_di zIVwCm)FztSJ|bM;q681+xsR>zB;H@#(3h#(^N~gpa$TzNtQ+N)7cvg0{6C}n^7)H5 zL#jw5Qd4bhtx~f7UP?F7DXX|rf`RFiK5sNzRYiq>m$$dp*zoY9`@`kdom`jxIf}yH zt~JH+J;`xs_c_5XqnSmYM0~e2f{LqiLKL`f4bQ$i^&dSo-Vsf|qLQMIdIr6G_-$Dh zRNtQ$Cz8kxr9Mq4ELSz0g~^;xI8m~loxsqiM2Ae1E_ibG(I*En47PV--~y0*ij0R# zCU>HO(}&64n)h3gEtk3_s2>JdZ_g#+{DLpp!;q5n*LD7v?eCr@oDXN)aDNA*{$~OV M&^L7|QI3!Q0~iLbLI3~& diff --git a/graphics/exported/character/experience.png b/graphics/exported/character/experience.png deleted file mode 100644 index e1deb79bf81d6296fce2e5f721d3867c364010fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^o7)5DYhhUcNd2LAh=-f^2s3S0*}aI z1_r((Aj~*bn@<`j$X?><>&pI+m5YPHWTx4Qc|f5Ho-U3d9>?EaJLt*cDA4-w|JQ3u zCzLA0mp)HoV@s22lAO`tS#fQ$g4_|;9)|*bt#4O88(6z;># QK)*3~y85}Sb4q9e0Cc~Ep#T5? diff --git a/graphics/exported/character/initial.png b/graphics/exported/character/initial.png new file mode 100644 index 0000000000000000000000000000000000000000..48354bacd7d93568c394d0c2b88787ff5c2e2226 GIT binary patch literal 6844 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 CTxaOt#k& zp(uGR(L^H4sFA&~WNY{i?;r2;`<>^U=ed99T-Ukp>%M+ZJl+DcZ?D{50Kh)1nTaI; zJOR)%ZjT@|n>=pihi?3S##rk;&v@`jovh&40&{NoS^d+a z;>0@<&*P&=d8$&RzvD6pQRS4v*+ssJ{1keeea4@x{mpV5EBhCu@v^$l6P%!F^I7aH z7WrTvrSbOgMRxx{RxV+L`st~m4eFU4#wBM%Y;(ZKFr+yS#|t75T@nVgxOLAd0(a&C zQVgN4_iT>}r@40>I5)O;lJ>k9{TOB%2QgTf9nu&+knm0Z^7kr(m&!TWkc39uZd@ zZ$F?$l(sM715R+t_4gj*p^WXL%yZ2ql)k-CXY!2O!2Z zk&t^O&*3}EdFeuNc%`LxjouJJrVRJKroy_5ngM`Ts_kPl+$+g*vz(P%t1kP>ghu5) zt>G41(*<^*9}u$~Q(+~t0$<+@G##Gqv~%!VzQY4*zX@)B+}ye_75&4kxH7_y`1H)r zgW{n1yDdA$Qu&g?tX(W49KrM+nb*x~opIn?D`;!$-bsUNl}gdtUk5lFT|@ha$G0O3 z?i#F{!o{^$c|mQV)LyjZ&o2@)irj@Lytle)@306MtLSiysbXo0h6XG*x#cScPdg}k zHfRWd+DBr}slGKsUNNy7NqVlIJl8d- zaz+2Rh@!Wvv?#>W@>>Q!%}eSbp8WYG`zAc+k-? zlfi${i8w}qL-EEitb>rrlm3tKF;Vr@SIC5cV37bwVZrKtXa`@6{~`v%M~w*yZ*n0P z4D;@!qthnE5m)*Yu0N8+d2tHO4P2c!y012r-~IUjChKX*X##HkXw$!5+*)~f{1ms{T3)+vfoXE z9FH{osJFUTl%v`UOCgXMi#+3=2EC{PsGM-+{&?_MYqhLPvIjW<(e^OrXDJ}onHt*HIgSVGtY+bs-~IV` zrq`*$gXi8<8lmK5jx)0uiR^$owEsetu}+aks^93W%wO?`(LK`6CjGAO*r@Mzd@Rf> zrQMaK=LxxxU}OZL7n!8vd4EAgIeNnkv2t^h;esLmwC`9mP3A()Bu)2_6^Df#Y#Z-j z82$*==`bkBvl&>!2|G*gfpRTEs1k*@c%3ecA0WFa{3&OR6W$g2e<)-ud^|21y+i8{ zW^iA4X3=YiszNpo@Y!0-$k&i88`O)%Z-3tmA7o*dt>IgJ9w!HPOVDrDm(XO+3M%Ek z>%K==kT3XcY?8#_rycG-E&z00M50yUtnAN&r8jAE2&RFEx@sMwS4a?yIZ4*3s@5&J zF+aw?6 zCr8SSb563ep0wSqN8z-fm&y5BDnYYx#nb+%F5T7SReD-nd!=bnE&AO#5V1t4(tyJ~ zjo9Zc>B7d1|N82qd&nC1DxX&aM%(yfilz35X??3kwb%Kw08}3O*H$URoA1O{ZoaIP zj%h(ozNh}+;{#fb6tY>I`ziMp-y%R^Dk#R8T;6g@zYyO<|J!&E67{M4vrpOw%c$%`#s4VqE}aO1UL2nr|}I zrB}1#jc?P_Lm&jP$g%jeP{jF9Dl|yn$_`mD_`0n^G>tL(a@#YNYHk~*1cSL?b89P_ z!=Q>2)%?y|s_5uUEL=R2smr{5z}msj|0+MoOljF#zM*$Y@$`*i%%Q+aYws~-6%a9~ z=7%mxNfy|YJ~DmAJMfV?E1-1k^e&m?-qbYKka6qG8E+$>`-aqnY*fmzCN>^ z^YNE;V{I~;@y2=G2aA|W7+&`N&6?EJfk>Gr5?l~dfBjltWcFmYMQw3=Xj|V5xFo3_ pUa+RQn5fA8wLkB7@R!NoN2XTwl+oM>N$8XVu%;F!WyYk){{xUBQd|H4 literal 0 HcmV?d00001 diff --git a/graphics/exported/character/level-experience.png b/graphics/exported/character/level-experience.png new file mode 100644 index 0000000000000000000000000000000000000000..a294a77c59e10c93b99fdd440fff306d209b2ee6 GIT binary patch literal 849 zcmeAS@N?(olHy`uVBq!ia0y~yU@Qf)y*Su_q|34+EI^8-*vT`50|;t3QaXTq&H|6f zVg?4jBOuH;Rhv&5C@5Lt8c`CQpH@mmtT}V`<;yx0|V1J zPZ!6KiaBrZp3SNN|F8D9Tc7dqzQp7pe$2Dz|GTOA zQK!!?lxJ&bt^Iv+d3Ai>M6^8NPvlf(b3tjY9HLsfW4U_!XYWaSiXZMhdG5wKz73wM zCW-&veDdP!>4EhhUVnLa^|ZWQuI}`p;KQr+oyf+i<94f`u1b@_`7+!*U$go z$PnQY`uD>@_w9D)UjxlLljg4$`gRx4g1@1vYg3EN-Z-dxhbgW=5ak;{1^=aFR+d$FNfzw|viQlLBO8uW9 z!|Stum@Wtgf)(Wm<~uP($mi#7@|Inoyoe7Ze#5A&wBh00RY#G{zIm0gt@st&ZlIY; zuNY(nf!3apE(N;#=d9Jcm-p_{Kg%F-ZKYLC9V5){Z8OXj8RyL3Ir}xjJ=^BQ%076b zdnIZ**vTLp8-OA_x_2TFA{Qp6F3t;Qk662O*RG5!wV7-OZbq%x{7f9?(T3@JI5`ta zr{%3excNc+n^z2{qdmQ2p^gKENth(afk|Q4&WF0(ZLelrbL^6>?D|KVeT8e8c}^_j dyD+hyq3dYL)yvHKe}T!L!PC{xWt~$(697F^e#rm; literal 0 HcmV?d00001 diff --git a/graphics/exported/character/level-separator.png b/graphics/exported/character/level-separator.png new file mode 100644 index 0000000000000000000000000000000000000000..f030a2941492195c244c1ced658fafc077bbf760 GIT binary patch literal 6166 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 literal 0 HcmV?d00001 diff --git a/graphics/exported/character/level-upgrades.png b/graphics/exported/character/level-upgrades.png new file mode 100644 index 0000000000000000000000000000000000000000..1078520b45404f3e7a1a3dbd61d3837190944bc3 GIT binary patch literal 2523 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 Q1^@s607*qoM6N<$g3;i0qW}N^ literal 0 HcmV?d00001 diff --git a/graphics/exported/character/name-button.png b/graphics/exported/character/name-button.png new file mode 100644 index 0000000000000000000000000000000000000000..61f7b1bda9203a035370e368797e68161f760e6a GIT binary patch literal 4023 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 literal 0 HcmV?d00001 diff --git a/graphics/exported/character/portrait-on.png b/graphics/exported/character/portrait-on.png new file mode 100644 index 0000000000000000000000000000000000000000..fd00cb109845ec0229c849d1ca20be2624ab9eae GIT binary patch literal 474 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 VwZD8rh|&N6002ovPDHLkV1i-TTtEN- diff --git a/graphics/exported/character/random-on.png b/graphics/exported/character/random-on.png deleted file mode 100644 index 643a80c02fce39ff8675e86da2170eda17ba9f76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4383 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

?_nX^bJBvxByqYa)5ry}w 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 s~=t|Z6on1I1>4D9S$JxI~9u-U;Xy|JLbD+ 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 LNkvXXu0mjfkXkx? literal 0 HcmV?d00001 diff --git a/graphics/exported/character/ship-description.png b/graphics/exported/character/ship-description.png new file mode 100644 index 0000000000000000000000000000000000000000..a82cb88f44de44f0937588ea5d605c7599eeb7c7 GIT binary patch literal 3641 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 literal 0 HcmV?d00001 diff --git a/graphics/exported/character/ship-model.png b/graphics/exported/character/ship-model.png new file mode 100644 index 0000000000000000000000000000000000000000..87250ec139dd2c719d97cb2bd0aa34e63a5bbd3c GIT binary patch literal 4608 zcmX9?1y~ea7e)}lprl5Y5crUf{zi$V1nH1iQjk!FkdCE8BvgbU6p^l_K@mhiVnGBJ z40@N8MFB}+>5hN(pXZsmGxs^?o_pW9?|aV7Gedn%x(gf^C@3iCw6)ZXC@9YOk?(bA z&ylZc#T{qK%~`aHwh1ly2&J`;AwQq@(y~BPP|$b$InShs&?Cs5SA5m)_!@gU`Uc$h zai9nY2oQJna79D+y&S|neVj5^6*wp;n8LKxZkYsTtxN{FS&jI0t&DaZ0?Odzh z#9tQr%xC=de8jcds7UuDrNKNc4)gtj9y7_zWLo`k%!5-}&NE`;eBp&Lzy9&7&ohhQ zbIGdHzkgQUl2Y4^X5nMpgExh@1>T9pz2MZvXn7N{CE?#?E(#b;dp)<`4UN`BWyyHX zMcmMIT0O)bMhE4U53U&qu~7)6e(l`F_RI4mI>PAzzqX3%>&*`j4;Po0ho;%Y*eKN0 zN*bFQg1T$X8ycTPia&bURvYCTbt%eTP+w93*Vu3~3v?uAmxk4QOv-U_b6@L2uPiOa z9v?rj<+;$YBxg42>46qrB1E=??6wT9--!A;K5@M@bpN^qo;Y`1;^F7%PNQ}G@dy07 zDYBA+R6};at5V*4~!}qZPJ-=oV$GStk zHFJ72w_JlIy}syPn@5_c?+aUQGEidtd0$XvPO(=u3mrqt_ed-FswrdHsXN^8lVvdE zvO23t3S$bu&wCal460#Vb#w%SJDIQ zduOn!S?#>W>|P;y0Ghdfx}q3-Raz=6es&|Ru|+`*FLe19^!~~3Mz5wv7OdMA$Nn6+ zfyqOqgDw&m!}{lMAv)ym3Wix^S%&odt$P~l_JpslMSSIOtK}fxoOhU zSDM$K5a=6>Ce$dy+zXA2OsrN~?IpD{n4MSH93AmKB{~KCZ?4Q$Jfdlf;k3=xLk{gT zYp83sAtqp;t1D9U!eD0Ug*1;;SXCSDO5TH*=Zr=XBhz(Dw@eVmtsZ8-=3lLz<#wIZ?_t}vycR~<4S#<}$0Ei8lk;o|Blo3hHK+|TbW z&2tf(Oz;ttW*B?V!9dEQqrbBz&q=!IF%!@sSqZt-KkrGQEzsC#^XVhs`nVK|+nbiAY{b zP$fo(Hez`Aa;Eh6TP6;tZEY{3QQ3#lH*jgx1*o^kg`(|h4)k$KC~Yof%k|_GC&^+W z(s_h*bI*yZytyw#n?|!@X3?-CpOTj$8WlB+ihuVs0F$l%DUt5+QD${MS^5=Kz3nR+UV=H>sjg*wjGx$)v8iu38wP%TQyr@d_!~sL^3C#1UN77ZhmLk1*#v|IG2HiR|%}HcU4$#iHpbTZm@I`CE&wCIg zdsK)>iT-J%xs7~wojvs=06D5BN%Y!dUD^ChN3of~FvovAgkPiIWX;D8&<@0KlHt!hin8Io4NpXb?|O`YObNo0P?-WGRT?n=JgsSm8vH{3(< zTS-za=jr|^GX#SRy|!cfMYZO4p=;T}inxU(P=g$>oKe+pL11ur{7dn+YYgfNGE`KN z4iOCE()JDGW%OOgF*hCHf%8Oz1TgaQGoj4Nh?TqYYee)`5wjKG?&1TIM;^&rpdy7# zRSqwDw3?NO|MD5jes~<;X9~eKoJ3UayudI+l3eskHp0*}N8U?P@yzmIJm`4y%|qz< zYSt>wIrd-{fWB?dRK|e8B&PLk00Q-#;OD(`0sUqjfI*ADP-LW=^a|@0I{ig`$%N69k&UQGW|Lmsxt(LNLt4K~HxR=)i+QyjaRb%

Gimil>1fQEaF@j3O!@|OR?uTNy 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 diff --git a/graphics/exported/character/slot-engine.png b/graphics/exported/character/slot-engine.png deleted file mode 100644 index 8c07f2e4f95373e9d696fb0a76ed5fa5d82f2a1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3134 zcmV-E48ik>P)|5^O3J8&bt z^Ugcf`Sa&@k(|6iaUa0HJ@n8+mu~dm|1&^`4jq~x`Ix&uLGn)kRKM=qobx$Jx9!}y zGhJU6Kh<9T4?2AK@SQp5CrIuF@Q|cPUbFH1{5(#bI)#%bPvZ3H(>QhN6gF+zglC?4 zW}~G00K9R1oxfEeNj5z_y$!%_NxR+s{%ZhgLcp7W{*ytnZvb4Mb4JrNSXfxV<;#~b zGc$v3w+jFWA%q*X@u>qHIdY_vbAAxO?&<02Zvof<07DR62*evjk&o6Kyk!NQX5qst z<=2^vU}IT2*(f%Y<8VR5ifzV^!WwoZY~@_5I4 z;|n`)SvUF|Zak8HV=W6v01xij6N;}r{0CC_27qq@xLZr*BrZ`p9Ai4v<>G5OrBsZP z*5;U!7ql3fX09d}4Kk8U*+1{7e}~?C7breGAYHYzfLC9AeofmJj~sUHF3fgI8vodr zXAFMOICyD1%)P;~&k!vh{Qk?g&-G^?xn<)$x7~fumKR5>-rJTLk$RnAUXh3-3%vEjp&}Ikn8~B)aajMdc>XKU5JbS< zz1+Y57^jZUu=?YvFCgO|MS|2Uq!)t*KkPQ|Pj~F%q9+zVKk>_n<0pRgo!dA6-d*?I zv+lcb{@kpRN`_ch6upmsf48h5|^9A#E-m! zy*&6;*t(gmw(2LdVXB%6F{ZHC_Tyd0{&{~|9jYJv$IN|O9(br+pHH1>7emcamL;qn zt=qMO0lS2khBS%XTOa5hYeU_weX4OEH}ekRAz-i($QB_M=BwSDZf45fzH2nJ;6oqE)J*TYaI|e`LbPzIH41Hzk_F8dMpvGg5GBA#s(# zE9U-~<-rCI-a%%kGOo?^RR*si7`?ewh&0ec@R8tFgNOu3DpDR-6St9Qm9EA4;@Z%$+)5Dh7-hRhqY>NX>d9YMRx- ze4>Cxj4DYP+$W9MAN)fp~iJYc@yq2D(%7}@A8Zmf5T=<-2zZ}M^UXeUjOzIHqW(#AU2BU%AEdobkzzC^8 zK#ap|33t4vG%z3v4-E;Azj_p%4(=9DKVt%dW~mk66dKWJlpIEfS_sKO4L?Im(Eu|6dFV$95Cl3v8R>!`T=OYE0Z+z< zXJ&-0U4Q@V2f6JtSrHqygV^>{FuDc8<;X_MS?B}I8Jq_JS!f9+7b*t_0J70qzDdN2f2TSFX*ydeDa4G>B<&q_jCgv)TPJ zgI^@Whpqd9z>H`YUGXAl9|GZG&YVq-o@6P*8ZpcQc15r`7ZxQ9B;+BG^#t}IYak|w zEq^sxPtD&K#0tdv2`~6B=%xqi%rskXsuXY2(c%b z)dV{OF(hf;!GWw;Aj6EP4!}A)%PiCdtpr#JoCSgedX`F;5QJhl^youRE?>j#!|~$+ z?)6P~Af0^ciel>de7Ts?0^8M9=(py*U`6GQ_Y1Wz7tP|yeo=M;LzTf!FIh3jdCp-C zLOqvQoVTFbX`Mkroxzdp))Cp26&HxW3?OHYxd;bKL6R{ULS7LNd37ta2lwKbKXuzy zVP>5-XOHF1+PbyN3VEc{#7@!t=~p&?x7VJoSdA18bXbNWXREIaP`4R#4h|6NISbu$ zh^aQP?k9Fza#bmg3Cs%RIcE%@hc?rbGen_7nk!p!vjlS4krV-dgoHhSB<$Tw+B}3oU%OlL7iuxujk%A0fqs_6n);Rtg6#^vmn?2ssEP8(f4Jk zg0WiY+aya{mlY-{=B(~H(qd97nuI7v?ZPNraIfv@Y3t`>gzPo1XgwcOku>ZoU?#!DHY%5P6{rTHRR(I{+i*)9#)>fCH z&V}gZVhWdw$OV@*A_rECo~JCj`t_i-F@WQh*ot(sFkrBD#UA>&hG2lO2LSM;XK~`- z!9D9sKD-`+EFEpb_(e%^;OI2T<_l9_LV~C)q?C|{>BsW6MZfkK>!TH%0I(+kcwNBj5cV87 z^1>Zbv0IK^B)=l@@d51d0dC3jS#KKgqgsnUTGeUJZQrr|*qJl$VrtF!@%3xlpXO$i zAR`M;sa1~=$psfAV;IoFf4fomM1XD}@gu-TehJ_?0RQy*fdiBM!v0XQT>zeR=lu@c zKacKTFD!K5ttVF>+A_KM;tgxz<~pGjBy8m-2lER;Et5-js*L&{=(ShV0a~1{&B?M=t!p+tQwuT)b=ks z$Y!)#{)?GkG}?;Jf_5nP<^!(NI^z>Fqy8!G4xIH@_%^n{eAU6H%$M4_q z=&Jz>FV+PwMbc8vfpKN|+^2e-vSY`NV*ri;`1`|$53h6guLF1rz#qA6o443D(CE`m z!n?tAvDo<{ZW#;Nj@&&&Xjp)%J%KWHeQf4 z!ewp&Kl3}*ef#!>4I4IW$M9C~2>|z8Eo<8r^YinVpP$FV!UE>!=h5wUv1Q8^4Bzt5YQ*(6Qawz62!g^IN9(pp=@QmY_H z#kHb%5PMd8Y>yQ$m4cukwPyc~^oQ(8FS-{!2wr5#CPmakl~R^&xZLm zMvDVLzDxZtRc2q=LO1P|v&7=(kTrQKXT14t>G>a3#8i^`Ys`XJR1lsF>Ur*sWoAP~ zTqW|y+VzhCyc}gLGoP?G?_N|9H}SSvT5FX1mU|b#Q!&D>l~A5rn4bMFN$kX#@0;%D zh$RjHJhO%N)ue|v(d6%%E6=$kY5=ArruT}%I(5E$WK}kPqRcxa79l4N09My?zF}r* z2kD8oo2%ytct>_V0C?~gmf8*JHKgR1dD&p%ifqtfT;}V`{C8evu9W<`J#!hrF`2o$ zVervbyL(AyZtMeFZPgA6;12)?Wda6hv`R*CeqrC?`*CK)&b%Oe1*PHuz|&i9=Zmkq447x%pFa9))CsXN@0WHu!~sCKa4O6kdHu-pyGlDPF!;=p z-MA2Se57p?P}=E%=-)%zV*a(6xpvslNSPP5eFguAH~=s|y=Hk=q8#4P0U@QGE+UnT zp_vaU?Q{{TWE|UBwd=14_I?Q)rwO)1?%aFjxu1dt1ZMskvk>epA{}u6pgw!wjw=}h z`NT?ChmBQq~o+UX*=WZct`u(Z>~$dYkS=3UBF z@OX&>fYtT-*LRnUJ2KDAbf>lQ>~PzRQ7RRLnHL}d03ENt|AE{2UbWqmx#HVJVK#&M z9rm2l#n}}i+8(s+cnlE{1Ndw3otg6hO8z(kfO>CZ^MTt@?T#nR>3`;}1M6dkFn~NW zJ4ECHV;+_M0m)-XJY@zx=AdERzXt^XmTse%5P$;vf4Ih7c=iD7*@O4phuYp_`E2^J zIiQ~bjNdjyaW8$h^QN7;6!hmiI$iCWhoIcGxt@>_;`^Wl0@-ev#7qi_oCiaPBf1IGUIUV T`X-!t00000NkvXXu0mjfl$9}f diff --git a/graphics/exported/character/upgrade-hover.png b/graphics/exported/character/upgrade-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..a404bd7d48249df3e2243277a63184c5f1070413 GIT binary patch literal 463 zcmeAS@N?(olHy`uVBq!ia0y~yU{nIK131`#mmtT}V`<;yx&}bh| z7srr_Id5-n%ZjKY2f)j+56x3ZD z{5l%u2rybIG8H+oJZTxC66G}&X7y#P8%%*d+pDt(7!VdLH>SI?JbCsZUO-@TN5dWF YY8T$+T{%yl0Rx}G)78&qol`;+06cD&tN;K2 literal 0 HcmV?d00001 diff --git a/graphics/exported/character/upgrade-locked.png b/graphics/exported/character/upgrade-locked.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea8b00dd339201cc84e6404c3c6265aaa7fd1ab GIT binary patch literal 11758 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 QcK`qY07*qoM6N<$f`f1`k^lez literal 0 HcmV?d00001 diff --git a/graphics/exported/character/upgrade-on.png b/graphics/exported/character/upgrade-on.png new file mode 100644 index 0000000000000000000000000000000000000000..e8c36254dbb724fe9ddfc713b7620a925b787182 GIT binary patch literal 3552 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 P=z9iFS3j3^P6fAAk7% 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 Hu0mjfD=krK literal 0 HcmV?d00001 diff --git a/graphics/exported/character/validate.png b/graphics/exported/character/validate.png deleted file mode 100644 index 6bf0b1a72f4e7ab58536983cf7862367f2930e2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4400 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 diff --git a/graphics/exported/character/value-hull.png b/graphics/exported/character/value-hull.png deleted file mode 100644 index 9914911d595786982096afc2da3acc094f4ecfe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3063 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

QEjiF0H$_Z;^a5co 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%0A`qZ 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 diff --git a/graphics/exported/map/options-hover.png b/graphics/exported/map/options-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..2f58e291b2fe4c8a19125481ac02415dfbdfc046 GIT binary patch literal 5763 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 H@YH_+J6Yrv literal 0 HcmV?d00001 diff --git a/graphics/exported/map/zoom-out-hover.png b/graphics/exported/map/zoom-out-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..2d45a828b1a9b49438045a76794205923be0a252 GIT binary patch literal 6239 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 literal 0 HcmV?d00001 diff --git a/graphics/ui/actions.svg b/graphics/ui/actions.svg index 92c568f..92b6bef 100644 --- a/graphics/ui/actions.svg +++ b/graphics/ui/actions.svg @@ -16,7 +16,7 @@ version="1.1" inkscape:version="0.92.1 r15371" sodipodi:docname="actions.svg" - inkscape:export-filename="/home/michael/workspace/perso/spacetac/graphics/exported/equipment/kelvingenerator.png" + inkscape:export-filename="/home/michael/workspace/perso/spacetac/graphics/exported/action/damageprotector.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90" viewBox="0 0 256 256" @@ -3114,7 +3114,7 @@ inkscape:groupmode="layer" id="layer11" inkscape:label="DamageProtector" - style="display:none"> + style="display:inline"> + style="display:none"> diff --git a/graphics/ui/battle.svg b/graphics/ui/battle.svg index d797fdb..9d1d191 100644 --- a/graphics/ui/battle.svg +++ b/graphics/ui/battle.svg @@ -16,7 +16,7 @@ viewBox="0 0 1920 1080" id="svg2" version="1.1" - inkscape:version="0.92.2 (unknown)" + inkscape:version="0.92.1 r15371" sodipodi:docname="battle.svg" inkscape:export-filename="/home/michael/workspace/perso/spacetac/graphics/exported/battle/actionbar/power-generated.png" inkscape:export-xdpi="96" @@ -3200,6 +3200,42 @@ y1="123.97214" x2="111.73327" y2="123.97214" /> + + + + + + + + style="display:inline;opacity:1;fill:#43535c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.5999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;enable-background:new;filter:url(#filter6088)" /> + inkscape:export-ydpi="96" + enable-background="new"> - + id="defs6038"> + id="linearGradient4877" + inkscape:collect="always"> + style="stop-color:#000000;stop-opacity:0" /> + + + + style="stop-color:#000000;stop-opacity:0" /> - + id="linearGradient14964" + inkscape:collect="always"> + style="stop-color:#263342;stop-opacity:1;" /> + style="stop-color:#737a81;stop-opacity:0.90980393" + offset="0.08748852" + id="stop14958" /> + - - - - - - - - - - - - + style="stop-color:#263342;stop-opacity:0;" /> + id="linearGradient14922"> + id="stop14918" /> + id="stop14926" + offset="0.08748852" + style="stop-color:#39434d;stop-opacity:0.90980393" /> + style="stop-color:#263342;stop-opacity:0.85098039;" + offset="0.17361853" + id="stop14928" /> - + id="stop14920" /> + id="linearGradient14908"> + id="stop14904" /> + id="stop14914" + offset="0.09682183" + style="stop-color:#7f8994;stop-opacity:1" /> + id="stop14912" + offset="0.24839224" + style="stop-color:#d5c5ae;stop-opacity:1" /> + + id="stop14906" /> + id="linearGradient14594"> + id="stop14590" /> - + id="stop14592" /> + id="linearGradient14194"> + id="stop14190" /> - - - - - - + id="stop14192" /> + id="linearGradient13911"> + id="stop13907" /> + id="stop13917" + offset="0.06290146" + style="stop-color:#ced3d9;stop-opacity:1;" /> + + id="stop13909" /> + id="linearGradient13887"> + id="stop13883" /> + + + + + id="stop13885" /> + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + id="filter12710" + x="-0.0038717121" + width="1.0077434" + y="-0.013324509" + height="1.026649"> + stdDeviation="0.39191675" + id="feGaussianBlur12712" /> + id="filter12807" + x="-0.2388" + width="1.4776" + y="-0.2388" + height="1.4776"> - - - - - - - - - - - - - - - - - - - - - - - - - + stdDeviation="45.732132" + id="feGaussianBlur12809" /> - - - - - - - - - - - - - - - - - - - - - - - - - + gradientTransform="matrix(2.0864198,0,0,1,-824.28045,0)" + x1="750.42859" + y1="231.19315" + x2="993.42859" + y2="231.19315" /> + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="filter7193-0"> + id="feComposite7185-37" /> + id="feGaussianBlur7187-59" /> + id="feComposite7191-28" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + inkscape:object-nodes="true" + inkscape:object-paths="false" + inkscape:snap-bbox="true" + inkscape:bbox-nodes="false" + showguides="true" + inkscape:snap-bbox-edge-midpoints="false" + inkscape:bbox-paths="false" + inkscape:snap-bbox-midpoints="true" + inkscape:snap-object-midpoints="true" + inkscape:snap-page="true" + borderlayer="true" + inkscape:measure-start="118.5,884" + inkscape:measure-end="120.5,869.5" + inkscape:lockguides="false"> + + id="metadata6041"> @@ -828,1256 +930,1622 @@ - - - - - - - - - | ATTRIBUTES | - | SKILLS | - - - - - - - - - - - - - - - - + id="g15007"> + y="11.249983" + x="0" + height="1080" + width="1920" + id="rect4710" + style="fill:#0d121b;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" /> - - + transform="translate(-3.7618647,-11.249983)" + id="g4708" + style="display:inline"> + id="g4649"> - Z + style="opacity:0.61100003;filter:url(#filter12807)" + transform="translate(48.438931,343.82216)" + id="g12757"> + - + id="g12748" + transform="translate(3.5355276,-9.1923828)"> + + - + style="fill:#ced3d9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 308.76187,152.4881 h 260 v 260 h -260 z" + id="rect13446" + inkscape:connector-curvature="0" /> - - - - - - - - - - - - - - - - - - - - - - - Cargo - - - - - - - - - - Artana's Fury - - - - - - Lootable items + id="g14100" + transform="translate(0,30)"> + + + + + + + + + + Avenger + + + + + + + + - Sell for 150 + id="text7309-3-9" + y="967.43896" + x="436.77335" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:24px;line-height:26.59000158%;font-family:DAGGERSQUARE;-inkscape-font-specification:DAGGERSQUARE;text-align:center;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#e7ebf0;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter13789)" + xml:space="preserve">Artana + + + + + + + + + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + transform="translate(0.33518013,-11.014591)" + id="g7557"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id="rect12398-2" + d="m 952.33519,43.249922 h 846.00001 l 49,115.999998 H 933.33519 Z" + style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#e2e9d1;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" /> + + + - 150 + id="g13268" + transform="translate(65.406609,-59.943224)" + inkscape:export-filename="/home/michael/workspace/perso/spacetac/graphics/exported/character/level-separator.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + + + x="0" /> + + + + + + + - - - - - + style="display:inline;fill:#fafbfd;fill-opacity:0.1255319" + id="use7546-1" + transform="translate(423.739,637.5569)" + inkscape:export-filename="/home/michael/workspace/perso/spacetac/graphics/exported/character/upgrade-on.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> - - - - - - - - - - - - Level + + - Available points + id="g13533" + transform="translate(0.33514404,-1.7e-5)" + inkscape:export-filename="/home/michael/workspace/perso/spacetac/graphics/exported/character/upgrade-locked.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96"> + + + + + + + id="g14081"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 12 + + Upgrade points + + + + ... + + Hardened Hull + + + + SecondaryGatling + + + + + + + + + + + + + + + + Gatling Gun + + + + 12 + + + + + + + Base equipment + + + + + + + - + + + + + + + + + + Level 9 + + - - - - + Attributes + Actions - - - - - 35 - 0 - 2 - - Initiative - Hull capacity - Shield capacity - Power capacity - Initial power - Power recovery - Materials - Electronics - Energy - Human - Gravity - Time - - - - - - - - - 25 810 - - - - - X - - - - - - - - - - - - - - ? - - - - - ... - - - - + id="path9627" + d="m 1920,11.249983 h -80 l 80,189.999997 V 11.249983" + style="display:inline;opacity:1;vector-effect:none;fill:url(#linearGradient14924);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3.00099993;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:10.69999981;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> OK + id="tspan7860" + x="496.83798" + y="22.792192" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#d5c5ae;fill-opacity:1;stroke-width:0.26458335px">X + + + + X + + + + + ... + + + + + + + + diff --git a/graphics/ui/map.svg b/graphics/ui/map.svg index 3d45445..fa53cc2 100644 --- a/graphics/ui/map.svg +++ b/graphics/ui/map.svg @@ -804,7 +804,7 @@ height="1.0909113"> - - - + transform="rotate(-90,315.37748,110.48112)"> + transform="translate(82.550003,-4.2333336)"> @@ -2192,31 +2179,12 @@ - - - - - + inkscape:label="Character sheet" /> + style="display:none"> diff --git a/graphics/ui/pics/action.png b/graphics/ui/pics/action.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe14e6a98c8db7f82a195b212f66c3594a80685 GIT binary patch literal 63327 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 DEOU%X literal 0 HcmV?d00001 diff --git a/graphics/exported/character/value-shield.png b/graphics/ui/pics/attribute.png similarity index 100% rename from graphics/exported/character/value-shield.png rename to graphics/ui/pics/attribute.png diff --git a/graphics/ui/pics/portrait.png b/graphics/ui/pics/portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9914231648a906b28f2e90939ea6fa1d7fda9e GIT binary patch literal 90985 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

sYjoQV<6z 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 Hu0mjfn3%@L literal 0 HcmV?d00001 diff --git a/graphics/ui/pics/sprite.png b/graphics/ui/pics/sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6599add877c1d4f8fa8eae8df64755e50c4a5a GIT binary patch literal 8248 zcma)Bby!pH`yPVifDy`op$}y6l8yMEei|33NcrEh^NG%gyZ?jR5y%YQo=C^H)hT%_{Q)K;ZhBI9JdCv((}QclgufoUV-azjrN&;*Vf*>oNaWKj zf?{#2zD7{24y$S-kt7K+7Wh5YxXq7;!6Wogq3#Sr(t-nFM3P1lMYg+!022jS*sYLc zW_?yAl}aLC0m4%2u`ur1@hP0=<+qalZYS9lOhhq~^!h8#pv@=wu_v z`dtrjtJyp_8z?sP7PYnM^}SO$+Q=(+Q)p3mW?%xVzV9YC-~Di)CO|rfJh9y8-ok0& z=#30?*@0exp3h1s)eVz>Mc&k)pC04dK0Do1HQvB;O6)HfLDXTO*J8l1JnFcvT0x)O ze?~HC&UKSMy3AbP1sb>)(-MEV1X-Oft}CeaKAF zt*k45x)Qos)p>(-v`t!e*O)l^JLew`St9atfC*h0;&#=wwO7U^x}_)emE!Ky82oSOiy26R?%}D_~FBc#h=aYGXf|96@3bjMv_YB{6|-w2#Buy*$yGt z>&Ihb%;m*-@Ciei;oUqzR$A{r`@XDks=S&>+Ea(TnyA3QKw$My0>H~%+4miMm&B`7 zG&-X5S!O^&n_e^dC2eFF?ryALEVvIEu)w#5WK~U1PY2m-`6nn`oOBMzrA?2I+Z-Pr zn&z%fH#*Ip2F(A-HU|j`;HRCN2Hlz+TPt5SmOAXhnn)JlwQ`<{s{ae653-$PK z#d7oGA(Zf^>_tZ9-L-LGZ9Vug`< zjfrB>sA7R$NHUsW4(p#;PkvQF6wts^3)A)n#;US-&H}LI3mgM^);p z^Y5h&vrVr$e>6G;U7Veg(o$1XLDs87Il;ZsO+BIk8&fqld}P*7pDu~eMIv*>j+VN^ zsgB9Ju=Jer_YsIGPSw#bX;yyg{heaZwr3hh3xD>T0~^e=C)r$KJethZa7cg6bF}G^ z%C~433k4ahUkO41tj_a|ddDRy(D43Zi?dx56nk;*I8;EY7Npx2Rk{b72?9}G9dGO+ zbLq1-r3@3rLSWghh|2gMKV%%-S9gB}2lG^ZJaaoZI(q8hz_D6V`s)!*ziUnPM^LzX z^1$z-e+At;r)*a5iuHd^)!7Ye4)05Lob3(ZS>?kwD_j5m_G)eaeX_e885wyM2%vja zZF{%-rW%1e{}>w^!||Vna%35k2W)c(et#1MD;)k72|m5Fbc^6m`2YghfN{&9HI=>% z2l_~42RSE(I^@1d%r=Kg+uqH=Pt$4hm?#h#0Zh&+)7er?Y- z6^*{=5(Nti3AH;Bu=G>y{!+O<%N zJ?{67OwN|`#O)4IT3bV~imbhm>~K1=6yE5uO}8O22?;QsHMW=gfbtO*u6;Rbcs;AQoZN>^_8zl-PmJkxSbr#*7K?d7t3BE` z-ljTvCqBLqCq{X-ORGv(Rrvhx(h_%Z@;`q7Mj;ezY$Kuvp7zQkhqXYeD{Ie@EduYF z)N#~Mb-ui*9<6_M$rjps(ZrET5*Dx(?fi+bV_&L8{65!*AgSqU45ODQyeg?@6Kd+w z>Sbe;HX(1C1%{v&ld4cvNRMKYM`5=p7=bIg`F_s1%Jef(r}<+?UPx5e*GF`81Zl8` zyOW7x(Pa@r=8avoABK>RXx^Y*!nzQ+UkKd%95Pzsy)u_A8Z}tUZ~TT|MqIpzOC^sD zxwgQwnp8)PrD<6weFi|-Y4-DPw{rD_8&2&V%1aZs?tw3&+5h|ohip!zx9f$&DZt7h z;$8bTtZwT%*MzS-JW%=i>6gK{kF6VJnAm4tO}1R}yGlcYa58I-JIpT0w8EK#cX~t> z=WA*LH`N?Xq+$mq;=LWHXVswn?~MFMoc)2QRguqA$D@^4RoAw+drP#lJSvd-O08+v zqctdPU?uizGHL=>`=pr#4w3pyDCu~KmJiV=I_>5+i}BV{=I%_c@bo)Tr9*Rp142!0 zhksj%7pI$wMxs>##AWpDg+C?D<7rIHWuO5?=#~3#AQt)Cw?*m6HJQ0JSq)+2Xl}7V z26`hJ1c;ZJHYAy;IN3#r{LR*u#H?3WWGFww?$?^P2%i;x$;z9Aytd^h;qExTpuOYI zvJ6%Nh2jofDKTrml4|pVa4Nx1}@X7C4ZX z7BNq#VeMHz1rrp@f5^Cywwt7cGmflc=Z=~$nTd0)-uhpQ7izy5>TY}&HW(jAh)b8T z2##9ZJyTOttHuy0w-v`FMioT!z4!Hk6%6m9uY?dunNOK%ZoPni>6OqH@nsNko=b!saI1&;cg77`gaP##7cPJbe2_>amC39&yD22&vEhb znCH(a>+0$Nx;6GNcYWRd`=+Ost}a0od~kS(0jTS1v9`Uh_kf(|PeGZOnB?9g)e^uhT`CkfFRuefGb-z-ZOYIC~sFkucKKYN^~PuqsJ(;L`PppBo41OSST|A zc|M{{rwdVICCSWItX^hdkl8y4<^4I0c3?ZaLL zEOP?0>zZA-s7f4YetBaa$UTg0&3R8GU9lRWar=SCcdZyD$x*MrF+5=MoUYQ+Qs7^D z%pnh?o!F!R_7n8oQBon<;gvZ0>#IAOd#kRnSH`Gr*KAY#cYt99+@-$40@^!01KVt| z5AR=uz3?tG%p}_hXtoHt0Wv_bzpnAe!K7<<%p(QipB~G4Z9!Wvu$+tjH#+unh>I&< z-uj8XALJ<;9#TaIeujg2`)?37qDMQmgIznd~ot5PCCi8TYC>}j}1ZWF#a&nocYybFk zb3f5b{mjn+f!y8Q5pFBdsn4lv-+3Wimnc-fjHC*gfA8t(`Mj~Qv6WSFb8n`_mB!2S zjHor<0#DV%GSKG0)_=J-!~T9;W|(TMkPQN2_&;_4QOaq{&CT`TOZ8==msmY$W>`->1&MSUl^sqsly0;FT1Be3N@KIhS3iAdo3qmzr{&V;vo zx(*v314&*MfrmdtwGEb={%n>NX?$MEUba&pu}|$9ApG{gk~)r{CMQ8b!Nu=o2AOVZ z`o(w}0_0`#uPtcOX3NLbT>onSW9Pt!s6_xcLwC8`YNa}r_k7uCQLAKkL1hfLRz>?n zrKJ7?3@j?Mq|6=G5k?yo!@{Ry?d*J=hlj_+GBecHt2 zyu_CKNp<4D?}jb68kCf%gha9b-Dy8=O=id0M(yEHeFMR?0Sv%9PXnxuRWxP*-=fu< z*!T4-?LQKUE!X!?hS)$Y7IXkI(Y)EJS78(f0GT%EldHeFn%akqjEu)1E5BC+Jemf$ z&IVGs}9@%FrkJET0%2$KU9M1W96)Udr6G^tffVhGuK3gc@uWd*4C%+mtmG3lRyNZ6HUbT z{Fwe~QNzF9Jn5p!HMO)1WNR0R_?X~+fdjOT^V6qcGtCKZLkcS-`S(BWmQe=3%KYQ0 z1hJlL@dP+BHDRX<7&dqV!5{@DP=_rB&-)YG?Sfu1G%v;8+ZlT#5-3BOw@tG&ngN`E zVHAE$7?p&AbBVN1N#Y$cH9*_*H_sNMAYlYgcfGr0t5>qUi(@>Vu{K*URBraT!k*pc zK>eI9i2X2@<;nWv=6AQj4T}uS&QAcy7OwS+GiJu^GelcPHi17#y^R&g}mLLw9YkmR8@YeeECXWXZu zH*c5*Po6)2-X-1t=@Uh2S{jq;o60~?{*3wgk}>gYKPg2 z6u2!nY_5!vwu>&*;VJv!Ud|Ko*(o^YCenc*Ty-eR(MY>XKj6{UYS z#e+U2W#0a;udAy*;qTecGp;9ROKivI?$Qxt)$%(R#|J4Wd{Qzq7NVyo^9#jpV{NTC z@LQwkwt092Ci$YR?$Q3KTp@o?nft2i-cRW^r&R{SyVtnL8ka-xJ@DUDpy(y29vi2X zAeZIWqn8tGNLs**}PKhoQj?Q z0;fZNb>n`Vp>*vng>Rqfm;0(Til$}79DG|jAcFX%3kA!jamvjI!PwhjqG3*^(aS^i zG0T5O97$`$&EB4+t16*UDyV})qw1IaMve=$Oua~|`LJ7E1YNn9(-hm!2&@)s_lr2orlXXbZeZRN%&|n)=Bh|8@ zgJ`ErJ!?G_w>~YU-REWo<_znGQ59%E^%4c&@KEiLur5gS!vv?bHK6;;4`nO{dcM~u z1QbL+1-9<)y)ow8;9XFz-#=4eGBm{CV_6X82Z;^nUm{_u3)HCN7?L&gqN1|0u(R{Y zY8>vbN6o#-=^SP(e8OWBYJ&PXl_{1xG>pFxjHehJ9IUV(AL}VS2e(^EXu%^!M$(m2( zA7WHQ_L)LY3`rd!nA2}4)&=eoh17$fl1pt}Yu49ti8lD=*nK;Wcgb;6&4F~4Qw>~z ze3w}dKG9u>%C_P0O__KGrPRrhQC&rjwGm{rs}8!G7o)j3P>Q8?!@^!)h^C>eW2q~;5YOCC(R!WItyCEh;2s&RP-)TF^$mEyX! zJ>PKdJbPa%-1Xso83n1RfDX`r1jbU5g1!GgY592v0_(rJy3SfCDiiL$9zu?JXamMV z0OqTwCki%TtR7v=vN4Y~hz7W3l|2H0jO#^3MF61{5H4lZ;`7o{zSLO-M@J;rSXr1I z2-Xz_ByEoy;EG5?7lQtN>Cb{WoIek_y+J85&=6cUaI$|9-U8Ck*p-$^AiWA!squrW z54+B`Bm@oeOG{thq8@Q<5^eEk!(y@ZJu{{shZykUHzl~02Ma}ePq&oV9n3~`N|0|W zbGTOI{f|BfZ#@-&8@xlxh-L87X4l0jJFlNI^&yf}D&Jt1zI}V;wIj66(6it6;55vP zFdd;&+8TXh{8+s2;Fe0}uw>8@OCGfCc;0_iB*s=-OUtpyQc)H^?Z{1iB?1#YJ#Bi@ zk${L#G-fle=c!eGhQbVD^#08|;)RA|nZ2W7 z)WTf|W!OOdPMb#f!{Kl?ifVp`u|D%5&%kZnv5o)$omH=t?R| zL7P}vm0XOZ#>B+9g3|sZA`3=zrF7tI6l7n2$M$&))Fu|oKKJr6BA~sb#+Ph&A7t&+ z9vD-HdbP$YM==ykJ8mq9Yt<>I8Du`1vV7^6o@;s~V)V4xzU#jBM;*J1ba%x*8dUGl zZnMT+u;Cu{jOU3`2>s?Hj}EI9;-~aPMH0npaYZs>=U+3JY!K|w&vKF#@REXpZj6tQ z1I+`#rtVo;;SE^mKRBqD?~-}=FrGiwJ^ey)n4RjwiTqbQM0%Vl7 zTSIb-Hd2mxIzx}QE#Pl+UWnKWL?M^9oyH6A@fCHW`Fv^`g5IVT7PF>NNUq2RFEx;` zGI7E*vv&)oT2qq^NF2N0%4${ZpdL%GO%y|rwQ$}B6OLxpC8A-y?aybzAOl~ z7ZRKhWWM3up-Im8A8JK4541<@*ljvrNM^~FmXt{1Ih_RZhA->qoQX27OP@+4zJ|}w z&+|Dn%$N`7DRhP|Rs;Q;=TJ(!*BKyOX90_$|It?SP~&!9WlrS%dc}0Egl{**7qg4z zoHzN$zA!7^OX;)Ef6X1!_Yx?C6JV{$O;5ls*N_qUEd4Aq*)DAsK(hP#8c8}=|F#Hg zDd$^!tnaWt@S zqA~ktFiT`}b5qu!YEobD`Xo530Vw1y0Smf}hZ-vSd>m^Bg5Au!7si`f$&V1LKp_5O z6@ENE_}t)T3a*Gc@~Qr?-)+sz&)PPF>uNGms;qYZd zW)6hJ&Bx-MuxvsX&_M(|*IWJ~XcXXSF7Esy7`(3O=8pw~zSRnztlv`cQcHv85J_wW zqH_=>$cK!4Ujr|&ot@pKO_`xz^7W8A_tExC0j#Ra01$x^by&PEI7?9Y!Us7<<@f~c zael_b#+asicz~tk=V+=Lml=+=yUXzD(xvj!coFC0y;{$uN_F!(etV8|QCL4Nf6N)e zg)LZaskF^3xgAk0H(UowZ*+j+31hQp! z*A|sCYK>1_mPC8B-Wr*2S`6F17q6DEm!+6 z@(pFZi~sQYbCEf#6yT(K%IJnabdd>y|R5@U1e)q^UoHCqsxJDb zr0m*PMQ?gM=Y13Cjo>ZtXz6d#d7q6YUW*x)Kejv=Whnir`mis@m8!%`9 z^$g(U#E44s9j;VaGk(?^!YL@mdGCcl5xc76D96sD@xY7yyv}$rNq)RX5x-mJUPJ&k>EZ}Pdh6u{iEs3O?1cY+*L<6P>XM3}-NBe@tey(= P_(7VgIx3Y&>#+X=R-DZ2 literal 0 HcmV?d00001 diff --git a/out/assets/images/character/sheet.png b/out/assets/images/character/sheet.png index 2e629c83b2584acd8689c386b9bb127dd69454c0..0ee053baf93f3ca466c8060782831ddd4e224ed4 100644 GIT binary patch literal 148199 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 z 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 WusQeQwfUEd^>A?lU#K}3koG^+C#*vN literal 42814 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 diff --git a/out/assets/images/map/buttons.png b/out/assets/images/map/buttons.png deleted file mode 100644 index 5a2a9a76e6d0fe1f0a607da40e6c95f6a0f23eb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24869 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

fJRxf4+rO9_xOV_u{L+5EkhxzcHLD~` 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 bOa4++a)C_;Ow_yyo)PKm7;86Z!eajiF?eGc diff --git a/out/loot.html b/out/loot.html deleted file mode 100644 index 98590de..0000000 --- a/out/loot.html +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - SpaceTac - Loot Generator Samples - - - - - - - - -

-

SpaceTac - Loot Generator Samples

- - - -
-
- - - - - \ No newline at end of file diff --git a/src/common b/src/common index 38c0670..2882c79 160000 --- a/src/common +++ b/src/common @@ -1 +1 @@ -Subproject commit 38c06700cfb3d03a1f7309a6200ab0ca7c0ee9d8 +Subproject commit 2882c791e8af845517fd030c6e789296d347213d diff --git a/src/core/Battle.spec.ts b/src/core/Battle.spec.ts index 4d06895..4ee12f4 100644 --- a/src/core/Battle.spec.ts +++ b/src/core/Battle.spec.ts @@ -68,7 +68,7 @@ module TK.SpaceTac { var ship3 = new Ship(fleet2, "ship3"); var battle = new Battle(fleet1, fleet2); - battle.ships.list().forEach(ship => TestTools.setShipHP(ship, 10, 0)); + battle.ships.list().forEach(ship => TestTools.setShipModel(ship, 10, 0)); // Check empty play_order case check.equals(battle.playing_ship, null); @@ -118,7 +118,7 @@ module TK.SpaceTac { check.equals(battle.ships.list().filter(ship => ship.alive), [ship1, ship2, ship3, ship4], "alive ships"); }); - let result = battle.applyOneAction(nn(weapon.action).id, Target.newFromLocation(0, 0)); + let result = battle.applyOneAction(weapon.id, Target.newFromLocation(0, 0)); check.equals(result, true, "action applied successfully"); check.in("after weapon", check => { check.same(battle.playing_ship, ship3, "playing ship"); @@ -135,7 +135,7 @@ module TK.SpaceTac { let ship3 = new Ship(fleet2, "F2S1"); var battle = new Battle(fleet1, fleet2); - battle.ships.list().forEach(ship => TestTools.setShipHP(ship, 10, 0)); + battle.ships.list().forEach(ship => TestTools.setShipModel(ship, 10, 0)); battle.start(); battle.play_order = [ship3, ship2, ship1]; check.equals(battle.ended, false); @@ -154,41 +154,6 @@ module TK.SpaceTac { } }); - test.case("wear down equipment at the end of battle", check => { - let fleet1 = new Fleet(); - let ship1a = fleet1.addShip(); - let equ1a = TestTools.addWeapon(ship1a); - let ship1b = fleet1.addShip(); - let equ1b = TestTools.addWeapon(ship1b); - let fleet2 = new Fleet(); - let ship2a = fleet2.addShip(); - let equ2a = TestTools.addWeapon(ship2a); - let eng2a = TestTools.addEngine(ship2a, 50); - - let battle = new Battle(fleet1, fleet2); - battle.ships.list().forEach(ship => TestTools.setShipHP(ship, 10, 0)); - battle.start(); - - check.equals(equ1a.wear, 0); - check.equals(equ1b.wear, 0); - check.equals(equ2a.wear, 0); - check.equals(eng2a.wear, 0); - - range(8).forEach(() => battle.advanceToNextShip()); - - check.equals(equ1a.wear, 0); - check.equals(equ1b.wear, 0); - check.equals(equ2a.wear, 0); - check.equals(eng2a.wear, 0); - - battle.endBattle(null); - - check.equals(equ1a.wear, 3); - check.equals(equ1b.wear, 3); - check.equals(equ2a.wear, 3); - check.equals(eng2a.wear, 3); - }); - test.case("handles a draw in end battle", check => { var fleet1 = new Fleet(); var fleet2 = new Fleet(); @@ -316,7 +281,7 @@ module TK.SpaceTac { let battle = new Battle(); let ship = battle.fleets[0].addShip(); - check.equals(imaterialize(battle.iAreaEffects(100, 50)), []); + check.equals(imaterialize(battle.iAreaEffects(100, 50)), [], "initial"); let drone1 = new Drone(ship); drone1.x = 120; @@ -331,22 +296,22 @@ module TK.SpaceTac { drone2.effects = [new DamageEffect(14)]; battle.addDrone(drone2); - check.equals(imaterialize(battle.iAreaEffects(100, 50)), [drone1.effects[0]]); + check.equals(imaterialize(battle.iAreaEffects(100, 50)), [drone1.effects[0]], "drone effects"); - let eq1 = ship.addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon)); - eq1.action = new ToggleAction(eq1, 0, 500, [new AttributeEffect("maneuvrability", 1)]); - (eq1.action).activated = true; - let eq2 = ship.addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon)); - eq2.action = new ToggleAction(eq2, 0, 500, [new AttributeEffect("maneuvrability", 2)]); - (eq2.action).activated = false; - let eq3 = ship.addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon)); - eq3.action = new ToggleAction(eq3, 0, 100, [new AttributeEffect("maneuvrability", 3)]); - (eq3.action).activated = true; + let eq1 = new ToggleAction("eq1", { power: 0, radius: 500, effects: [new AttributeEffect("maneuvrability", 1)] }); + ship.actions.addCustom(eq1); + ship.actions.toggle(eq1, true); + let eq2 = new ToggleAction("eq2", { power: 0, radius: 500, effects: [new AttributeEffect("maneuvrability", 2)] }); + ship.actions.addCustom(eq2); + ship.actions.toggle(eq2, false); + let eq3 = new ToggleAction("eq3", { power: 0, radius: 100, effects: [new AttributeEffect("maneuvrability", 3)] }); + ship.actions.addCustom(eq3); + ship.actions.toggle(eq3, true); check.equals(imaterialize(battle.iAreaEffects(100, 50)), [ drone1.effects[0], - (eq1.action).effects[0], - ]); + eq1.effects[0], + ], "drone and toggle effects"); }); test.case("is serializable", check => { diff --git a/src/core/Battle.ts b/src/core/Battle.ts index fcc1ad7..fe6886c 100644 --- a/src/core/Battle.ts +++ b/src/core/Battle.ts @@ -274,9 +274,8 @@ module TK.SpaceTac { this.outcome = null; this.cycle = 1; this.placeShips(); - this.stats.addFleetsValue(this.fleets[0], this.fleets[1]); - this.throwInitiative(); iforeach(this.iships(), ship => ship.restoreInitialState()); + this.throwInitiative(); this.setPlayingShip(this.play_order[0]); } @@ -354,7 +353,7 @@ module TK.SpaceTac { applyOneAction(action_id: RObjectId, target?: Target): boolean { let ship = this.playing_ship; if (ship) { - let action = ship.getAction(action_id); + let action = ship.actions.getById(action_id); if (action) { if (!target) { target = action.getDefaultTarget(ship); diff --git a/src/core/BattleCheats.spec.ts b/src/core/BattleCheats.spec.ts index 8e99910..1b40c32 100644 --- a/src/core/BattleCheats.spec.ts +++ b/src/core/BattleCheats.spec.ts @@ -21,21 +21,5 @@ module TK.SpaceTac.Specs { check.same(nn(battle.outcome).winner, battle.fleets[1], "winner"); check.equals(any(battle.fleets[0].ships, ship => ship.alive), false, "all allies dead"); }) - - test.case("adds an equipment", check => { - let battle = new Battle(); - let ship = new Ship(); - TestTools.setShipPlaying(battle, ship); - ship.upgradeSkill("skill_materials"); - let cheats = new BattleCheats(battle, battle.fleets[0].player); - - check.equals(ship.listEquipment(), []); - - cheats.equip("Iron Hull"); - - let result = ship.listEquipment(); - check.equals(result.length, 1); - check.containing(result[0], { name: "Iron Hull", level: 1 }); - }) }) } diff --git a/src/core/BattleCheats.ts b/src/core/BattleCheats.ts index dd50c7c..11a179a 100644 --- a/src/core/BattleCheats.ts +++ b/src/core/BattleCheats.ts @@ -36,23 +36,5 @@ module TK.SpaceTac { }); this.battle.endBattle(first(this.battle.fleets, fleet => !this.player.is(fleet.player))); } - - /** - * Add an equipment to current playing ship - */ - equip(name: string): void { - let ship = this.battle.playing_ship; - if (ship) { - let generator = new LootGenerator(); - generator.setTemplateFilter(template => template.name == name); - - let equipment = generator.generateHighest(ship.skills); - if (equipment) { - let slot_type = nn(equipment.slot_type); - let slot = ship.getFreeSlot(slot_type) || ship.addSlot(slot_type); - slot.attach(equipment); - } - } - } } } diff --git a/src/core/BattleOutcome.spec.ts b/src/core/BattleOutcome.spec.ts index 06d7c24..0a2939b 100644 --- a/src/core/BattleOutcome.spec.ts +++ b/src/core/BattleOutcome.spec.ts @@ -1,61 +1,5 @@ module TK.SpaceTac.Specs { testing("BattleOutcome", test => { - test.case("generates loot from defeated ships", check => { - var fleet1 = new Fleet(); - fleet1.addShip(new Ship()); - var fleet2 = new Fleet(); - fleet2.addShip(new Ship()); - fleet2.addShip(new Ship()); - fleet2.addShip(new Ship()); - fleet2.addShip(new Ship()); - - fleet2.ships[2].level.forceLevel(5); - fleet2.ships[3].level.forceLevel(5); - - fleet2.ships[0].addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon, "0a")); - fleet2.ships[0].addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon, "0b")); - fleet2.ships[1].addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon, "1a")); - fleet2.ships[2].addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon, "2b")); - fleet2.ships[3].addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon, "3b")); - - var battle = new Battle(fleet1, fleet2); - var outcome = new BattleOutcome(fleet1); - - var random = new SkewedRandomGenerator([ - 0.6, // standard loot on first ship - 0, // - take first equipment - 0, // leave second ship alone - 0.95, // lucky loot on third ship - 0, // - lower end of level range (ship has 5, so range is 4-6) - 0.5, // - common quality - 0, // - take first generated equipment (there is only one anyway) - 0.96, // lucky loot on fourth ship - 0.999, // - higher end of level range - 0.98 // - premium quality - ]); - - // Force lucky finds with one template - var looter = new LootGenerator(random, false); - var template = new LootTemplate(SlotType.Power, "Nuclear Reactor"); - template.setSkillsRequirements({ "skill_photons": istep(4) }); - template.addAttributeEffect("power_capacity", istep(1)); - looter.templates = [template]; - check.patch(outcome, "getLootGenerator", () => looter); - - outcome.createLoot(battle, random); - - check.equals(outcome.loot.length, 3); - check.equals(outcome.loot[0].name, "0a"); - check.equals(outcome.loot[1].name, "Nuclear Reactor"); - check.equals(outcome.loot[1].level, 4); - check.same(outcome.loot[1].quality, EquipmentQuality.COMMON); - check.equals(outcome.loot[1].requirements, { "skill_photons": 7 }); - check.equals(outcome.loot[2].name, "Nuclear Reactor"); - check.equals(outcome.loot[2].level, 6); - check.same(outcome.loot[2].quality, EquipmentQuality.PREMIUM); - check.equals(outcome.loot[2].requirements, { "skill_photons": 9 }); - }); - test.case("grants experience", check => { let fleet1 = new Fleet(); let ship1a = fleet1.addShip(new Ship()); diff --git a/src/core/BattleOutcome.ts b/src/core/BattleOutcome.ts index 7fbbcb2..b303888 100644 --- a/src/core/BattleOutcome.ts +++ b/src/core/BattleOutcome.ts @@ -6,47 +6,14 @@ module TK.SpaceTac { */ export class BattleOutcome { // Indicates if the battle is a draw (no winner) - draw: boolean; + draw: boolean // Victorious fleet - winner: Fleet | null; - - // Retrievable loot - loot: Equipment[]; + winner: Fleet | null constructor(winner: Fleet | null) { this.winner = winner; this.draw = winner ? false : true; - this.loot = []; - } - - /** - * Fill loot from defeated fleet - */ - createLoot(battle: Battle, random = RandomGenerator.global): void { - this.loot = []; - - battle.fleets.forEach(fleet => { - if (this.winner && !this.winner.player.is(fleet.player)) { - fleet.ships.forEach(ship => { - var luck = random.random(); - if (luck > 0.9) { - // Salvage a supposedly transported item - var transported = this.generateLootItem(random, ship.level.get()); - if (transported) { - this.loot.push(transported); - } - } else if (luck > 0.5) { - // Salvage one equipped item - var token = ship.getRandomEquipment(random); - if (token) { - token.detach(); - this.loot.push(token); - } - } - }); - } - }); } /** @@ -63,41 +30,5 @@ module TK.SpaceTac { }); }); } - - /** - * Create a loot generator for lucky finds - */ - getLootGenerator(random: RandomGenerator): LootGenerator { - return new LootGenerator(random); - } - - /** - * Generate a loot item for the winner fleet - * - * The equipment will be in the dead ship range - */ - generateLootItem(random: RandomGenerator, base_level: number): Equipment | null { - let generator = this.getLootGenerator(random); - let level = random.randInt(Math.max(base_level - 1, 1), base_level + 1); - let quality = random.random(); - return generator.generate(level, this.getQuality(quality)); - } - - /** - * Get the quality enum matching a 0-1 value - */ - getQuality(quality: number): EquipmentQuality { - if (quality < 0.1) { - return EquipmentQuality.WEAK; - } else if (quality > 0.99) { - return EquipmentQuality.LEGENDARY; - } else if (quality > 0.95) { - return EquipmentQuality.PREMIUM; - } else if (quality > 0.8) { - return EquipmentQuality.FINE; - } else { - return EquipmentQuality.COMMON; - } - } } } diff --git a/src/core/BattleStats.spec.ts b/src/core/BattleStats.spec.ts index 0aa6398..b0137f6 100644 --- a/src/core/BattleStats.spec.ts +++ b/src/core/BattleStats.spec.ts @@ -71,26 +71,5 @@ module TK.SpaceTac.Specs { stats.processLog(battle.log, battle.fleets[0], true); check.equals(stats.stats, { "Drones deployed": [1, 1] }); }) - - test.case("evaluates equipment depreciation", check => { - let stats = new BattleStats(); - let battle = new Battle(); - let attacker = battle.fleets[0].addShip(); - let defender = battle.fleets[1].addShip(); - - let equ1 = TestTools.addEngine(attacker, 50); - equ1.price = 1000; - let equ2 = TestTools.addEngine(defender, 50); - equ2.price = 1100; - - stats.addFleetsValue(attacker.fleet, defender.fleet); - check.equals(stats.stats, { "Equipment wear (zotys)": [1000, 1100] }); - - equ1.price = 500; - equ2.price = 800; - - stats.addFleetsValue(attacker.fleet, defender.fleet, false); - check.equals(stats.stats, { "Equipment wear (zotys)": [500, 300] }); - }) }) } diff --git a/src/core/BattleStats.ts b/src/core/BattleStats.ts index 6713dd3..d61c1a0 100644 --- a/src/core/BattleStats.ts +++ b/src/core/BattleStats.ts @@ -58,23 +58,5 @@ module TK.SpaceTac { } } } - - /** - * Get the raw value of a fleet - */ - private getFleetValue(fleet: Fleet): number { - return sum(fleet.ships.map(ship => { - return sum(ship.listEquipment().map(equipment => equipment.getPrice())); - })); - } - - /** - * Store the fleets' value, for equipment wear display - */ - addFleetsValue(attacker: Fleet, defender: Fleet, positive = true): void { - let sgn = positive ? 1 : -1; - this.addStat("Equipment wear (zotys)", sgn * this.getFleetValue(attacker), true); - this.addStat("Equipment wear (zotys)", sgn * this.getFleetValue(defender), false); - } } } diff --git a/src/core/Drone.spec.ts b/src/core/Drone.spec.ts index fae684f..28e6660 100644 --- a/src/core/Drone.spec.ts +++ b/src/core/Drone.spec.ts @@ -5,17 +5,17 @@ module TK.SpaceTac { test.case("applies area effects when deployed", check => { let battle = TestTools.createBattle(); let ship = nn(battle.playing_ship); - TestTools.setShipAP(ship, 10); - let weapon = TestTools.addWeapon(ship); - weapon.action = new DeployDroneAction(weapon, 2, 300, 30, [new AttributeEffect("precision", 15)]); + TestTools.setShipModel(ship, 100, 0, 10); + let weapon = new DeployDroneAction("testdrone", { power: 2 }, { deploy_distance: 300, drone_radius: 30, drone_effects: [new AttributeEffect("precision", 15)] }); + ship.actions.addCustom(weapon); let engine = TestTools.addEngine(ship, 1000); TestTools.actionChain(check, battle, [ - [ship, nn(weapon.action), Target.newFromLocation(150, 50)], // deploy out of effects radius - [ship, nn(engine.action), Target.newFromLocation(110, 50)], // move out of effects radius - [ship, nn(engine.action), Target.newFromLocation(130, 50)], // move in effects radius - [ship, nn(weapon.action), Target.newFromShip(ship)], // recall - [ship, nn(weapon.action), Target.newFromLocation(130, 70)], // deploy in effects radius + [ship, weapon, Target.newFromLocation(150, 50)], // deploy out of effects radius + [ship, engine, Target.newFromLocation(110, 50)], // move out of effects radius + [ship, engine, Target.newFromLocation(130, 50)], // move in effects radius + [ship, weapon, Target.newFromShip(ship)], // recall + [ship, weapon, Target.newFromLocation(130, 70)], // deploy in effects radius ], [ check => { check.equals(ship.active_effects.count(), 0, "active effects"); @@ -56,9 +56,9 @@ module TK.SpaceTac { drone.effects = [ new DamageEffect(5), - new AttributeEffect("skill_quantum", 1) + new AttributeEffect("precision", 1) ] - check.equals(drone.getDescription(), "While deployed:\n• do 5 damage\n• quantum skill +1"); + check.equals(drone.getDescription(), "While deployed:\n• do 5 damage\n• precision +1"); }); }); } diff --git a/src/core/Equipment.spec.ts b/src/core/Equipment.spec.ts deleted file mode 100644 index 87a918f..0000000 --- a/src/core/Equipment.spec.ts +++ /dev/null @@ -1,117 +0,0 @@ -module TK.SpaceTac.Specs { - testing("Equipment", test => { - test.case("generates a full name", check => { - let equipment = new Equipment(SlotType.Weapon, "rayofdeath"); - check.equals(equipment.getFullName(), "rayofdeath Mk1"); - - equipment.name = "Ray of Death"; - check.equals(equipment.getFullName(), "Ray of Death Mk1"); - - equipment.quality = EquipmentQuality.LEGENDARY; - check.equals(equipment.getFullName(), "Legendary Ray of Death Mk1"); - }); - - test.case("checks capabilities requirements", check => { - var equipment = new Equipment(); - var ship = new Ship(); - - check.equals(equipment.canBeEquipped(ship.attributes), true); - - equipment.requirements["skill_time"] = 2; - - check.equals(equipment.canBeEquipped(ship.attributes), false); - - TestTools.setAttribute(ship, "skill_time", 1); - - check.equals(equipment.canBeEquipped(ship.attributes), false); - - TestTools.setAttribute(ship, "skill_time", 2); - - check.equals(equipment.canBeEquipped(ship.attributes), true); - - TestTools.setAttribute(ship, "skill_time", 3); - - check.equals(equipment.canBeEquipped(ship.attributes), true); - - // Second requirement - equipment.requirements["skill_materials"] = 3; - - check.equals(equipment.canBeEquipped(ship.attributes), false); - - TestTools.setAttribute(ship, "skill_materials", 4); - - check.equals(equipment.canBeEquipped(ship.attributes), true); - }); - - test.case("generates a description of the effects", check => { - let equipment = new Equipment(); - check.equals(equipment.getEffectsDescription(), "does nothing"); - - let action = new TriggerAction(equipment, [new DamageEffect(50)], 1, 200, 0); - equipment.action = action; - check.equals(equipment.getEffectsDescription(), "Fire (power 1, range 200km):\n• do 50 damage on target"); - - action = new TriggerAction(equipment, [new DamageEffect(50)], 1, 200, 20); - equipment.action = action; - check.equals(equipment.getEffectsDescription(), "Fire (power 1, range 200km):\n• do 50 damage in 20km radius"); - - action = new TriggerAction(equipment, [ - new DamageEffect(50), - new StickyEffect(new AttributeLimitEffect("shield_capacity", 200), 3) - ], 1, 200, 0); - equipment.action = action; - check.equals(equipment.getEffectsDescription(), "Fire (power 1, range 200km):\n• do 50 damage on target\n• limit shield capacity to 200 for 3 turns on target"); - }); - - test.case("gets a minimal level, based on skills requirements", check => { - let equipment = new Equipment(); - check.equals(equipment.getMinimumLevel(), 1); - - equipment.requirements["skill_quantum"] = 10; - check.equals(equipment.getMinimumLevel(), 1); - - equipment.requirements["skill_time"] = 1; - check.equals(equipment.getMinimumLevel(), 2); - - equipment.requirements["skill_gravity"] = 2; - check.equals(equipment.getMinimumLevel(), 2); - - equipment.requirements["skill_antimatter"] = 4; - check.equals(equipment.getMinimumLevel(), 3); - }); - - test.case("weighs the price, taking wear into account", check => { - let equipment = new Equipment(); - check.equals(equipment.getPrice(), 0); - - equipment.price = 100; - check.equals(equipment.getPrice(), 100); - - equipment.addWear(1); - check.equals(equipment.getPrice(), 99); - - equipment.addWear(10); - check.equals(equipment.getPrice(), 97); - - equipment.addWear(89); - check.equals(equipment.getPrice(), 83); - - equipment.addWear(400); - check.equals(equipment.getPrice(), 50); - - equipment.addWear(12500); - check.equals(equipment.getPrice(), 3); - }); - - test.case("builds a full textual description", check => { - let equipment = new Equipment(); - equipment.name = "Super Equipment"; - equipment.requirements["skill_gravity"] = 2; - equipment.effects.push(new AttributeEffect("skill_time", 3)); - equipment.wear = 50; - - let result = equipment.getFullDescription(); - check.equals(result, "Second hand\n\nRequires:\n• gravity skill 2\n\nWhen equipped:\n• time skill +3"); - }); - }); -} diff --git a/src/core/Equipment.ts b/src/core/Equipment.ts deleted file mode 100644 index 5e85629..0000000 --- a/src/core/Equipment.ts +++ /dev/null @@ -1,180 +0,0 @@ -module TK.SpaceTac { - /** - * Quality of loot. - */ - export enum EquipmentQuality { - WEAK, - COMMON, - FINE, - PREMIUM, - LEGENDARY - } - - // Piece of equipment to attach in slots - export class Equipment extends RObject { - // Type of slot this equipment can fit in - slot_type: SlotType | null - - // Actual slot this equipment is attached to - attached_to: Slot | null = null - - // Identifiable equipment code (may be used by UI to customize visual effects) - code: string - - // Equipment name - name: string - - // Equipment generic description - description = "" - - // Indicative equipment level - level = 1 - - // Indicative equipment quality - quality = EquipmentQuality.COMMON - - // Base price - price = 0 - - // Minimum skills to be able to equip this - requirements: { [key: string]: number } = {} - - // Permanent effects on the ship that equips this - effects: BaseEffect[] = [] - - // Action available when equipped - action: BaseAction | null = null - - // Equipment wear due to usage in battles (will lower the sell price) - wear = 0 - - // Cooldown needed by the equipment - cooldown = new Cooldown() - - // Basic constructor - constructor(slot: SlotType | null = null, code = "equipment") { - super(); - - this.slot_type = slot; - this.code = code; - this.name = code; - } - - jasmineToString() { - return this.attached_to ? `${this.attached_to.ship.getName()} - ${this.name}` : this.name; - } - - /** - * Get the fully qualified name (e.g. "Level 4 Strong Ray of Death") - */ - getFullName(): string { - let name = this.name; - if (this.quality != EquipmentQuality.COMMON) { - name = capitalize(EquipmentQuality[this.quality].toLowerCase()) + " " + name; - } - return `${name} Mk${this.level}`; - } - - /** - * Get the full textual description for this equipment (without the full name). - */ - getFullDescription(): string { - let requirements: string[] = []; - iteritems(this.requirements, (skill, value) => { - if (isShipAttribute(skill) && value > 0) { - requirements.push(`• ${SHIP_VALUES_NAMES[skill]} ${value}`); - } - }); - - let description = this.getEffectsDescription(); - if (this.description) { - description += "\n\n" + this.description; - } - if (requirements.length > 0) { - description = "Requires:\n" + requirements.join("\n") + "\n\n" + description; - } - if (this.cooldown.overheat > 0) { - description = `${this.cooldown}\n\n${description}`; - } - if (this.wear > 0) { - description = (this.wear >= 100 ? "Worn" : "Second hand") + "\n\n" + description; - } - return description; - } - - /** - * Get the minimum level at which the requirements in skill may be fulfilled. - * - * This is informative and is not directly enforced. It will only be enforced by skills requirements. - */ - getMinimumLevel(): number { - let points = sum(values(this.requirements)); - return ShipLevel.getLevelForPoints(points); - } - - /** - * Get the equipment price value. - */ - getPrice(): number { - return Math.floor(this.price * 500 / (500 + this.wear)); - } - - /** - * Returns true if the equipment can be equipped on a ship with given skills. - * - * This checks *requirements* against the effective (modified) skills. - * - * This does not check where the equipment currently is (except if is it already attached and should be detached first). - */ - canBeEquipped(skills: ShipAttributes, check_unattached = true): boolean { - if (check_unattached && this.attached_to) { - return false; - } else { - var able = true; - iteritems(this.requirements, (attr, minvalue) => { - if (isShipAttribute(attr) && skills[attr].get() < minvalue) { - able = false; - } - }); - return able; - } - } - - /** - * Detach from the slot it is attached to - */ - detach(): void { - if (this.attached_to) { - this.attached_to.attached = null; - this.attached_to = null; - } - } - - /** - * Get a human readable description of the effects of this equipment - */ - getEffectsDescription(): string { - let parts: string[] = []; - - if (this.effects.length > 0) { - parts.push(["When equipped:"].concat(this.effects.map(effect => "• " + effect.getDescription())).join("\n")); - } - - if (this.action) { - let action_desc = this.action.getEffectsDescription(); - if (action_desc != "") { - parts.push(action_desc); - } - } - - return parts.length > 0 ? parts.join("\n\n") : "does nothing"; - } - - /** - * Add equipment wear - */ - addWear(factor: number): void { - this.wear += factor; - } - } -} diff --git a/src/core/Fleet.spec.ts b/src/core/Fleet.spec.ts index 0b51652..94fc765 100644 --- a/src/core/Fleet.spec.ts +++ b/src/core/Fleet.spec.ts @@ -164,40 +164,5 @@ module TK.SpaceTac { ship4.setDead(); check.equals(fleet.isAlive(), false); }); - - test.case("adds cargo in first empty slot", check => { - let fleet = new Fleet(); - let ship1 = fleet.addShip(); - ship1.cargo_space = 1; - let ship2 = fleet.addShip(); - ship2.cargo_space = 2; - - check.equals(ship1.cargo, []); - check.equals(ship2.cargo, []); - - let equipment1 = new Equipment(); - let result = fleet.addCargo(equipment1); - check.equals(result, true); - check.equals(ship1.cargo, [equipment1]); - check.equals(ship2.cargo, []); - - let equipment2 = new Equipment(); - result = fleet.addCargo(equipment2); - check.equals(result, true); - check.equals(ship1.cargo, [equipment1]); - check.equals(ship2.cargo, [equipment2]); - - let equipment3 = new Equipment(); - result = fleet.addCargo(equipment3); - check.equals(result, true); - check.equals(ship1.cargo, [equipment1]); - check.equals(ship2.cargo, [equipment2, equipment3]); - - let equipment4 = new Equipment(); - result = fleet.addCargo(equipment4); - check.equals(result, false); - check.equals(ship1.cargo, [equipment1]); - check.equals(ship2.cargo, [equipment2, equipment3]); - }); }); } diff --git a/src/core/Fleet.ts b/src/core/Fleet.ts index 1c0281c..bce1616 100644 --- a/src/core/Fleet.ts +++ b/src/core/Fleet.ts @@ -145,19 +145,5 @@ module TK.SpaceTac { return any(this.ships, ship => ship.alive); } } - - /** - * Add an equipment to the first available cargo slot - * - * Returns true on success, false if no empty cargo slot was available. - */ - addCargo(equipment: Equipment): boolean { - let ship = first(this.ships, ship => ship.getFreeCargoSpace() > 0); - if (ship) { - return ship.addCargo(equipment); - } else { - return false; - } - } } } diff --git a/src/core/FleetGenerator.ts b/src/core/FleetGenerator.ts index 2e47981..f9dddca 100644 --- a/src/core/FleetGenerator.ts +++ b/src/core/FleetGenerator.ts @@ -15,7 +15,7 @@ module TK.SpaceTac { var fleet = new Fleet(player); var ship_generator = new ShipGenerator(this.random); - let models = this.random.sample(ShipModel.getDefaultCollection(), ship_count); + let models = this.random.sample(BaseModel.getDefaultCollection(), ship_count); range(ship_count).forEach(i => { var ship = ship_generator.generate(level, models[i] || null, upgrade); diff --git a/src/core/GameSession.spec.ts b/src/core/GameSession.spec.ts index 0ad1b7b..32cf2ec 100644 --- a/src/core/GameSession.spec.ts +++ b/src/core/GameSession.spec.ts @@ -52,11 +52,9 @@ module TK.SpaceTac.Specs { let battle = nn(session.getBattle()); battle.endBattle(session.player.fleet); - let spyloot = check.patch(nn(battle.outcome), "createLoot", null); session.setBattleEnded(); check.notequals(session.getBattle(), null); check.equals(location1.encounter, null); - check.called(spyloot, 1); // Defeat case location2.encounter = new Fleet(); @@ -66,11 +64,9 @@ module TK.SpaceTac.Specs { battle = nn(session.getBattle()); battle.endBattle(null); - spyloot = check.patch(nn(battle.outcome), "createLoot", null); session.setBattleEnded(); check.notequals(session.getBattle(), null); check.notequals(location2.encounter, null); - check.called(spyloot, 0); }); test.case("generates a new campaign", check => { diff --git a/src/core/GameSession.ts b/src/core/GameSession.ts index a8e86be..4ac96d6 100644 --- a/src/core/GameSession.ts +++ b/src/core/GameSession.ts @@ -152,11 +152,6 @@ module TK.SpaceTac { // Reset ships status iforeach(battle.iships(), ship => ship.restoreInitialState()); - // In case of victory for current player, generate loot - if (battle.outcome.winner == this.player.fleet) { - battle.outcome.createLoot(battle); - } - // If the battle happened in a star location, keep it informed let location = this.universe.getLocation(this.player.fleet.location); if (location) { diff --git a/src/core/LootGenerator.spec.ts b/src/core/LootGenerator.spec.ts deleted file mode 100644 index b97053a..0000000 --- a/src/core/LootGenerator.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -/// - -module TK.SpaceTac.Specs { - class TestTemplate extends LootTemplate { - constructor() { - super(SlotType.Shield, "Hexagrid Shield"); - - this.setSkillsRequirements({ "skill_time": istep(2) }); - } - } - - testing("LootGenerator", test => { - test.case("generates items within a given level range", check => { - var generator = new LootGenerator(); - generator.templates = [new TestTemplate()]; - generator.random = new SkewedRandomGenerator([0.5]); - - var equipment = generator.generate(2); - if (equipment) { - check.same(equipment.slot_type, SlotType.Shield); - check.equals(equipment.name, "Hexagrid Shield"); - check.equals(equipment.requirements, { "skill_time": 3 }); - } else { - check.fail("No equipment generated"); - } - }); - }); -} diff --git a/src/core/LootGenerator.ts b/src/core/LootGenerator.ts deleted file mode 100644 index f6cb341..0000000 --- a/src/core/LootGenerator.ts +++ /dev/null @@ -1,79 +0,0 @@ -module TK.SpaceTac { - /** - * Equipment generator from loot templates - * - * Loot templates are automatically populated from the "SpaceTac.Equipments" namespace - */ - export class LootGenerator { - // List of available templates - templates: LootTemplate[] - - // Random generator that will be used - random: RandomGenerator - - // Filter to select a subset of templates - templatefilter: (template: LootTemplate) => boolean - - constructor(random = RandomGenerator.global, populate: boolean = true) { - this.templates = []; - this.random = random; - this.templatefilter = () => true; - - if (populate) { - this.populate(); - } - } - - /** - * Set the template filter for next generations - */ - setTemplateFilter(filter: (template: LootTemplate) => boolean) { - this.templatefilter = filter; - } - - // Fill the list of templates - populate(): void { - let templates: LootTemplate[] = []; - let namespace: any = TK.SpaceTac.Equipments; - for (var template_name in namespace) { - if (template_name && template_name.indexOf("Abstract") != 0) { - let template_class = namespace[template_name]; - let template: LootTemplate = new template_class(); - templates.push(template); - } - } - this.templates = templates; - } - - // Generate a random equipment for a specific level - // If slot is specified, it will generate an equipment for this slot type specifically - // If no equipment could be generated from available templates, null is returned - generate(level: number, quality = EquipmentQuality.COMMON, slot: SlotType | null = null): Equipment | null { - // Generate equipments matching conditions, with each template - let templates = this.templates.filter(this.templatefilter).filter(template => slot == null || slot == template.slot); - let equipments = templates.map(template => template.generate(level, quality, this.random)); - - // No equipment could be generated with given conditions - if (equipments.length === 0) { - return null; - } - - // Pick a random equipment - return this.random.choice(equipments); - } - - /** - * Generate a random equipment of highest level, from a given set of skills - */ - generateHighest(skills: ShipSkills, quality = EquipmentQuality.COMMON, slot: SlotType | null = null): Equipment | null { - let templates = this.templates.filter(this.templatefilter).filter(template => slot == null || slot == template.slot); - let candidates = nna(templates.map(template => template.generateHighest(skills, quality, this.random))); - if (candidates.length) { - let chosen = this.random.weighted(candidates.map(equ => equ.level)); - return candidates[chosen]; - } else { - return null; - } - } - } -} diff --git a/src/core/LootQualityModifiers.ts b/src/core/LootQualityModifiers.ts deleted file mode 100644 index ed44fc4..0000000 --- a/src/core/LootQualityModifiers.ts +++ /dev/null @@ -1,112 +0,0 @@ -module TK.SpaceTac { - /** - * Modifiers of basic loot, to obtain different quality levels - */ - export class LootQualityModifiers { - /** - * Generic quality modifier - */ - static applyStandard(equipment: Equipment, quality: EquipmentQuality, random: RandomGenerator): boolean { - // Collect available modifiers - let modifiers: Function[] = []; - - let factor = 1; - if (quality == EquipmentQuality.WEAK) { - factor = 0.8; - } else if (quality == EquipmentQuality.FINE) { - factor = 1.1; - } else if (quality == EquipmentQuality.PREMIUM) { - factor = 1.3; - } else if (quality == EquipmentQuality.LEGENDARY) { - factor = 1.6; - } - - if (quality == EquipmentQuality.WEAK && any(values(equipment.requirements), value => value > 0)) { - modifiers.push(() => { - iteritems(copy(equipment.requirements), (skill, value) => { - equipment.requirements[skill] = Math.max(equipment.requirements[skill] + 1, Math.floor(equipment.requirements[skill] / factor)); - }); - }); - } - - function simpleFactor(obj: T, attr: keyof T, inverse = false) { - let val = obj[attr]; - if (val && val != 0) { - let nval = Math.round((inverse ? (1 / factor) : factor) * val); - if (nval != val) { - modifiers.push(() => (obj)[attr] = nval); - } - } - } - - function effectFactor(effect: BaseEffect) { - if (effect instanceof ValueEffect) { - simpleFactor(effect, 'value_on'); - simpleFactor(effect, 'value_off'); - simpleFactor(effect, 'value_start'); - simpleFactor(effect, 'value_end'); - } else if (effect instanceof AttributeEffect || effect instanceof AttributeMultiplyEffect) { - simpleFactor(effect, 'value'); - } else if (effect instanceof AttributeLimitEffect) { - simpleFactor(effect, 'value', true); - } else if (effect instanceof StickyEffect) { - simpleFactor(effect, 'duration'); - effectFactor(effect.base); - } else if (effect instanceof DamageEffect) { - simpleFactor(effect, 'base'); - simpleFactor(effect, 'span'); - } else if (effect instanceof RepelEffect) { - simpleFactor(effect, 'value'); - } else if (effect instanceof DamageModifierEffect) { - simpleFactor(effect, 'factor'); - } else if (effect instanceof ValueTransferEffect) { - simpleFactor(effect, 'amount'); - } else if (effect instanceof CooldownEffect) { - simpleFactor(effect, 'cooling'); - simpleFactor(effect, 'maxcount'); - } - } - - equipment.effects.forEach(effectFactor); - - if (equipment.action instanceof TriggerAction) { - simpleFactor(equipment.action, 'power', true); - simpleFactor(equipment.action, 'blast'); - simpleFactor(equipment.action, 'range'); - equipment.action.effects.forEach(effectFactor); - } - - if (equipment.action instanceof ToggleAction) { - simpleFactor(equipment.action, 'power', true); - simpleFactor(equipment.action, 'radius'); - equipment.action.effects.forEach(effectFactor); - } - - if (equipment.action instanceof DeployDroneAction) { - simpleFactor(equipment.action, 'deploy_distance'); - simpleFactor(equipment.action, 'drone_radius'); - equipment.action.drone_effects.forEach(effectFactor); - } - - if (equipment.action instanceof MoveAction) { - simpleFactor(equipment.action, 'distance_per_power'); - simpleFactor(equipment.action, 'maneuvrability_factor', true); - } - - if (equipment.cooldown.overheat) { - simpleFactor(equipment.cooldown, 'overheat', true); - simpleFactor(equipment.cooldown, 'cooling', true); - } - - // Choose a random one - if (modifiers.length > 0) { - let chosen = random.choice(modifiers); - chosen(); - equipment.price = Math.ceil(equipment.price * factor * factor); - return true; - } else { - return false; - } - } - } -} \ No newline at end of file diff --git a/src/core/LootTemplate.spec.ts b/src/core/LootTemplate.spec.ts deleted file mode 100644 index 2fe43f6..0000000 --- a/src/core/LootTemplate.spec.ts +++ /dev/null @@ -1,192 +0,0 @@ -/// - -module TK.SpaceTac.Specs { - class FakeEffect extends BaseEffect { - fakevalue: number - constructor(val = 5) { - super("fake"); - this.fakevalue = val; - } - } - - function strip(obj: T, attr: keyof T): any { - let result: any = {}; - copyfields(obj, result); - delete result[attr]; - return result; - } - - function strip_id(effect: RObject): any { - if (effect instanceof StickyEffect) { - let result = strip(effect, "id"); - result.base = strip_id(result.base); - return result; - } else { - return strip(effect, "id"); - } - } - - export function compare_effects(check: TestContext, effects1: BaseEffect[], effects2: BaseEffect[]): void { - check.equals(effects1.map(strip_id), effects2.map(strip_id), "effects"); - } - - export function compare_action(check: TestContext, action1: BaseAction | null, action2: BaseAction | null): void { - if (action1 === null || action2 === null) { - check.equals(action1, action2, "action"); - } else { - check.equals(strip_id(action1), strip_id(action2), "action"); - } - } - - export function compare_trigger_action(check: TestContext, action1: BaseAction | null, action2: TriggerAction | null): void { - if (action1 === null || action2 === null || !(action1 instanceof TriggerAction)) { - check.equals(action1, action2, "action"); - } else { - check.equals(strip_id(strip(action1, "effects")), strip_id(strip(action2, "effects")), "action"); - compare_effects(check, action1.effects, action2.effects); - } - } - - export function compare_toggle_action(check: TestContext, action1: BaseAction | null, action2: ToggleAction | null): void { - if (action1 === null || action2 === null || !(action1 instanceof ToggleAction)) { - check.equals(action1, action2, "action"); - } else { - check.equals(strip_id(strip(action1, "effects")), strip_id(strip(action2, "effects")), "action"); - compare_effects(check, action1.effects, action2.effects); - } - } - - export function compare_drone_action(check: TestContext, action1: BaseAction | null, action2: DeployDroneAction | null): void { - if (action1 === null || action2 === null || !(action1 instanceof DeployDroneAction)) { - check.equals(action1, action2, "action"); - } else { - check.equals(strip_id(strip(action1, "drone_effects")), strip_id(strip(action2, "drone_effects")), "action"); - compare_effects(check, action1.drone_effects, action2.drone_effects); - } - } - - testing("LootTemplate", test => { - test.case("generates equipment with correct information", check => { - let template = new LootTemplate(SlotType.Power, "Power Generator", "A great power generator !"); - let result = template.generate(2, EquipmentQuality.PREMIUM); - - check.equals(result.slot_type, SlotType.Power); - check.equals(result.code, "powergenerator"); - check.equals(result.name, "Power Generator"); - check.equals(result.price, 350); - check.equals(result.level, 2); - check.equals(result.quality, EquipmentQuality.COMMON); - check.equals(result.description, "A great power generator !"); - - template.addAttributeEffect("power_capacity", istep(10)); - result = template.generate(1, EquipmentQuality.COMMON); - check.equals(result.quality, EquipmentQuality.COMMON); - compare_effects(check, result.effects, [new AttributeEffect("power_capacity", 10)]); - result = template.generate(1, EquipmentQuality.PREMIUM); - check.equals(result.quality, EquipmentQuality.PREMIUM); - compare_effects(check, result.effects, [new AttributeEffect("power_capacity", 13)]); - }); - - test.case("applies requirements on skills", check => { - let template = new LootTemplate(SlotType.Hull, "Hull"); - template.setSkillsRequirements({ "skill_photons": istep(1), "skill_gravity": istep(2, istep(1)) }); - - let result = template.generate(1); - check.equals(result.requirements, { - "skill_photons": 1, - "skill_gravity": 2 - }); - - result = template.generate(2); - check.equals(result.requirements, { - "skill_photons": 2, - "skill_gravity": 3 - }); - - result = template.generate(10); - check.equals(result.requirements, { - "skill_photons": 10, - "skill_gravity": 47 - }); - }); - - test.case("applies cooldown", check => { - let template = new LootTemplate(SlotType.Weapon, "Weapon"); - template.setCooldown(istep(1), istep(2)); - - let result = template.generate(1); - check.equals(result.cooldown.overheat, 1); - check.equals(result.cooldown.cooling, 2); - - result = template.generate(2); - check.equals(result.cooldown.overheat, 2); - check.equals(result.cooldown.cooling, 3); - - result = template.generate(10); - check.equals(result.cooldown.overheat, 10); - check.equals(result.cooldown.cooling, 11); - }); - - test.case("applies attributes permenant effects", check => { - let template = new LootTemplate(SlotType.Shield, "Shield"); - template.addAttributeEffect("shield_capacity", irange(undefined, 50, 10)); - - let result = template.generate(1); - compare_effects(check, result.effects, [new AttributeEffect("shield_capacity", 50)]); - - result = template.generate(2); - compare_effects(check, result.effects, [new AttributeEffect("shield_capacity", 60)]); - }); - - test.case("adds move actions", check => { - let template = new LootTemplate(SlotType.Engine, "Engine"); - template.addMoveAction(irange(undefined, 100, 10), istep(50, irepeat(10)), irepeat(95)); - - let result = template.generate(1); - compare_action(check, result.action, new MoveAction(result, 100, 50, 95)); - - result = template.generate(2); - compare_action(check, result.action, new MoveAction(result, 110, 60, 95)); - }); - - test.case("adds fire actions", check => { - let template = new LootTemplate(SlotType.Weapon, "Weapon"); - template.addTriggerAction(istep(1), [ - new EffectTemplate(new FakeEffect(3), { "fakevalue": istep(8) }) - ], istep(100), istep(50), istep(10)); - - let result = template.generate(1); - compare_trigger_action(check, result.action, new TriggerAction(result, [new FakeEffect(8)], 1, 100, 50, 10)); - - result = template.generate(2); - compare_trigger_action(check, result.action, new TriggerAction(result, [new FakeEffect(9)], 2, 101, 51, 11)); - }); - - test.case("adds drone actions", check => { - let template = new LootTemplate(SlotType.Weapon, "Weapon"); - template.addDroneAction(istep(1), istep(100), istep(50), [ - new EffectTemplate(new FakeEffect(3), { "fakevalue": istep(8) }) - ]); - - let result = template.generate(1); - compare_drone_action(check, result.action, new DeployDroneAction(result, 1, 100, 50, [new FakeEffect(8)])); - - result = template.generate(2); - compare_drone_action(check, result.action, new DeployDroneAction(result, 2, 101, 51, [new FakeEffect(9)])); - }); - - test.case("checks the presence of damaging effects", check => { - let template = new LootTemplate(SlotType.Weapon, "Weapon"); - check.equals(template.hasDamageEffect(), false); - - template.addAttributeEffect("maneuvrability", irepeat(1)); - check.equals(template.hasDamageEffect(), false); - - template.addTriggerAction(irepeat(1), [new EffectTemplate(new BaseEffect("test"), {})], irepeat(50), irepeat(50)); - check.equals(template.hasDamageEffect(), false); - - template.addTriggerAction(irepeat(1), [new EffectTemplate(new DamageEffect(20), {})], irepeat(50), irepeat(50)); - check.equals(template.hasDamageEffect(), true); - }); - }); -} diff --git a/src/core/LootTemplate.ts b/src/core/LootTemplate.ts deleted file mode 100644 index 1419dea..0000000 --- a/src/core/LootTemplate.ts +++ /dev/null @@ -1,249 +0,0 @@ -module TK.SpaceTac { - /** - * A leveled value is an iterator yielding the desired value for each level (first item is for level 1, and so on) - */ - type LeveledValue = Iterator; - type LeveledModifiers = {[P in keyof T]?: LeveledValue } - - /** - * Modifiers of generated equipment - */ - type QualityModifier = (equipment: Equipment, quality: EquipmentQuality, random: RandomGenerator) => boolean; - type CommonModifier = (equipment: Equipment, level: number) => void; - - /** - * Resolve a leveled value - */ - function resolveForLevel(value: LeveledValue, level: number): number { - let lvalue = iat(value, level - 1) || 0; - return Math.floor(lvalue); - } - - /** - * Balanced generic leveled value - */ - export function leveled(base: number, increment = base * 0.4, exponent = 0.2): LeveledValue { - return istep(base, istep(increment, irepeat(increment * exponent))); - } - - /** - * Template used to generate a BaseEffect for a given ship level - */ - export class EffectTemplate { - // Basic instance of the effect - effect: T; - - // Effect value modifiers - modifiers: [keyof T, LeveledValue][]; - - constructor(effect: T, modifiers: LeveledModifiers) { - this.effect = effect; - this.modifiers = []; - - iteritems(modifiers, (key, value) => { - if (effect.hasOwnProperty(key) && value) { - this.addModifier(key, value); - } - }); - } - - // Add a value modifier for the effect - addModifier(name: keyof T, value: LeveledValue) { - this.modifiers.push([name, value]); - } - - // Generate an effect with a given level - generate(level: number): T { - let result = copy(this.effect); - this.modifiers.forEach(modifier => { - let [name, value] = modifier; - result[name] = resolveForLevel(value, level); - }); - return result; - } - } - - /** - * Template used to generate a BaseEffect for a given ship level - */ - export class StickyEffectTemplate extends EffectTemplate { - duration: LeveledValue; - - constructor(effect: T, modifiers: { [attr: string]: LeveledValue }, duration: LeveledValue) { - super(effect, modifiers); - - this.duration = duration; - } - - generate(level: number): StickyEffect { - let result = copy(this.effect); - this.modifiers.forEach(modifier => { - let [name, value] = modifier; - (result)[name] = resolveForLevel(value, level); - }); - return new StickyEffect(result, resolveForLevel(this.duration, level)); - } - } - - /** - * Template used to generate a loot equipment - */ - export class LootTemplate { - // Type of slot this equipment will fit in - slot: SlotType - - // Base name that will be given to generated equipment - name: string - - // Generic description of the equipment - description: string - - // Base price - price: LeveledValue - - // Modifiers applied to obtain the "common" equipment, based on level - protected base_modifiers: CommonModifier[] - - // Modifiers applied to "common" equipment to obtain a specific quality - protected quality_modifiers: QualityModifier[] - - constructor(slot: SlotType, name: string, description = "", base_price = 100) { - this.slot = slot; - this.name = name; - this.description = description; - this.price = leveled(base_price, base_price * 2.5, 1); - this.base_modifiers = []; - this.quality_modifiers = [LootQualityModifiers.applyStandard]; - } - - /** - * Generate a new equipment of a given level and quality - */ - generate(level: number, quality = EquipmentQuality.COMMON, random = RandomGenerator.global): Equipment { - let result = new Equipment(this.slot, (this.name || "").toLowerCase().replace(/ /g, "")); - - result.level = level; - result.name = this.name; - result.description = this.description; - result.price = resolveForLevel(this.price, level); - - this.base_modifiers.forEach(modifier => modifier(result, level)); - - if (quality == EquipmentQuality.COMMON) { - result.quality = quality; - } else { - let quality_applied = this.quality_modifiers.map(modifier => modifier(result, quality, random)); - result.quality = any(quality_applied, x => x) ? quality : EquipmentQuality.COMMON; - } - - return result; - } - - /** - * Generate the highest equipment level, for a given set of skills - */ - generateHighest(skills: ShipSkills, quality = EquipmentQuality.COMMON, random = RandomGenerator.global): Equipment | null { - let level = 1; - let equipment: Equipment | null = null; - let attributes = new ShipAttributes(); - keys(skills).forEach(skill => attributes[skill].addModifier(skills[skill].get())); - do { - let nequipment = this.generate(level, quality, random); - if (nequipment.canBeEquipped(attributes)) { - equipment = nequipment; - } else { - break; - } - level += 1; - } while (level < 100); - return equipment; - } - - /** - * Set skill requirements that will be added to each level of equipment. - */ - setSkillsRequirements(skills: { [skill: string]: LeveledValue }): void { - this.base_modifiers.push((equipment, level) => { - iteritems(skills, (skill, value) => { - let resolved = resolveForLevel(value, level); - if (resolved > 0) { - equipment.requirements[skill] = (equipment.requirements[skill] || 0) + resolved; - } - }); - }); - } - - /** - * Set the overheat/cooldown - */ - setCooldown(overheat: LeveledValue, cooldown: LeveledValue): void { - this.base_modifiers.push((equipment, level) => { - equipment.cooldown.configure(resolveForLevel(overheat, level), resolveForLevel(cooldown, level)); - }); - } - - /** - * Add a permanent attribute effect, when the item is equipped. - */ - addAttributeEffect(attribute: keyof ShipAttributes, value: LeveledValue): void { - this.base_modifiers.push((equipment, level) => { - let resolved = resolveForLevel(value, level); - if (resolved != 0) { - equipment.effects.push(new AttributeEffect(attribute, resolved)); - } - }); - } - - /** - * Add a move action. - */ - addMoveAction(distance_per_power: LeveledValue, safety_distance: LeveledValue = irepeat(120), maneuvrability_factor: LeveledValue = irepeat(80)): void { - this.base_modifiers.push((equipment, level) => { - equipment.action = new MoveAction(equipment, resolveForLevel(distance_per_power, level), resolveForLevel(safety_distance, level), resolveForLevel(maneuvrability_factor, level)); - }); - } - - /** - * Add a trigger action. - */ - addTriggerAction(power: LeveledValue, effects: EffectTemplate[], range: LeveledValue = irepeat(0), blast: LeveledValue = irepeat(0), angle: LeveledValue = irepeat(0), aim: LeveledValue = irepeat(0), evasion: LeveledValue = irepeat(0), luck: LeveledValue = irepeat(0)): void { - this.base_modifiers.push((equipment, level) => { - let reffects = effects.map(effect => effect.generate(level)); - equipment.action = new TriggerAction(equipment, reffects, resolveForLevel(power, level), resolveForLevel(range, level), resolveForLevel(blast, level), resolveForLevel(angle, level), resolveForLevel(aim, level), resolveForLevel(evasion, level), resolveForLevel(luck, level)); - }); - } - - /** - * Add a deploy drone action. - */ - addDroneAction(power: LeveledValue, range: LeveledValue, radius: LeveledValue, effects: EffectTemplate[]): void { - this.base_modifiers.push((equipment, level) => { - let reffects = effects.map(effect => effect.generate(level)); - equipment.action = new DeployDroneAction(equipment, resolveForLevel(power, level), resolveForLevel(range, level), resolveForLevel(radius, level), reffects); - }); - } - - /** - * Add a toggle action. - */ - addToggleAction(power: LeveledValue, radius: LeveledValue, effects: EffectTemplate[]): void { - this.base_modifiers.push((equipment, level) => { - let reffects = effects.map(effect => effect.generate(level)); - equipment.action = new ToggleAction(equipment, resolveForLevel(power, level), resolveForLevel(radius, level), reffects); - }); - } - - /** - * Check if the template has any damage effect (to know if is an offensive weapon) - */ - hasDamageEffect(): boolean { - let example = this.generate(1); - let action = example.action; - if (action instanceof TriggerAction || action instanceof DeployDroneAction) { - return any(action.effects, effect => effect instanceof DamageEffect || (effect instanceof StickyEffect && effect.base instanceof DamageEffect)); - } else { - return false; - } - } - } -} diff --git a/src/core/MoveFireSimulator.spec.ts b/src/core/MoveFireSimulator.spec.ts index 5a90329..1964b27 100644 --- a/src/core/MoveFireSimulator.spec.ts +++ b/src/core/MoveFireSimulator.spec.ts @@ -3,9 +3,9 @@ module TK.SpaceTac.Specs { function simpleWeaponCase(distance = 10, ship_ap = 5, weapon_ap = 3, engine_distance = 5): [Ship, MoveFireSimulator, BaseAction] { let ship = new Ship(); - TestTools.setShipAP(ship, ship_ap); + TestTools.setShipModel(ship, 100, 0, ship_ap); TestTools.addEngine(ship, engine_distance); - let action = new TriggerAction(new Equipment(), [], weapon_ap, distance); + let action = new TriggerAction("weapon", { power: weapon_ap, range: distance }); let simulator = new MoveFireSimulator(ship); return [ship, simulator, action]; } @@ -21,7 +21,6 @@ module TK.SpaceTac.Specs { let engine4 = TestTools.addEngine(ship, 70); let best = simulator.findBestEngine(); check.same(best, engine3); - check.equals((nn(best).action).distance_per_power, 150); }); test.case("fires directly when in range", check => { @@ -65,7 +64,7 @@ module TK.SpaceTac.Specs { check.same(result.can_fire, true, 'can_fire'); check.same(result.total_fire_ap, 3, 'total_fire_ap'); - let move_action = ship.listEquipment(SlotType.Engine)[0].action; + let move_action = ship.actions.listAll().filter(action => action instanceof MoveAction)[0]; check.equals(result.parts, [ { action: move_action, target: new Target(ship.arena_x + 5, ship.arena_y, null), ap: 1, possible: true }, { action: action, target: new Target(ship.arena_x + 15, ship.arena_y, null), ap: 3, possible: true } @@ -111,7 +110,7 @@ module TK.SpaceTac.Specs { let battle = new Battle(); battle.fleets[0].addShip(ship); let ship1 = battle.fleets[0].addShip(); - let moveaction = nn(simulator.findBestEngine()).action; + let moveaction = nn(simulator.findBestEngine()); (moveaction).safety_distance = 30; battle.ship_separation = 30; @@ -143,7 +142,7 @@ module TK.SpaceTac.Specs { check.same(result.can_fire, false, 'can_fire'); check.same(result.total_fire_ap, 2, 'total_fire_ap'); - let move_action = ship.listEquipment(SlotType.Engine)[0].action; + let move_action = ship.actions.listAll().filter(action => action instanceof MoveAction)[0]; check.equals(result.parts, [ { action: move_action, target: new Target(ship.arena_x + 10, ship.arena_y, null), ap: 2, possible: true }, { action: action, target: new Target(ship.arena_x + 18, ship.arena_y, null), ap: 2, possible: false } @@ -152,7 +151,7 @@ module TK.SpaceTac.Specs { test.case("does nothing if trying to move in the same spot", check => { let [ship, simulator, action] = simpleWeaponCase(); - let move_action = nn(ship.listEquipment(SlotType.Engine)[0].action) + let move_action = ship.actions.listAll().filter(action => action instanceof MoveAction)[0]; let result = simulator.simulateAction(move_action, new Target(ship.arena_x, ship.arena_y, null)); check.equals(result.success, false); check.equals(result.need_move, false); diff --git a/src/core/MoveFireSimulator.ts b/src/core/MoveFireSimulator.ts index a2dd89c..6d1d6c2 100644 --- a/src/core/MoveFireSimulator.ts +++ b/src/core/MoveFireSimulator.ts @@ -53,14 +53,14 @@ module TK.SpaceTac { } /** - * Find the best available engine for moving + * Find the best available move action */ - findBestEngine(): Equipment | null { - let engines = this.ship.listEquipment(SlotType.Engine); - if (engines.length == 0) { + findBestEngine(): MoveAction | null { + let actions = this.ship.actions.listAll().filter(action => action instanceof MoveAction); + if (actions.length == 0) { return null; } else { - return maxBy(engines, engine => (engine.action instanceof MoveAction) ? engine.action.getDistanceByActionPoint(this.ship) : 0); + return maxBy(actions, action => action.getDistanceByActionPoint(this.ship)); } } @@ -141,9 +141,9 @@ module TK.SpaceTac { } } else { let engine = this.findBestEngine(); - if (engine && engine.action instanceof MoveAction) { + if (engine) { let approach_radius = action.getRangeRadius(this.ship); - let approach = this.getApproach(engine.action, target, approach_radius, move_margin); + let approach = this.getApproach(engine, target, approach_radius, move_margin); if (approach instanceof Target) { result.need_move = true; move_target = approach; @@ -162,13 +162,13 @@ module TK.SpaceTac { // Check move AP if (result.need_move && move_target) { let engine = this.findBestEngine(); - if (engine && engine.action) { - result.total_move_ap = engine.action.getActionPointsUsage(this.ship, move_target); + if (engine) { + result.total_move_ap = engine.getActionPointsUsage(this.ship, move_target); result.can_move = ap > 0; result.can_end_move = result.total_move_ap <= ap; result.move_location = move_target; // TODO Split in "this turn" part and "next turn" part if needed - result.parts.push({ action: engine.action, target: move_target, ap: result.total_move_ap, possible: result.can_move }); + result.parts.push({ action: engine, target: move_target, ap: result.total_move_ap, possible: result.can_move }); ap -= result.total_move_ap; } diff --git a/src/core/Ship.spec.ts b/src/core/Ship.spec.ts index b289bf5..ccf81ba 100644 --- a/src/core/Ship.spec.ts +++ b/src/core/Ship.spec.ts @@ -5,7 +5,7 @@ module TK.SpaceTac.Specs { check.equals(ship.getName(false), "Ship"); check.equals(ship.getName(true), "Level 1 Ship"); - ship.model = new ShipModel("test", "Hauler"); + ship.model = new BaseModel("test", "Hauler"); check.equals(ship.getName(false), "Hauler"); check.equals(ship.getName(true), "Level 1 Hauler"); @@ -34,56 +34,17 @@ module TK.SpaceTac.Specs { check.nears(ship.arena_angle, 1.2); }); - test.case("lists available actions from attached equipment", check => { - var ship = new Ship(null, "Test"); - var actions: BaseAction[]; - var slot: Slot; - var equipment: Equipment; + test.case("applies permanent effects of ship model on attributes", check => { + let model = new BaseModel(); + let ship = new Ship(null, null, model); - actions = ship.getAvailableActions(); - check.equals(actions.length, 1); - check.equals(actions[0].code, "endturn"); - - slot = ship.addSlot(SlotType.Engine); - equipment = new Equipment(slot.type); - equipment.action = new MoveAction(equipment); - slot.attach(equipment); - - slot = ship.addSlot(SlotType.Weapon); - equipment = new Equipment(slot.type); - slot.attach(equipment); - - slot = ship.addSlot(SlotType.Power); - equipment = new Equipment(slot.type); - equipment.action = new TriggerAction(equipment); - slot.attach(equipment); - - actions = ship.getAvailableActions(); - check.equals(actions.length, 3); - check.equals(actions[0].code, "move"); - check.equals(actions[1].code, "fire-equipment"); - check.equals(actions[2].code, "endturn"); - }); - - test.case("applies permanent effects of equipments on attributes", check => { - var ship = new Ship(null, "Test"); - var slot: Slot; - var equipment: Equipment; - - slot = ship.addSlot(SlotType.Power); - equipment = new Equipment(); - equipment.slot_type = slot.type; - equipment.effects.push(new AttributeEffect("power_capacity", 4)); - slot.attach(equipment); - - slot = ship.addSlot(SlotType.Power); - equipment = new Equipment(); - equipment.slot_type = slot.type; - equipment.effects.push(new AttributeEffect("power_capacity", 5)); - slot.attach(equipment); + check.patch(model, "getEffects", () => [ + new AttributeEffect("power_capacity", 4), + new AttributeEffect("power_capacity", 5), + ]); ship.updateAttributes(); - check.equals(ship.attributes.power_capacity.get(), 9); + check.equals(ship.getAttribute("power_capacity"), 9); }); test.case("repairs hull and recharges shield", check => { @@ -120,38 +81,6 @@ module TK.SpaceTac.Specs { check.equals(ship.isAbleToPlay(false), false); }); - test.case("counts attached equipment", check => { - var ship = new Ship(); - - check.equals(ship.getEquipmentCount(), 0); - - ship.addSlot(SlotType.Hull).attach(new Equipment(SlotType.Hull)); - ship.addSlot(SlotType.Shield); - ship.addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon)); - - check.equals(ship.getEquipmentCount(), 2); - }); - - test.case("can pick a random attached equipment", check => { - var ship = new Ship(); - - check.equals(ship.getRandomEquipment(), null); - - ship.addSlot(SlotType.Hull).attach(new Equipment(SlotType.Hull)); - ship.addSlot(SlotType.Shield); - ship.addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon)); - - var random = new SkewedRandomGenerator([0.2]); - var picked = ship.getRandomEquipment(random); - check.notequals(picked, null); - check.same(picked, ship.slots[0].attached); - - random = new SkewedRandomGenerator([0.999999]); - picked = ship.getRandomEquipment(random); - check.notequals(picked, null); - check.same(picked, ship.slots[2].attached); - }); - test.case("checks if a ship is inside a given circle", check => { let ship = new Ship(); ship.arena_x = 5; @@ -166,159 +95,21 @@ module TK.SpaceTac.Specs { check.equals(ship.isInCircle(12, -4, 5), false); }); - test.case("stores items in cargo space", check => { - let ship = new Ship(); - let equipment1 = new Equipment(); - let equipment2 = new Equipment(); - - let result = ship.addCargo(equipment1); - check.equals(result, false); - check.equals(ship.cargo, []); - check.equals(ship.getFreeCargoSpace(), 0); - - ship.setCargoSpace(1); - check.equals(ship.getFreeCargoSpace(), 1); - - result = ship.addCargo(equipment1); - check.equals(result, true); - check.equals(ship.cargo, [equipment1]); - check.equals(ship.getFreeCargoSpace(), 0); - - result = ship.addCargo(equipment1); - check.equals(result, false); - check.equals(ship.cargo, [equipment1]); - - result = ship.addCargo(equipment2); - check.equals(result, false); - check.equals(ship.cargo, [equipment1]); - - ship.setCargoSpace(2); - check.equals(ship.getFreeCargoSpace(), 1); - - result = ship.addCargo(equipment2); - check.equals(result, true); - check.equals(ship.cargo, [equipment1, equipment2]); - check.equals(ship.getFreeCargoSpace(), 0); - - ship.setCargoSpace(1); - check.equals(ship.cargo, [equipment1]); - check.equals(ship.getFreeCargoSpace(), 0); - - ship.setCargoSpace(2); - check.equals(ship.cargo, [equipment1]); - check.equals(ship.getFreeCargoSpace(), 1); - }); - - test.case("equips items from cargo", check => { - let ship = new Ship(); - let equipment = new Equipment(SlotType.Weapon); - let slot = ship.addSlot(SlotType.Weapon); - check.equals(ship.listEquipment(), []); - - let result = ship.equip(equipment); - check.equals(result, false); - check.equals(ship.listEquipment(), []); - - ship.setCargoSpace(1); - ship.addCargo(equipment); - - result = ship.equip(equipment); - check.equals(result, true); - check.equals(ship.listEquipment(SlotType.Weapon), [equipment]); - check.equals(equipment.attached_to, slot); - }); - - test.case("removes equipped items", check => { - let ship = new Ship(); - let equipment = new Equipment(SlotType.Weapon); - let slot = ship.addSlot(SlotType.Weapon); - slot.attach(equipment); - - check.equals(ship.listEquipment(), [equipment]); - check.same(slot.attached, equipment); - check.same(equipment.attached_to, slot); - - let result = ship.unequip(equipment); - check.equals(result, false); - check.equals(ship.listEquipment(), [equipment]); - check.equals(ship.cargo, []); - - ship.setCargoSpace(10); - - result = ship.unequip(equipment); - check.equals(result, true); - check.equals(ship.listEquipment(), []); - check.equals(ship.cargo, [equipment]); - check.equals(slot.attached, null); - check.equals(equipment.attached_to, null); - - result = ship.unequip(equipment); - check.equals(result, false); - check.equals(ship.listEquipment(), []); - check.equals(ship.cargo, [equipment]); - }); - - test.case("checks equipment requirements", check => { - let ship = new Ship(); - let equipment = new Equipment(SlotType.Hull); - check.equals(ship.canEquip(equipment), null); - - ship.addSlot(SlotType.Engine); - check.equals(ship.canEquip(equipment), null); - - let slot = ship.addSlot(SlotType.Hull); - check.same(ship.canEquip(equipment), slot); - - equipment.requirements["skill_photons"] = 2; - check.equals(ship.canEquip(equipment), null); - - ship.upgradeSkill("skill_photons"); - check.equals(ship.canEquip(equipment), null); - - ship.upgradeSkill("skill_photons"); - check.same(ship.canEquip(equipment), slot); - - slot.attach(new Equipment(SlotType.Hull)); - check.equals(ship.canEquip(equipment), null); - }); - - test.case("allow skills upgrading from current level", check => { - let ship = new Ship(); - check.equals(ship.level.get(), 1); - check.equals(ship.getAvailableUpgradePoints(), 10); - - ship.level.forceLevel(2); - check.equals(ship.level.get(), 2); - check.equals(ship.getAvailableUpgradePoints(), 15); - - check.equals(ship.getAttribute("skill_photons"), 0); - ship.upgradeSkill("skill_photons"); - check.equals(ship.getAttribute("skill_photons"), 1); - - range(50).forEach(() => ship.upgradeSkill("skill_gravity")); - check.equals(ship.getAttribute("skill_photons"), 1); - check.equals(ship.getAttribute("skill_gravity"), 14); - check.equals(ship.getAvailableUpgradePoints(), 0); - - ship.updateAttributes(); - check.equals(ship.getAttribute("skill_photons"), 1); - check.equals(ship.getAttribute("skill_gravity"), 14); - }); - test.case("restores as new at the end of battle", check => { let ship = new Ship(); - TestTools.setShipHP(ship, 10, 20); - TestTools.setShipAP(ship, 5, 0); + TestTools.setShipModel(ship, 10, 20, 5); ship.setValue("hull", 5); ship.setValue("shield", 15); ship.setValue("power", 2); ship.active_effects.add(new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 12)); ship.updateAttributes(); - let action1 = new BaseAction(); - let action2 = new ToggleAction(new Equipment()); - action2.activated = true; - let action3 = new ToggleAction(new Equipment()); - check.patch(ship, "getAvailableActions", () => [action1, action2, action3]); + let action1 = new BaseAction("action1"); + ship.actions.addCustom(action1); + let action2 = new ToggleAction("action2"); + ship.actions.addCustom(action2); + ship.actions.toggle(action2, true); + let action3 = new ToggleAction("action3"); + ship.actions.addCustom(action3); check.in("before", check => { check.equals(ship.getValue("hull"), 5, "hull"); @@ -326,8 +117,8 @@ module TK.SpaceTac.Specs { check.equals(ship.getValue("power"), 2, "power"); check.equals(ship.active_effects.count(), 1, "effects count"); check.equals(ship.getAttribute("power_capacity"), 3, "power capacity"); - check.equals(action2.activated, true, "action 2 activation"); - check.equals(action3.activated, false, "action 3 activation"); + check.equals(ship.actions.isToggled(action2), true, "action 2 activation"); + check.equals(ship.actions.isToggled(action3), false, "action 3 activation"); }); ship.restoreInitialState(); @@ -338,8 +129,8 @@ module TK.SpaceTac.Specs { check.equals(ship.getValue("power"), 5, "power"); check.equals(ship.active_effects.count(), 0, "effects count"); check.equals(ship.getAttribute("power_capacity"), 5, "power capacity"); - check.equals(action2.activated, false, "action 2 activation"); - check.equals(action3.activated, false, "action 3 activation"); + check.equals(ship.actions.isToggled(action2), false, "action 2 activation"); + check.equals(ship.actions.isToggled(action3), false, "action 3 activation"); }); }); @@ -347,11 +138,8 @@ module TK.SpaceTac.Specs { let ship = new Ship(); check.equals(imaterialize(ship.ieffects()), []); - let equipment = ship.addSlot(SlotType.Engine).attach(new Equipment(SlotType.Engine)); - check.equals(imaterialize(ship.ieffects()), []); - let effect1 = new AttributeEffect("precision", 4); - equipment.effects.push(effect1); + check.patch(ship.model, "getEffects", () => [effect1]); check.equals(imaterialize(ship.ieffects()), [effect1]); let effect2 = new AttributeLimitEffect("precision", 2); @@ -361,22 +149,19 @@ module TK.SpaceTac.Specs { test.case("gets a textual description of an attribute", check => { let ship = new Ship(); - check.equals(ship.getAttributeDescription("skill_photons"), "Forces of light, and electromagnetic radiation"); + check.equals(ship.getAttributeDescription("maneuvrability"), "Ability to move first, fast and to evade weapons"); - let equipment = new Equipment(SlotType.Engine); - equipment.effects = [new AttributeEffect("skill_photons", 4)]; - equipment.name = "Photonic engine"; - ship.addSlot(SlotType.Engine).attach(equipment); - check.equals(ship.getAttribute("skill_photons"), 4); - check.equals(ship.getAttributeDescription("skill_photons"), "Forces of light, and electromagnetic radiation\n\nPhotonic engine Mk1: +4"); + check.patch(ship.model, "getEffects", () => [new AttributeEffect("maneuvrability", 4)]); + ship.updateAttributes(); + check.equals(ship.getAttribute("maneuvrability"), 4); + check.equals(ship.getAttributeDescription("maneuvrability"), "Ability to move first, fast and to evade weapons\n\nLevel 1 Ship: +4"); - ship.level.forceLevelUp(); - ship.upgradeSkill("skill_photons"); - ship.upgradeSkill("skill_photons"); - check.equals(ship.getAttributeDescription("skill_photons"), "Forces of light, and electromagnetic radiation\n\nLevelled up: +2\nPhotonic engine Mk1: +4"); + ship.active_effects.add(new StickyEffect(new AttributeLimitEffect("maneuvrability", 3))); + check.equals(ship.getAttributeDescription("maneuvrability"), "Ability to move first, fast and to evade weapons\n\nLevel 1 Ship: +4\nSticky effect: limit to 3"); - ship.active_effects.add(new StickyEffect(new AttributeLimitEffect("skill_photons", 3))); - check.equals(ship.getAttributeDescription("skill_photons"), "Forces of light, and electromagnetic radiation\n\nLevelled up: +2\nPhotonic engine Mk1: +4\n???: limit to 3"); + ship.active_effects.remove(ship.active_effects.list()[0]); + ship.active_effects.add(new AttributeEffect("maneuvrability", -1)); + check.equals(ship.getAttributeDescription("maneuvrability"), "Ability to move first, fast and to evade weapons\n\nLevel 1 Ship: +4\nActive effect: -1"); }); test.case("produces death diffs", check => { @@ -388,20 +173,18 @@ module TK.SpaceTac.Specs { new ShipDeathDiff(battle, ship), ]); - let effect1 = ship.active_effects.add(new AttributeEffect("skill_quantum", 2)); - let effect2 = ship.active_effects.add(new StickyEffect(new AttributeEffect("skill_materials", 4))); - let weapon1 = TestTools.addWeapon(ship); - weapon1.action = new ToggleAction(weapon1, 3); - let weapon2 = TestTools.addWeapon(ship); - let action = weapon2.action = new ToggleAction(weapon2, 3); - action.activated = true; + let effect1 = ship.active_effects.add(new AttributeEffect("precision", 2)); + let effect2 = ship.active_effects.add(new StickyEffect(new AttributeLimitEffect("maneuvrability", 1))); + let action1 = ship.actions.addCustom(new ToggleAction("weapon1", { power: 3 })); + let action2 = ship.actions.addCustom(new ToggleAction("weapon2", { power: 3 })); + ship.actions.toggle(action2, true); check.equals(ship.getDeathDiffs(battle), [ new ShipEffectRemovedDiff(ship, effect1), - new ShipAttributeDiff(ship, "skill_quantum", {}, { cumulative: 2 }), + new ShipAttributeDiff(ship, "precision", {}, { cumulative: 2 }), new ShipEffectRemovedDiff(ship, effect2), - new ShipAttributeDiff(ship, "skill_materials", {}, { cumulative: 4 }), - new ShipActionToggleDiff(ship, action, false), + new ShipAttributeDiff(ship, "maneuvrability", {}, { limit: 1 }), + new ShipActionToggleDiff(ship, action2, false), new ShipValueDiff(ship, "hull", -1), new ShipDeathDiff(battle, ship), ]); diff --git a/src/core/Ship.ts b/src/core/Ship.ts index c7d7977..62333fb 100644 --- a/src/core/Ship.ts +++ b/src/core/Ship.ts @@ -5,19 +5,18 @@ module TK.SpaceTac { * A single ship in a fleet */ export class Ship extends RObject { + // Ship model + model: BaseModel + // Fleet this ship is a member of fleet: Fleet // Level of this ship level = new ShipLevel() - skills = new ShipSkills() // Name of the ship, null if unimportant name: string | null - // Code of the ShipModel used to create it - model: ShipModel - // Flag indicating if the ship is alive alive: boolean @@ -31,16 +30,12 @@ module TK.SpaceTac { // Facing direction in the arena arena_angle: number - // Active effects (sticky or area) + // Available actions + actions = new ActionList() + + // Active effects (sticky, self or area) active_effects = new RObjectContainer() - // List of slots, able to contain equipment - slots: Slot[] - - // Cargo - cargo_space: number = 0 - cargo: Equipment[] = [] - // Ship attributes attributes = new ShipAttributes() @@ -53,27 +48,27 @@ module TK.SpaceTac { // Boolean set to true if the ship is currently playing its turn playing = false - // Priority in play_order - play_priority = 0; + // Priority in current battle's play_order (used as sort key) + play_priority = 0 // Create a new ship inside a fleet - constructor(fleet: Fleet | null = null, name: string | null = null, model = new ShipModel("default", "Ship", 1, 0, false, 0)) { + constructor(fleet: Fleet | null = null, name: string | null = null, model = new BaseModel()) { super(); this.fleet = fleet || new Fleet(); this.name = name; this.alive = true; - this.slots = []; this.arena_x = 0; this.arena_y = 0; this.arena_angle = 0; - this.fleet.addShip(this); - this.model = model; - this.setCargoSpace(model.cargo); - model.slots.forEach(slot => this.addSlot(slot)); + + this.updateAttributes(); + this.actions.updateFromShip(this); + + this.fleet.addShip(this); } /** @@ -112,7 +107,7 @@ module TK.SpaceTac { // String repr jasmineToString(): string { - return "Ship " + this.name; + return this.getName(); } // Make an initiative throw, to resolve play order in a battle @@ -134,63 +129,43 @@ module TK.SpaceTac { return player.is(this.fleet.player); } - // get the current battle this ship is engaged in + /** + * Get the battle this ship is currently engaged in + */ getBattle(): Battle | null { return this.fleet.battle; } /** - * Get the list of actions available - * - * This list does not filter out actions unavailable due to insufficient AP, it only filters out actions that - * are not allowed/available at all on the ship + * Get the list of activated upgrades */ - getAvailableActions(): BaseAction[] { - var actions: BaseAction[] = []; + getUpgrades(): ModelUpgrade[] { + return this.model.getActivatedUpgrades(this.level.get(), this.level.getUpgrades()); + } - if (this.alive) { - let slots = [SlotType.Engine, SlotType.Power, SlotType.Hull, SlotType.Shield, SlotType.Weapon]; - slots.forEach(slot => { - this.listEquipment(slot).forEach(equipment => { - if (equipment.action) { - actions.push(equipment.action) - } - }); - }); + /** + * Toggle an upgrade + */ + activateUpgrade(upgrade: ModelUpgrade, on: boolean): void { + if (on && (upgrade.cost || 0) > this.getAvailableUpgradePoints()) { + return; } - - actions.push(EndTurnAction.SINGLETON); - return actions; + this.level.activateUpgrade(upgrade, on); + this.updateAttributes(); + this.actions.updateFromShip(this); } - /** - * Get an available action by its ID - */ - getAction(action_id: RObjectId): BaseAction | null { - return first(this.getAvailableActions(), action => action.is(action_id)); - } - - /** - * Get the number of upgrade points available to improve skills + /** + * Get the number of upgrade points available */ getAvailableUpgradePoints(): number { - let used = keys(SHIP_SKILLS).map(skill => this.skills[skill].get()).reduce((a, b) => a + b, 0); - return this.level.getSkillPoints() - used; + let upgrades = this.getUpgrades(); + return this.level.getUpgradePoints() - sum(upgrades.map(upgrade => upgrade.cost || 0)); } /** - * Try to upgrade a skill by 1 point or more + * Add an event to the battle log, if any */ - upgradeSkill(skill: keyof ShipSkills, points = 1) { - if (this.getBattle()) { - console.error("Cannot upgrade skill during battle"); - } else if (this.getAvailableUpgradePoints() >= points) { - this.skills[skill].addModifier(points); - this.updateAttributes(); - } - } - - // Add an event to the battle log, if any addBattleEvent(event: BaseBattleDiff): void { var battle = this.getBattle(); if (battle && battle.log) { @@ -226,9 +201,11 @@ module TK.SpaceTac { return this.attributes[name].get(); } - // Initialize the action points counter - // This should be called once at the start of a battle - // If no value is provided, the attribute power_capacity will be used + /** + * Initialize the action points counter + * This should be called once at the start of a battle + * If no value is provided, the attribute power_capacity will be used + */ private initializePower(value: number | null = null): void { if (value === null) { value = this.getAttribute("power_capacity"); @@ -236,35 +213,18 @@ module TK.SpaceTac { this.setValue("power", value); } - /** - * Consumes action points - * - * Return true if it was possible, false if there wasn't enough points. - */ - useActionPoints(value: number): boolean { - if (this.getValue("power") >= value) { - this.setValue("power", -value, true); - return true; - } else { - return false; - } - } - /** * Method called at the start of battle, to restore a pristine condition on the ship */ restoreInitialState() { this.alive = true; + + this.actions.updateFromShip(this); this.active_effects = new RObjectContainer(); + this.updateAttributes(); this.restoreHealth(); this.initializePower(); - this.listEquipment().forEach(equipment => equipment.cooldown.reset()); - this.getAvailableActions().forEach(action => { - if (action instanceof ToggleAction) { - action.activated = false; - } - }); } /** @@ -348,178 +308,12 @@ module TK.SpaceTac { } /** - * Get cargo space not occupied by items - */ - getFreeCargoSpace(): number { - return this.cargo_space - this.cargo.length; - } - - /** - * Set the available cargo space. - */ - setCargoSpace(cargo: number) { - this.cargo_space = cargo; - this.cargo.splice(this.cargo_space); - } - - /** - * Add an equipment to cargo space - * - * Returns true if successful - */ - addCargo(item: Equipment): boolean { - if (this.cargo.length < this.cargo_space) { - return add(this.cargo, item); - } else { - return false; - } - } - - /** - * Remove an item from cargo space - * - * Returns true if successful - */ - removeCargo(item: Equipment): boolean { - return remove(this.cargo, item); - } - - /** - * Equip an item from cargo to the first available slot - * - * Returns true if successful - */ - equip(item: Equipment, from_cargo = true): boolean { - let free_slot = this.canEquip(item); - - if (free_slot && (!from_cargo || remove(this.cargo, item))) { - free_slot.attach(item); - if (item.attached_to == free_slot && free_slot.attached == item) { - this.updateAttributes(); - return true; - } else { - return false; - } - } else { - return false; - } - } - - /** - * Check if a ship is able to equip en item, and return the slot it may fit in, or null - */ - canEquip(item: Equipment): Slot | null { - let free_slot = first(this.slots, slot => slot.type == item.slot_type && !slot.attached); - if (free_slot) { - if (item.canBeEquipped(this.attributes)) { - return free_slot; - } else { - return null; - } - } else { - return null; - } - } - - /** - * Remove an equipped item, returning it to cargo - * - * Returns true if successful - */ - unequip(item: Equipment, to_cargo = true): boolean { - if (item.attached_to && item.attached_to.attached == item && (!to_cargo || this.cargo.length < this.cargo_space)) { - item.detach(); - if (to_cargo) { - add(this.cargo, item); - } - - this.updateAttributes(); - - return true; - } else { - return false; - } - } - - /** - * Add an empty equipment slot of the given type - */ - addSlot(type: SlotType): Slot { - var result = new Slot(this, type); - this.slots.push(result); - return result; - } - - /** - * List all equipments attached to slots of a given type (any slot type if null) - */ - listEquipment(slottype: SlotType | null = null): Equipment[] { - return nna(this.slots.filter(slot => slot.attached && (slottype == null || slot.type == slottype)).map(slot => slot.attached)); - } - - /** - * Get the first free slot of a given type, null if none is available - */ - getFreeSlot(type: SlotType): Slot | null { - return first(this.slots, slot => slot.type == type && slot.attached == null); - } - - // Get the number of attached equipments - getEquipmentCount(): number { - var result = 0; - this.slots.forEach((slot: Slot) => { - if (slot.attached) { - result++; - } - }); - return result; - } - - // Get a random attached equipment, null if no equipment is attached - getRandomEquipment(random = RandomGenerator.global): Equipment | null { - var count = this.getEquipmentCount(); - if (count === 0) { - return null; - } else { - var picked = random.randInt(0, count - 1); - var result: Equipment | null = null; - var index = 0; - this.slots.forEach((slot: Slot) => { - if (slot.attached) { - if (index === picked) { - result = slot.attached; - } - index++; - } - }); - return result; - } - } - - /** - * Get the list of equipped items - */ - listEquipments(): Equipment[] { - return nna(this.slots.map(slot => slot.attached)); - } - - /** - * Get an equipment by its ID - */ - getEquipment(id: RObjectId): Equipment | null { - return first(this.listEquipments(), equipment => equipment.id === id); - } - - /** - * Update attributes, taking into account attached equipment and active effects + * Update attributes, taking into account model's permanent effects and active effects */ updateAttributes(): void { // Reset attributes keys(this.attributes).forEach(attr => this.attributes[attr].reset()); - // Apply base skills - keys(this.skills).forEach(skill => this.attributes[skill].addModifier(this.skills[skill].get())); - // Apply attribute effects iforeach(this.ieffects(), effect => { if (effect instanceof AttributeEffect) { @@ -542,14 +336,28 @@ module TK.SpaceTac { } } + /** + * Get actions from the ship model + */ + getModelActions(): BaseAction[] { + return this.model.getActions(this.level.get(), this.level.getUpgrades()); + } + + /** + * Get permanent effects from the ship model + */ + getModelEffects(): BaseEffect[] { + return this.model.getEffects(this.level.get(), this.level.getUpgrades()); + } + /** * Iterator over all effects active for this ship. * - * This combines the permanent effects from equipment, with sticky and area effects. + * This combines the permanent effects from ship model, with sticky and area effects. */ ieffects(): Iterator { return ichain( - ichainit(imap(iarray(this.slots), slot => slot.attached ? iarray(slot.attached.effects) : IEMPTY)), + iarray(this.getModelEffects()), imap(this.active_effects.iterator(), effect => (effect instanceof StickyEffect) ? effect.base : effect) ); } @@ -558,8 +366,8 @@ module TK.SpaceTac { * Iterator over toggle actions */ iToggleActions(only_active = false): Iterator { - return >ifilter(iarray(this.getAvailableActions()), action => { - return (action instanceof ToggleAction && (action.activated || !only_active)); + return >ifilter(iarray(this.actions.listAll()), action => { + return (action instanceof ToggleAction && (!only_active || this.actions.isToggled(action))); }); } @@ -594,22 +402,16 @@ module TK.SpaceTac { } } - if (attribute in this.skills) { - let skill = this.skills[attribute]; - if (skill.get()) { - diffs.push(`Levelled up: +${skill.get()}`); - } - } - - this.slots.forEach(slot => { - if (slot.attached) { - let equipment = slot.attached; - equipment.effects.forEach(effect => addEffect(equipment.getFullName(), effect)); - } + this.getModelEffects().forEach(effect => { + addEffect(`Level ${this.level.get()} ${this.model.name}`, effect); }); this.active_effects.list().forEach(effect => { - addEffect("???", (effect instanceof StickyEffect) ? effect.base : effect) + if (effect instanceof StickyEffect) { + addEffect("Sticky effect", effect.base); + } else { + addEffect("Active effect", effect); + } }); let sources = diffs.concat(limits).join("\n"); diff --git a/src/core/ShipGenerator.spec.ts b/src/core/ShipGenerator.spec.ts index a67fa63..3f9f5db 100644 --- a/src/core/ShipGenerator.spec.ts +++ b/src/core/ShipGenerator.spec.ts @@ -2,19 +2,10 @@ module TK.SpaceTac.Specs { testing("ShipGenerator", test => { test.case("can use ship model", check => { var gen = new ShipGenerator(); - var model = new ShipModel("test", "Test", 1, 2, true, 3); - var ship = gen.generate(1, model, false); + var model = new BaseModel("test", "Test"); + var ship = gen.generate(3, model, false); check.same(ship.model, model); - check.equals(ship.cargo_space, 2); - check.equals(ship.slots.length, 7); - check.same(ship.slots[0].type, SlotType.Hull); - check.same(ship.slots[1].type, SlotType.Shield); - check.same(ship.slots[2].type, SlotType.Power); - check.same(ship.slots[3].type, SlotType.Engine); - check.same(ship.slots[4].type, SlotType.Weapon); - check.same(ship.slots[5].type, SlotType.Weapon); - check.same(ship.slots[6].type, SlotType.Weapon); - check.equals(ship.getAttribute("skill_materials"), 1); + check.same(ship.level.get(), 3); }); }); } diff --git a/src/core/ShipGenerator.ts b/src/core/ShipGenerator.ts index 83d5ab9..1681260 100644 --- a/src/core/ShipGenerator.ts +++ b/src/core/ShipGenerator.ts @@ -4,7 +4,7 @@ module TK.SpaceTac { */ export class ShipGenerator { // Random number generator used - random: RandomGenerator; + random: RandomGenerator constructor(random = RandomGenerator.global) { this.random = random; @@ -13,47 +13,35 @@ module TK.SpaceTac { /** * Generate a ship of a givel level. * - * If *upgrade* is true, the ship's upgrade points will be randomly spent before chosing equipment - * - * If *force_damage_equipment, at least one "damaging" weapon will be chosen + * If *upgrade* is true, random levelling options will be chosen */ - generate(level: number, model: ShipModel | null = null, upgrade = true, force_damage_equipment = true): Ship { + generate(level: number, model: BaseModel | null = null, upgrade = true): Ship { if (!model) { // Get a random model - model = ShipModel.getRandomModel(level, this.random); + model = BaseModel.getRandomModel(level, this.random); } - let result = new Ship(null, undefined, model); - let loot = new LootGenerator(this.random); + let result = new Ship(null, null, model); - // Set all skills to 1 (to be able to use at least basic equipment) - keys(result.skills).forEach(skill => result.upgradeSkill(skill)); - - // Level upgrade result.level.forceLevel(level); if (upgrade) { - while (result.getAvailableUpgradePoints() > 0) { - result.upgradeSkill(this.random.choice(keys(SHIP_SKILLS))); - } - } + let iteration = 0; + while (iteration < 100) { + iteration += 1; - // Fill equipment slots - result.slots.forEach(slot => { - if (slot.type == SlotType.Weapon && force_damage_equipment) { - loot.setTemplateFilter(template => template.hasDamageEffect()); - force_damage_equipment = false; - } + let points = result.getAvailableUpgradePoints(); + let upgrades = model.getAvailableUpgrades(result.level.get()).filter(upgrade => { + return (upgrade.cost || 0) <= points && !result.level.hasUpgrade(upgrade); + }); - let equipment = loot.generateHighest(result.skills, EquipmentQuality.COMMON, slot.type); - if (equipment) { - slot.attach(equipment) - if (slot.attached !== equipment) { - console.error("Cannot attach generated equipment to slot", equipment, slot); + if (upgrades.length > 0) { + let upgrade = this.random.choice(upgrades); + result.activateUpgrade(upgrade, true); + } else { + break; } } - - loot.setTemplateFilter(() => true); - }); + } return result; } diff --git a/src/core/ShipLevel.spec.ts b/src/core/ShipLevel.spec.ts index f115c40..364283d 100644 --- a/src/core/ShipLevel.spec.ts +++ b/src/core/ShipLevel.spec.ts @@ -4,7 +4,7 @@ module TK.SpaceTac.Specs { let level = new ShipLevel(); check.equals(level.get(), 1); check.equals(level.getNextGoal(), 100); - check.equals(level.getSkillPoints(), 10); + check.equals(level.getUpgradePoints(), 0); level.addExperience(60); // 60 check.equals(level.get(), 1); @@ -15,21 +15,21 @@ module TK.SpaceTac.Specs { check.equals(level.checkLevelUp(), true); check.equals(level.get(), 2); check.equals(level.getNextGoal(), 300); - check.equals(level.getSkillPoints(), 15); + check.equals(level.getUpgradePoints(), 6); level.addExperience(200); // 330 check.equals(level.get(), 2); check.equals(level.checkLevelUp(), true); check.equals(level.get(), 3); check.equals(level.getNextGoal(), 600); - check.equals(level.getSkillPoints(), 20); + check.equals(level.getUpgradePoints(), 9); level.addExperience(320); // 650 check.equals(level.get(), 3); check.equals(level.checkLevelUp(), true); check.equals(level.get(), 4); check.equals(level.getNextGoal(), 1000); - check.equals(level.getSkillPoints(), 25); + check.equals(level.getUpgradePoints(), 12); }); test.case("forces a given level", check => { @@ -39,24 +39,5 @@ module TK.SpaceTac.Specs { level.forceLevel(10); check.equals(level.get(), 10); }); - - test.case("computes needed level for given points", check => { - check.equals(ShipLevel.getLevelForPoints(0), 1); - check.equals(ShipLevel.getLevelForPoints(1), 1); - check.equals(ShipLevel.getLevelForPoints(2), 1); - check.equals(ShipLevel.getLevelForPoints(5), 1); - check.equals(ShipLevel.getLevelForPoints(10), 1); - check.equals(ShipLevel.getLevelForPoints(11), 2); - check.equals(ShipLevel.getLevelForPoints(15), 2); - check.equals(ShipLevel.getLevelForPoints(16), 3); - check.equals(ShipLevel.getLevelForPoints(526), 105); - }); - - test.case("computes needed points for given level", check => { - check.equals(ShipLevel.getPointsForLevel(1), 10); - check.equals(ShipLevel.getPointsForLevel(2), 15); - check.equals(ShipLevel.getPointsForLevel(3), 20); - check.equals(ShipLevel.getPointsForLevel(105), 530); - }); }); } diff --git a/src/core/ShipLevel.ts b/src/core/ShipLevel.ts index 5896534..23d04cc 100644 --- a/src/core/ShipLevel.ts +++ b/src/core/ShipLevel.ts @@ -1,10 +1,11 @@ module TK.SpaceTac { /** - * Level and experience system for a ship. + * Level and experience system for a ship, with enabled upgrades. */ export class ShipLevel { - private level = 1; - private experience = 0; + private level = 1 + private experience = 0 + private upgrades: string[] = [] /** * Get current level @@ -20,6 +21,13 @@ module TK.SpaceTac { return this.experience; } + /** + * Get the activated upgrades + */ + getUpgrades(): string[] { + return acopy(this.upgrades); + } + /** * Get the next experience goal to reach, to gain one level */ @@ -73,30 +81,32 @@ module TK.SpaceTac { } /** - * Get skill points given by current level + * Get upgrade points given by current level + * + * This does not deduce activated upgrades usage */ - getSkillPoints(): number { - return 5 + 5 * this.level; + getUpgradePoints(): number { + return this.level > 1 ? (3 * this.level) : 0; } /** - * Get the level needed to have a given total of points + * (De)Activate an upgrade + * + * This does not check the upgrade points needed */ - static getLevelForPoints(points: number): number { - let lev = new ShipLevel(); - while (lev.getSkillPoints() < points) { - lev.forceLevelUp(); + activateUpgrade(upgrade: ModelUpgrade, active: boolean): void { + if (active) { + add(this.upgrades, upgrade.code); + } else { + remove(this.upgrades, upgrade.code); } - return lev.level; } /** - * Get the points available at a given level + * Check if an upgrade is active */ - static getPointsForLevel(level: number): number { - let lev = new ShipLevel(); - lev.forceLevel(level); - return lev.getSkillPoints(); + hasUpgrade(upgrade: ModelUpgrade): boolean { + return contains(this.upgrades, upgrade.code); } } } diff --git a/src/core/ShipModel.spec.ts b/src/core/ShipModel.spec.ts deleted file mode 100644 index 55e5b8c..0000000 --- a/src/core/ShipModel.spec.ts +++ /dev/null @@ -1,21 +0,0 @@ -module TK.SpaceTac.Specs { - testing("ShipModel", test => { - test.case("picks random models from default collection", check => { - check.patch(console, "error", null); - check.patch(ShipModel, "getDefaultCollection", iterator([ - [new ShipModel("a")], - [], - [new ShipModel("a"), new ShipModel("b")], - [new ShipModel("a")], - [], - ])); - - check.equals(ShipModel.getRandomModel(), new ShipModel("a"), "pick from a one-item list"); - check.equals(ShipModel.getRandomModel(), new ShipModel(), "pick from an empty list"); - - check.equals(sorted(ShipModel.getRandomModels(2), (a, b) => cmp(a.code, b.code)), [new ShipModel("a"), new ShipModel("b")], "sample from good-sized list"); - check.equals(ShipModel.getRandomModels(2), [new ShipModel("a"), new ShipModel("a")], "sample from too small list"); - check.equals(ShipModel.getRandomModels(2), [new ShipModel(), new ShipModel()], "sample from empty list"); - }); - }); -} diff --git a/src/core/ShipModel.ts b/src/core/ShipModel.ts deleted file mode 100644 index a67ae86..0000000 --- a/src/core/ShipModel.ts +++ /dev/null @@ -1,91 +0,0 @@ -module TK.SpaceTac { - // A model of ship - // It defines the ship looks, and available slots for equipment - export class ShipModel { - // Code to identify the model - code: string; - - // Human-readable model name - name: string; - - // Minimal level to use this model - level: number; - - // Cargo space - cargo: number; - - // Available slots - slots: SlotType[]; - - constructor(code = "unknown", name = "Unknown", level = 1, cargo = 6, default_slots = true, weapon_slots = 2) { - this.code = code; - this.name = name; - this.level = level; - this.cargo = cargo; - this.slots = default_slots ? [SlotType.Hull, SlotType.Shield, SlotType.Power, SlotType.Engine] : []; - range(weapon_slots).forEach(() => this.slots.push(SlotType.Weapon)); - } - - // Get the default ship model collection available in-game - static getDefaultCollection(): ShipModel[] { - // TODO Store in cache - var result: ShipModel[] = []; - - result.push(new ShipModel("breeze", "Breeze")); - result.push(new ShipModel("creeper", "Creeper")); - result.push(new ShipModel("tomahawk", "Tomahawk")); - result.push(new ShipModel("avenger", "Avenger")); - result.push(new ShipModel("commodore", "Commodore")); - result.push(new ShipModel("falcon", "Falcon")); - result.push(new ShipModel("flea", "Flea")); - result.push(new ShipModel("jumper", "Jumper")); - result.push(new ShipModel("rhino", "Rhino")); - result.push(new ShipModel("trapper", "Trapper")); - result.push(new ShipModel("xander", "Xander")); - - return result; - } - - /** - * Pick a random model in the default collection - */ - static getRandomModel(level?: number, random = RandomGenerator.global): ShipModel { - let collection = this.getDefaultCollection(); - if (level) { - collection = collection.filter(model => model.level <= level); - } - - if (collection.length == 0) { - console.error("Couldn't pick a random model"); - return new ShipModel(); - } else { - return random.choice(collection); - } - } - - /** - * Pick random models in the default collection - * - * At first it tries to pick unique models, then fill with duplicates - */ - static getRandomModels(count: number, level?: number, random = RandomGenerator.global): ShipModel[] { - let collection = this.getDefaultCollection(); - if (level) { - collection = collection.filter(model => model.level <= level); - } - - if (collection.length == 0) { - console.error("Couldn't pick a random model"); - return range(count).map(() => new ShipModel()); - } else { - let result: ShipModel[] = []; - while (count > 0) { - let picked = random.sample(collection, Math.min(count, collection.length)); - result = result.concat(picked); - count -= picked.length; - } - return result; - } - } - } -} diff --git a/src/core/ShipValue.ts b/src/core/ShipValue.ts index 34a6465..26d4a14 100644 --- a/src/core/ShipValue.ts +++ b/src/core/ShipValue.ts @@ -7,16 +7,9 @@ module TK.SpaceTac { "hull": "Physical structure of the ship", "shield": "Shield around the ship that may absorb damage", "power": "Power available to supply the equipments", - "skill_materials": "Usage of physical materials such as bullets, shells...", - "skill_photons": "Forces of light, and electromagnetic radiation", - "skill_antimatter": "Manipulation of matter and antimatter particles", - "skill_quantum": "Application of quantum uncertainty principle", - "skill_gravity": "Interaction with gravitational forces", - "skill_time": "Control of relativity's time properties", "hull_capacity": "Maximal Hull value before the ship risks collapsing", "shield_capacity": "Maximal Shield value to protect the hull from damage", "power_capacity": "Maximal Power value to use equipment", - "power_generation": "Power generated at the end of the ship's turn", "maneuvrability": "Ability to move first, fast and to evade weapons", "precision": "Ability to target far and aim good", } @@ -25,16 +18,9 @@ module TK.SpaceTac { "hull": "hull", "shield": "shield", "power": "power", - "skill_materials": "materials skill", - "skill_photons": "photons skill", - "skill_antimatter": "antimatter skill", - "skill_quantum": "quantum skill", - "skill_gravity": "gravity skill", - "skill_time": "time skill", "hull_capacity": "hull capacity", "shield_capacity": "shield capacity", "power_capacity": "power capacity", - "power_generation": "power generation", "maneuvrability": "maneuvrability", "precision": "precision", } @@ -126,31 +112,16 @@ module TK.SpaceTac { } } - /** - * Set of upgradable skills for a ship - */ - export class ShipSkills { - // Skills - skill_materials = new ShipAttribute() - skill_photons = new ShipAttribute() - skill_antimatter = new ShipAttribute() - skill_quantum = new ShipAttribute() - skill_gravity = new ShipAttribute() - skill_time = new ShipAttribute() - } - /** * Set of ShipAttribute for a ship */ - export class ShipAttributes extends ShipSkills { + export class ShipAttributes { // Maximal hull value hull_capacity = new ShipAttribute() // Maximal shield value shield_capacity = new ShipAttribute() // Maximal power value power_capacity = new ShipAttribute() - // Power value recovered each turn - power_generation = new ShipAttribute() // Ability to move first and fast maneuvrability = new ShipAttribute() // Ability to fire far and good @@ -169,7 +140,6 @@ module TK.SpaceTac { /** * Static attributes and values object for property queries */ - export const SHIP_SKILLS = new ShipSkills(); export const SHIP_ATTRIBUTES = new ShipAttributes(); export const SHIP_VALUES = new ShipValues(); diff --git a/src/core/Shop.spec.ts b/src/core/Shop.spec.ts index 7cfdd27..b773b8d 100644 --- a/src/core/Shop.spec.ts +++ b/src/core/Shop.spec.ts @@ -1,36 +1,5 @@ module TK.SpaceTac.Specs { testing("Shop", test => { - test.case("generates a stock", check => { - let shop = new Shop(); - check.equals((shop).stock.length, 0); - check.greater(shop.getStock().length, 20); - }); - - test.case("buys and sells items", check => { - let equ1 = new Equipment(SlotType.Shield, "shield"); - equ1.price = 50; - let equ2 = new Equipment(SlotType.Hull, "hull"); - equ2.price = 150; - let shop = new Shop(1, [equ1, equ2], 0); - let fleet = new Fleet(); - fleet.credits = 1000; - check.patch(shop, "getPrice", () => 800); - - let result = shop.sellToFleet(equ1, fleet); - check.equals(result, true); - check.equals(shop.getStock(), [equ2]); - check.equals(fleet.credits, 200); - result = shop.sellToFleet(equ2, fleet); - check.equals(result, false); - check.equals(shop.getStock(), [equ2]); - check.equals(fleet.credits, 200); - - result = shop.buyFromFleet(equ1, fleet); - check.equals(result, true); - check.equals(shop.getStock(), [equ1, equ2]); - check.equals(fleet.credits, 1000); - }); - test.case("generates secondary missions", check => { let universe = new Universe(); universe.generate(4); diff --git a/src/core/Shop.ts b/src/core/Shop.ts index 44cdb53..b515876 100644 --- a/src/core/Shop.ts +++ b/src/core/Shop.ts @@ -1,6 +1,4 @@ module TK.SpaceTac { - type ShopStockCallback = (stock: Equipment[]) => Equipment[] - /** * A shop is a place to buy/sell equipments */ @@ -8,109 +6,15 @@ module TK.SpaceTac { // Average level of equipment private level: number - // Approximative number of equipments - private count: number - - // Equipment in stock - private stock: Equipment[] - // Random generator private random: RandomGenerator // Available missions private missions: Mission[] = [] - // Callback when the equipment changes - private onchange: ShopStockCallback - - constructor(level = 1, stock: Equipment[] = [], count = 40, onchange?: ShopStockCallback) { + constructor(level = 1) { this.level = level; - this.stock = stock; - this.count = count; this.random = new RandomGenerator(); - this.onchange = onchange || (stock => stock); - } - - postUnserialize() { - // functions are not serializable - this.onchange = (stock => stock); - } - - /** - * Get available stock to display (sorted by level then price by default) - */ - getStock() { - if (this.stock.length < this.count * 0.5) { - let count = this.random.randInt(Math.floor(this.count * 0.8), Math.ceil(this.count * 1.2)); - this.stock = this.stock.concat(this.generateStock(count - this.stock.length, this.level, this.random)); - } - - return sorted(this.stock, (a, b) => (a.level == b.level) ? cmp(a.getPrice(), b.getPrice()) : cmp(a.level, b.level)); - } - - /** - * Generate a random stock - * - * *level* is the preferential level, but equipment around it may be generated - */ - private generateStock(items: number, level: number, random = RandomGenerator.global): Equipment[] { - let generator = new LootGenerator(random); - - return nna(range(items).map(() => { - let equlevel = random.weighted(range(level + 3).map(i => i + 1).map(i => (i > level) ? 1 : i)) + 1; - let quality = random.weighted([1, 7, 2]); - return generator.generate(equlevel, quality); - })); - } - - /** - * Update the stock after a buying or selling occured - */ - refreshStock() { - this.stock = this.onchange(this.stock); - } - - /** - * Get the buy/sell price for an equipment - */ - getPrice(equipment: Equipment): number { - return equipment.getPrice(); - } - - /** - * A fleet buys an item - * - * This does not put the item anywhere on the fleet, only remove the item from stock, and make the payment - */ - sellToFleet(equipment: Equipment, fleet: Fleet) { - let price = this.getPrice(equipment); - if (price <= fleet.credits) { - if (remove(this.stock, equipment)) { - this.refreshStock(); - fleet.credits -= price; - return true; - } else { - return false; - } - } else { - return false; - } - } - - /** - * A fleet sells an item - * - * This does not check if the item is anywhere on the fleet, only add the item to the shop stock, and make the payment - */ - buyFromFleet(equipment: Equipment, fleet: Fleet) { - let price = this.getPrice(equipment); - if (add(this.stock, equipment)) { - this.refreshStock(); - fleet.credits += price; - return true; - } else { - return false; - } } /** diff --git a/src/core/Slot.spec.ts b/src/core/Slot.spec.ts deleted file mode 100644 index deb5b74..0000000 --- a/src/core/Slot.spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -module TK.SpaceTac.Specs { - testing("Slot", test => { - test.case("checks equipment type", check => { - check.patch(console, "warn", null); - - var ship = new Ship(); - var slot = ship.addSlot(SlotType.Engine); - - var equipment = new Equipment(); - equipment.slot_type = SlotType.Weapon; - - check.equals(slot.attached, null); - slot.attach(equipment); - check.equals(slot.attached, null); - - equipment.slot_type = SlotType.Engine; - - slot.attach(equipment); - check.same(slot.attached, equipment); - }); - - test.case("checks equipment capabilities", check => { - check.patch(console, "warn", null); - - var ship = new Ship(); - var slot = ship.addSlot(SlotType.Shield); - - var equipment = new Equipment(); - equipment.slot_type = SlotType.Shield; - equipment.requirements["skill_gravity"] = 5; - - check.equals(slot.attached, null); - slot.attach(equipment); - check.equals(slot.attached, null); - - TestTools.setAttribute(ship, "skill_gravity", 6); - - slot.attach(equipment); - check.same(slot.attached, equipment); - }); - }); -} diff --git a/src/core/Slot.ts b/src/core/Slot.ts deleted file mode 100644 index cedc82f..0000000 --- a/src/core/Slot.ts +++ /dev/null @@ -1,45 +0,0 @@ -module TK.SpaceTac { - // Types of slots - export enum SlotType { - Hull, - Shield, - Power, - Engine, - Weapon - } - - // Slot to attach an equipment to a ship - export class Slot { - // Link to the ship - ship: Ship; - - // Type of slot - type: SlotType; - - // Currently attached equipment, null if none - attached: Equipment | null; - - // Create an empty slot for a ship - constructor(ship: Ship, type: SlotType) { - this.ship = ship; - this.type = type; - this.attached = null; - } - - // Attach an equipment in this slot - attach(equipment: Equipment): Equipment { - if (this.type === equipment.slot_type && equipment.canBeEquipped(this.ship.attributes)) { - this.attached = equipment; - equipment.attached_to = this; - - if (this.ship) { - this.ship.updateAttributes(); - } - } else { - console.warn("Equipment cannot be attached to slot", equipment, this); - } - return equipment; - } - } - -} diff --git a/src/core/TestTools.spec.ts b/src/core/TestTools.spec.ts index 3ff61f9..21b6680 100644 --- a/src/core/TestTools.spec.ts +++ b/src/core/TestTools.spec.ts @@ -1,33 +1,23 @@ module TK.SpaceTac.Specs { testing("TestTools", test => { - test.case("set ship power", check => { - let ship = new Ship(); - - check.equals(ship.getAttribute("power_capacity"), 0); - check.equals(ship.getAttribute("power_generation"), 0); - check.equals(ship.getValue("power"), 0); - - TestTools.setShipAP(ship, 12, 4); - - check.equals(ship.getAttribute("power_capacity"), 12); - check.equals(ship.getAttribute("power_generation"), 4); - check.equals(ship.getValue("power"), 12); - }); - - test.case("set ship health", check => { + test.case("set ship health and power", check => { let ship = new Ship(); check.equals(ship.getAttribute("hull_capacity"), 0); check.equals(ship.getAttribute("shield_capacity"), 0); + check.equals(ship.getAttribute("power_capacity"), 0); check.equals(ship.getValue("hull"), 0); check.equals(ship.getValue("shield"), 0); + check.equals(ship.getValue("power"), 0); - TestTools.setShipHP(ship, 100, 200); + TestTools.setShipModel(ship, 100, 200, 12); check.equals(ship.getAttribute("hull_capacity"), 100); check.equals(ship.getAttribute("shield_capacity"), 200); + check.equals(ship.getAttribute("power_capacity"), 12); check.equals(ship.getValue("hull"), 100); check.equals(ship.getValue("shield"), 200); + check.equals(ship.getValue("power"), 12); }); }); } \ No newline at end of file diff --git a/src/core/TestTools.ts b/src/core/TestTools.ts index 158d95d..77fd0c8 100644 --- a/src/core/TestTools.ts +++ b/src/core/TestTools.ts @@ -15,100 +15,72 @@ module TK.SpaceTac { } var battle = new Battle(fleet1, fleet2); - battle.ships.list().forEach(ship => TestTools.setShipHP(ship, 1, 0)); + battle.ships.list().forEach(ship => TestTools.setShipModel(ship, 1, 0)); battle.play_order = fleet1.ships.concat(fleet2.ships); battle.setPlayingShip(battle.play_order[0]); return battle; } - // Get or add an equipment of a given slot type - static getOrGenEquipment(ship: Ship, slot: SlotType, template: LootTemplate, force_generate = false): Equipment { - var equipped = ship.listEquipment(slot); - var equipment: Equipment; - if (force_generate || equipped.length === 0) { - equipment = template.generate(1); - equipment.requirements = {}; - ship.addSlot(slot).attach(equipment); - } else { - equipment = equipped[0]; - } - - return equipment; - } - /** * Add an engine, allowing a ship to move *distance*, for each action points */ - static addEngine(ship: Ship, distance: number): Equipment { - let equipment = ship.addSlot(SlotType.Engine).attach(new Equipment(SlotType.Engine)); - equipment.action = new MoveAction(equipment, distance); - return equipment; + static addEngine(ship: Ship, distance: number): MoveAction { + let action = new MoveAction("Engine", { distance_per_power: distance }); + ship.actions.addCustom(action); + return action; } /** * Add a weapon to a ship */ - static addWeapon(ship: Ship, damage = 100, power_usage = 1, max_distance = 100, blast = 0, angle = 0): Equipment { - var equipment = ship.addSlot(SlotType.Weapon).attach(new Equipment(SlotType.Weapon)); - equipment.action = new TriggerAction(equipment, [new DamageEffect(damage)], power_usage, max_distance, blast, angle); - return equipment; + static addWeapon(ship: Ship, damage = 100, power_usage = 1, max_distance = 100, blast = 0, angle = 0): TriggerAction { + let action = new TriggerAction("Weapon", { + effects: [new DamageEffect(damage)], + power: power_usage, + range: max_distance, + blast: blast, + angle: angle, + }); + ship.actions.addCustom(action); + return action; } - // Set the current playing ship + /** + * Force the current playing ship + */ static setShipPlaying(battle: Battle, ship: Ship): void { add(battle.play_order, ship); battle.play_index = battle.play_order.indexOf(ship); ship.playing = true; } - // Set a ship action points, adding/updating an equipment if needed - static setShipAP(ship: Ship, points: number, recovery: number = 0): Equipment { - var equipment = this.getOrGenEquipment(ship, SlotType.Power, new Equipments.NuclearReactor()); + /** + * Set a ship attributes (by changing its model) + */ + static setShipModel(ship: Ship, hull: number, shield = 0, power = 0, level = 1, actions: BaseAction[] = [], effects: BaseEffect[] = []) { + let model = new BaseModel(); + ship.level.forceLevel(level); + ship.model = model; - equipment.effects.forEach(effect => { - if (effect instanceof AttributeEffect) { - if (effect.attrcode === "power_capacity") { - effect.value = points; - } else if (effect.attrcode === "power_generation") { - effect.value = recovery; - } - } - }); + // TODO Use a BaseModel subclass would be prettier + model.getActions = () => actions; + model.getEffects = () => effects.concat([ + new AttributeEffect("hull_capacity", hull), + new AttributeEffect("shield_capacity", shield), + new AttributeEffect("power_capacity", power), + ]); - ship.updateAttributes(); - ship.setValue("power", points); - - return equipment; - } - - // Set a ship hull and shield points, adding/updating an equipment if needed - static setShipHP(ship: Ship, hull_points: number, shield_points: number): [Equipment, Equipment] { - var hull = TestTools.getOrGenEquipment(ship, SlotType.Hull, new Equipments.IronHull()); - var shield = TestTools.getOrGenEquipment(ship, SlotType.Shield, new Equipments.ForceField()); - - hull.effects.forEach(effect => { - if (effect instanceof AttributeEffect) { - if (effect.attrcode === "hull_capacity") { - effect.value = hull_points; - } - } - }); - shield.effects.forEach((effect: BaseEffect) => { - if (effect instanceof AttributeEffect) { - if (effect.attrcode === "shield_capacity") { - effect.value = shield_points; - } - } - }); + ship.actions.updateFromShip(ship); ship.updateAttributes(); ship.restoreHealth(); - - return [hull, shield]; + ship.setValue("power", power); } /** * Force a ship attribute to a given value + * + * Beware that a call to ship.updateAttributes() may cancel this */ static setAttribute(ship: Ship, name: keyof ShipAttributes, value: number): void { let attr = ship.attributes[name]; @@ -157,4 +129,60 @@ module TK.SpaceTac { } } } + + function strip(obj: T, attr: keyof T): any { + let result: any = {}; + copyfields(obj, result); + delete result[attr]; + return result; + } + + function strip_id(effect: RObject): any { + if (effect instanceof StickyEffect) { + let result = strip(effect, "id"); + result.base = strip_id(result.base); + return result; + } else { + return strip(effect, "id"); + } + } + + export function compare_effects(check: TestContext, effects1: BaseEffect[], effects2: BaseEffect[]): void { + check.equals(effects1.map(strip_id), effects2.map(strip_id), "effects"); + } + + export function compare_action(check: TestContext, action1: BaseAction | null, action2: BaseAction | null): void { + if (action1 === null || action2 === null) { + check.equals(action1, action2, "action"); + } else { + check.equals(strip_id(action1), strip_id(action2), "action"); + } + } + + export function compare_trigger_action(check: TestContext, action1: BaseAction | null, action2: TriggerAction | null): void { + if (action1 === null || action2 === null || !(action1 instanceof TriggerAction)) { + check.equals(action1, action2, "action"); + } else { + check.equals(strip_id(strip(action1, "effects")), strip_id(strip(action2, "effects")), "action"); + compare_effects(check, action1.effects, action2.effects); + } + } + + export function compare_toggle_action(check: TestContext, action1: BaseAction | null, action2: ToggleAction | null): void { + if (action1 === null || action2 === null || !(action1 instanceof ToggleAction)) { + check.equals(action1, action2, "action"); + } else { + check.equals(strip_id(strip(action1, "effects")), strip_id(strip(action2, "effects")), "action"); + compare_effects(check, action1.effects, action2.effects); + } + } + + export function compare_drone_action(check: TestContext, action1: BaseAction | null, action2: DeployDroneAction | null): void { + if (action1 === null || action2 === null || !(action1 instanceof DeployDroneAction)) { + check.equals(action1, action2, "action"); + } else { + check.equals(strip_id(strip(action1, "drone_effects")), strip_id(strip(action2, "drone_effects")), "action"); + compare_effects(check, action1.drone_effects, action2.drone_effects); + } + } } diff --git a/src/core/actions/ActionList.spec.ts b/src/core/actions/ActionList.spec.ts new file mode 100644 index 0000000..5f43614 --- /dev/null +++ b/src/core/actions/ActionList.spec.ts @@ -0,0 +1,45 @@ +module TK.SpaceTac.Specs { + testing("ActionList", test => { + test.case("lists actions from ship", check => { + let actions = new ActionList(); + check.equals(actions.listAll(), [EndTurnAction.SINGLETON]); + + let model = new BaseModel(); + let ship = new Ship(null, null, model); + actions.updateFromShip(ship); + check.equals(actions.listAll(), [EndTurnAction.SINGLETON]); + + let action1 = new BaseAction("test1"); + let action2 = new BaseAction("test2"); + let mock = check.patch(model, "getActions", () => [action1, action2]); + ship.level.forceLevel(3); + actions.updateFromShip(ship); + check.equals(actions.listAll(), [action1, action2, EndTurnAction.SINGLETON]); + check.called(mock, [[3, []]]); + + let up1: ModelUpgrade = { code: "up1" }; + let up2: ModelUpgrade = { code: "up2" }; + check.patch(model, "getLevelUpgrades", () => [up1, up2]); + ship.level.activateUpgrade(up1, true); + actions.updateFromShip(ship); + check.equals(actions.listAll(), [action1, action2, EndTurnAction.SINGLETON]); + check.called(mock, [[3, ["up1"]]]); + }) + + test.case("lists toggled actions", check => { + let actions = new ActionList(); + check.equals(actions.listToggled(), [], "init"); + + let action1 = new ToggleAction("test1"); + let action2 = new ToggleAction("test2"); + (actions).from_model = [new BaseAction(), action1, action2]; + check.equals(actions.listToggled(), [], "actions added but not toggled"); + + actions.toggle(action1, true); + check.equals(actions.listToggled(), [action1], "action1 is toggled"); + + actions.toggle(new ToggleAction("test3"), true); + check.equals(actions.listToggled(), [action1], "action3 cannot be toggled"); + }) + }) +} diff --git a/src/core/actions/ActionList.ts b/src/core/actions/ActionList.ts new file mode 100644 index 0000000..52a5879 --- /dev/null +++ b/src/core/actions/ActionList.ts @@ -0,0 +1,132 @@ +module TK.SpaceTac { + /** + * List of actions, that may be used by a ship to keep track of available actions + * + * This manages usage count, toggles and cooldown ... + */ + export class ActionList { + // Available actions + private from_model: BaseAction[] = [] + private custom: BaseAction[] = [] + + // Toggled actions + private toggled = new RObjectContainer() + + // Active cooldowns + private cooldowns: { [action: number]: Cooldown } = {} + + /** + * Add a custom action + */ + addCustom(action: T): T { + add(this.custom, action); + return action; + } + + /** + * List all actions + */ + listAll(): BaseAction[] { + return this.from_model.concat(this.custom).concat([EndTurnAction.SINGLETON]); + } + + /** + * List all currently toggled actions + */ + listToggled(): ToggleAction[] { + let result: ToggleAction[] = []; + + this.listAll().forEach(action => { + if (action instanceof ToggleAction && this.isToggled(action)) { + result.push(action); + } + }); + + return result; + } + + /** + * List all currently overheated actions + */ + listOverheated(): BaseAction[] { + return this.listAll().filter(action => this.getCooldown(action).heat > 0); + } + + /** + * Get an action by its ID + */ + getById(action_id: RObjectId): BaseAction | null { + return first(this.listAll(), action => action.is(action_id)); + } + + /** + * Check if a toggle action is currently active + */ + isToggled(action: ToggleAction): boolean { + return this.toggled.get(action.id) != null; + } + + /** + * Toggle the status of an action + */ + toggle(action: ToggleAction, active: boolean): boolean { + if (this.getById(action.id)) { + if (active) { + this.toggled.add(action); + } else { + this.toggled.remove(action); + } + } + + return this.toggled.get(action.id) != null; + } + + /** + * Get the cooldown associated with an action + */ + getCooldown(action: BaseAction): Cooldown { + if (this.getById(action.id)) { + if (typeof this.cooldowns[action.id] == "undefined") { + this.cooldowns[action.id] = copy(action.getCooldown()); + } + return this.cooldowns[action.id]; + } else { + console.warn("Action not found, fake cooldown returned", action, this); + return new Cooldown(); + } + } + + /** + * Store an usage count for an action + */ + storeUsage(action: BaseAction, usage = 1): void { + this.getCooldown(action).use(usage); + } + + /** + * Check if an action may be used (in regards to cooldown) + * + * This does not take power into account + */ + isUsable(action: BaseAction): boolean { + if (this.getById(action.id)) { + return this.getCooldown(action).canUse(); + } else { + return false; + } + } + + /** + * Update the actions from a ship. + * + * Beware that this will change the actions IDs. It should typically be done at a battle start. + * This will reset cooldown, toggles and custom actions. + */ + updateFromShip(ship: Ship) { + this.from_model = ship.getModelActions(); + this.toggled = new RObjectContainer(); + this.cooldowns = {}; + this.custom = []; + } + } +} diff --git a/src/core/actions/BaseAction.spec.ts b/src/core/actions/BaseAction.spec.ts index 9574f0a..e6dc0b0 100644 --- a/src/core/actions/BaseAction.spec.ts +++ b/src/core/actions/BaseAction.spec.ts @@ -3,10 +3,9 @@ module TK.SpaceTac.Specs { test.case("may be applied and reverted", check => { let battle = TestTools.createBattle(); let ship = nn(battle.playing_ship); - TestTools.setShipAP(ship, 10, 4); - let equipment = TestTools.addWeapon(ship, 0, 3, 100, 50); - let action = nn(equipment.action); - action.cooldown.configure(2, 1); + TestTools.setShipModel(ship, 100, 0, 10); + let action = TestTools.addWeapon(ship, 0, 3, 100, 50); + action.configureCooldown(2, 1); TestTools.actionChain(check, battle, [ [ship, action, Target.newFromLocation(0, 0)], @@ -15,110 +14,82 @@ module TK.SpaceTac.Specs { ], [ check => { check.equals(ship.getValue("power"), 10, "power"); - check.equals(action.cooldown.uses, 0, "uses"); - check.equals(action.cooldown.heat, 0, "heat"); + let cooldown = ship.actions.getCooldown(action); + check.equals(cooldown.uses, 0, "uses"); + check.equals(cooldown.heat, 0, "heat"); }, check => { check.equals(ship.getValue("power"), 7, "power"); - check.equals(action.cooldown.uses, 1, "uses"); - check.equals(action.cooldown.heat, 0, "heat"); + let cooldown = ship.actions.getCooldown(action); + check.equals(cooldown.uses, 1, "uses"); + check.equals(cooldown.heat, 0, "heat"); }, check => { check.equals(ship.getValue("power"), 4, "power"); - check.equals(action.cooldown.uses, 2, "uses"); - check.equals(action.cooldown.heat, 1, "heat"); + let cooldown = ship.actions.getCooldown(action); + check.equals(cooldown.uses, 2, "uses"); + check.equals(cooldown.heat, 1, "heat"); }, check => { - check.equals(ship.getValue("power"), 8, "power"); - check.equals(action.cooldown.uses, 0, "uses"); - check.equals(action.cooldown.heat, 0, "heat"); + check.equals(ship.getValue("power"), 10, "power"); + let cooldown = ship.actions.getCooldown(action); + check.equals(cooldown.uses, 0, "uses"); + check.equals(cooldown.heat, 0, "heat"); }, ]); }) - test.case("checks if equipment can be used with remaining AP", check => { - var equipment = new Equipment(SlotType.Hull); - var action = new BaseAction("test", equipment); + test.case("checks against remaining AP", check => { + let action = new BaseAction("test"); check.patch(action, "getActionPointsUsage", () => 3); - var ship = new Ship(); - ship.addSlot(SlotType.Hull).attach(equipment); + let ship = new Ship(); + check.equals(action.checkCannotBeApplied(ship), "action not available"); + + ship.actions.addCustom(action); check.equals(action.checkCannotBeApplied(ship), "not enough power"); ship.setValue("power", 5); - check.equals(action.checkCannotBeApplied(ship), null); check.equals(action.checkCannotBeApplied(ship, 4), null); check.equals(action.checkCannotBeApplied(ship, 3), null); check.equals(action.checkCannotBeApplied(ship, 2), "not enough power"); ship.setValue("power", 3); - check.equals(action.checkCannotBeApplied(ship), null); ship.setValue("power", 2); - check.equals(action.checkCannotBeApplied(ship), "not enough power"); }) - test.case("checks if equipment can be used with overheat", check => { - let equipment = new Equipment(); - let action = new BaseAction("test", equipment); + test.case("checks against overheat", check => { + let action = new BaseAction("test"); let ship = new Ship(); + ship.actions.addCustom(action); + let cooldown = ship.actions.getCooldown(action); check.equals(action.checkCannotBeApplied(ship), null); - check.same(action.getUsesBeforeOverheat(), Infinity); - equipment.cooldown.use(); + cooldown.use(); check.equals(action.checkCannotBeApplied(ship), null); - check.same(action.getUsesBeforeOverheat(), Infinity); - equipment.cooldown.configure(2, 3); + cooldown.configure(2, 3); check.equals(action.checkCannotBeApplied(ship), null); - check.equals(action.getUsesBeforeOverheat(), 2); - equipment.cooldown.use(); + cooldown.use(); check.equals(action.checkCannotBeApplied(ship), null); - check.equals(action.getUsesBeforeOverheat(), 1); - check.equals(action.getCooldownDuration(), 0); - equipment.cooldown.use(); + cooldown.use(); check.equals(action.checkCannotBeApplied(ship), "overheated"); - check.equals(action.getUsesBeforeOverheat(), 0); - check.equals(action.getCooldownDuration(), 3); - equipment.cooldown.cool(); + cooldown.cool(); check.equals(action.checkCannotBeApplied(ship), "overheated"); - check.equals(action.getCooldownDuration(), 2); - equipment.cooldown.cool(); + cooldown.cool(); check.equals(action.checkCannotBeApplied(ship), "overheated"); - check.equals(action.getCooldownDuration(), 1); - equipment.cooldown.cool(); + cooldown.cool(); check.equals(action.checkCannotBeApplied(ship), null); - check.equals(action.getCooldownDuration(), 0); - check.equals(action.getCooldownDuration(true), 3); - }) - - test.case("wears down equipment and power generators", check => { - let battle = TestTools.createBattle(); - let ship = battle.play_order[0]; - TestTools.setShipAP(ship, 10); - let power = ship.listEquipment(SlotType.Power)[0]; - let equipment = new Equipment(SlotType.Weapon); - let action = new BaseAction("test", equipment); - equipment.action = action; - ship.addSlot(SlotType.Weapon).attach(equipment); - - check.patch(action, "checkTarget", (ship: Ship, target: Target) => target); - - check.equals(power.wear, 0, "power wear"); - check.equals(equipment.wear, 0, "equipment wear"); - action.apply(battle, ship); - - check.equals(power.wear, 1, "power wear"); - check.equals(equipment.wear, 1, "equipment wear"); }) }); } diff --git a/src/core/actions/BaseAction.ts b/src/core/actions/BaseAction.ts index f7ef471..54cf2a6 100644 --- a/src/core/actions/BaseAction.ts +++ b/src/core/actions/BaseAction.ts @@ -24,31 +24,34 @@ module TK.SpaceTac { */ export class BaseAction extends RObject { // Identifier code for the type of action - code: string + readonly code: string - // Equipment that triggers this action - equipment: Equipment | null + // Full name of the action + readonly name: string + + // Cooldown configuration + private cooldown = new Cooldown() // Create the action - constructor(code = "nothing", equipment: Equipment | null = null) { + constructor(name = "Nothing", code?: string) { super(); - this.code = code; - this.equipment = equipment; + this.code = code ? code : name.toLowerCase().replace(" ", ""); + this.name = name; } /** * Get the verb for this action */ - getVerb(): string { - return "Idle"; + getVerb(ship: Ship): string { + return "Do"; } /** - * Get the relevent cooldown for this action + * Get the full title for this action (verb and name) */ - get cooldown(): Cooldown { - return this.equipment ? this.equipment.cooldown : new Cooldown(); + getTitle(ship: Ship): string { + return `${this.getVerb(ship)} ${this.name}`; } /** @@ -66,18 +69,18 @@ module TK.SpaceTac { } /** - * Get the number of turns this action is unavailable, because of overheating + * Configure the cooldown for this action */ - getCooldownDuration(estimated = false): number { - let cooldown = this.cooldown; - return estimated ? this.cooldown.cooling : this.cooldown.heat; + configureCooldown(overheat: number, cooling: number): void { + this.cooldown.configure(overheat, cooling); } /** - * Get the number of remaining uses before overheat, infinity if there is no overheat + * Get the cooldown configuration */ - getUsesBeforeOverheat(): number { - return this.cooldown.getRemainingUses(); + getCooldown(): Cooldown { + // TODO Split configuration (readonly) and usage + return this.cooldown; } /** @@ -94,6 +97,10 @@ module TK.SpaceTac { return "ship not playing"; } + if (!ship.actions.getById(this.id)) { + return "action not available"; + } + // Check AP usage if (remaining_ap === null) { remaining_ap = ship.getValue("power"); @@ -104,7 +111,7 @@ module TK.SpaceTac { } // Check cooldown - if (!this.cooldown.canUse()) { + if (!ship.actions.isUsable(this)) { return "overheated"; } diff --git a/src/core/actions/DeployDroneAction.spec.ts b/src/core/actions/DeployDroneAction.spec.ts index 7d5abe8..7937cb5 100644 --- a/src/core/actions/DeployDroneAction.spec.ts +++ b/src/core/actions/DeployDroneAction.spec.ts @@ -1,18 +1,22 @@ module TK.SpaceTac.Specs { testing("DeployDroneAction", test => { test.case("stores useful information", check => { - let equipment = new Equipment(SlotType.Weapon, "testdrone"); - let action = new DeployDroneAction(equipment); + let ship = new Ship(); + let action = new DeployDroneAction("testdrone"); + ship.actions.addCustom(action); - check.equals(action.code, "deploy-testdrone"); - check.equals(action.getVerb(), "Deploy"); - check.same(action.equipment, equipment); + check.equals(action.code, "testdrone"); + check.equals(action.getVerb(ship), "Deploy"); + + ship.actions.toggle(action, true); + check.equals(action.getVerb(ship), "Recall"); }); test.case("allows to deploy in range", check => { let ship = new Ship(); ship.setArenaPosition(0, 0); - let action = new DeployDroneAction(new Equipment(), 0, 8); + let action = new DeployDroneAction("testdrone", { power: 0 }, { deploy_distance: 8 }); + ship.actions.addCustom(action); check.equals(action.checkTarget(ship, new Target(8, 0, null)), new Target(8, 0, null)); check.equals(action.checkTarget(ship, new Target(12, 0, null)), new Target(8, 0, null)); @@ -26,12 +30,10 @@ module TK.SpaceTac.Specs { let battle = TestTools.createBattle(); let ship = battle.play_order[0]; ship.setArenaPosition(0, 0); - TestTools.setShipAP(ship, 3); + TestTools.setShipModel(ship, 100, 0, 3); - let equipment = new Equipment(SlotType.Weapon, "testdrone"); - let action = new DeployDroneAction(equipment, 2, 8, 4, [new DamageEffect(50)]); - equipment.action = action; - ship.addSlot(SlotType.Weapon).attach(equipment); + let action = new DeployDroneAction("testdrone", { power: 2 }, { deploy_distance: 8, drone_radius: 4, drone_effects: [new DamageEffect(50)] }); + ship.actions.addCustom(action); TestTools.actionChain(check, battle, [ [ship, action, new Target(5, 0)], diff --git a/src/core/actions/DeployDroneAction.ts b/src/core/actions/DeployDroneAction.ts index eb49519..c1bbe1e 100644 --- a/src/core/actions/DeployDroneAction.ts +++ b/src/core/actions/DeployDroneAction.ts @@ -1,12 +1,10 @@ /// module TK.SpaceTac { - /** - * Action to deploy a drone in space - * - * This is a toggled action, meaning that deploying a drone requires a permanent power supply from the ship + /** + * Configuration of a toggle action */ - export class DeployDroneAction extends ToggleAction { + export interface DeployDroneActionConfig { // Maximal distance the drone may be deployed deploy_distance: number @@ -15,21 +13,39 @@ module TK.SpaceTac { // Effects applied to ships in range of the drone drone_effects: BaseEffect[] + } - constructor(equipment: Equipment, power = 1, deploy_distance = 0, radius = 0, effects: BaseEffect[] = []) { - super(equipment, power, 0, [], `deploy-${equipment.code}`); + /** + * Action to deploy a drone in space + * + * This is a toggled action, meaning that deploying a drone requires a permanent power supply from the ship + */ + export class DeployDroneAction extends ToggleAction implements DeployDroneActionConfig { + deploy_distance = 0 + drone_radius = 0 + drone_effects: BaseEffect[] = [] - this.deploy_distance = deploy_distance; - this.drone_radius = radius; - this.drone_effects = effects; + constructor(name: string, toggle_config?: Partial, drone_config?: Partial, code?: string) { + super(name, toggle_config, code); + + if (drone_config) { + this.configureDrone(drone_config); + } } - getVerb(): string { - return this.activated ? "Recall" : "Deploy"; + /** + * Configure the deployed drone + */ + configureDrone(config: Partial): void { + copyfields(config, this); + } + + getVerb(ship: Ship): string { + return ship.actions.isToggled(this) ? "Recall" : "Deploy"; } getTargettingMode(ship: Ship): ActionTargettingMode { - return this.activated ? ActionTargettingMode.SELF : ActionTargettingMode.SPACE; + return ship.actions.isToggled(this) ? ActionTargettingMode.SELF : ActionTargettingMode.SPACE; } getDefaultTarget(ship: Ship): Target { @@ -42,7 +58,7 @@ module TK.SpaceTac { } getRangeRadius(ship: Ship): number { - return this.activated ? 0 : this.deploy_distance; + return ship.actions.isToggled(this) ? 0 : this.deploy_distance; } filterImpactedShips(source: ArenaLocation, target: Target, ships: Ship[]): Ship[] { @@ -57,7 +73,7 @@ module TK.SpaceTac { getSpecificDiffs(ship: Ship, battle: Battle, target: Target): BaseBattleDiff[] { let result = super.getSpecificDiffs(ship, battle, target); - if (this.activated) { + if (ship.actions.isToggled(this)) { let drone = first(battle.drones.list(), idrone => this.is(idrone.parent)); if (drone) { result.push(new DroneRecalledDiff(drone)); @@ -65,7 +81,7 @@ module TK.SpaceTac { return []; } } else { - let drone = new Drone(ship, this.equipment.code); + let drone = new Drone(ship, this.code); drone.parent = this; drone.x = target.x; drone.y = target.y; diff --git a/src/core/actions/EndTurnAction.spec.ts b/src/core/actions/EndTurnAction.spec.ts index 7fcdc8e..3200d0b 100644 --- a/src/core/actions/EndTurnAction.spec.ts +++ b/src/core/actions/EndTurnAction.spec.ts @@ -8,6 +8,9 @@ module TK.SpaceTac.Specs { battle.setPlayingShip(battle.play_order[0]); let action = new EndTurnAction(); + check.equals(action.checkCannotBeApplied(battle.play_order[0]), "action not available"); + + action = EndTurnAction.SINGLETON; check.equals(action.checkCannotBeApplied(battle.play_order[0]), null); check.equals(action.checkCannotBeApplied(battle.play_order[1]), "ship not playing"); }); @@ -36,23 +39,23 @@ module TK.SpaceTac.Specs { test.case("generates power for previous ship", check => { let battle = TestTools.createBattle(1, 1); let [ship1, ship2] = battle.play_order; - TestTools.setShipAP(ship1, 10, 3); - let weapon = TestTools.addWeapon(ship1); - weapon.action = new ToggleAction(weapon, 2); + TestTools.setShipModel(ship1, 100, 0, 10); + let toggle = new ToggleAction("toggle", { power: 2 }); + ship1.actions.addCustom(toggle); ship1.setValue("power", 6); TestTools.actionChain(check, battle, [ - [ship1, weapon.action, Target.newFromShip(ship1)], - [ship1, weapon.action, Target.newFromShip(ship1)], - [ship1, EndTurnAction.SINGLETON, Target.newFromShip(ship1)], - [ship2, EndTurnAction.SINGLETON, Target.newFromShip(ship2)], - [ship1, weapon.action, Target.newFromShip(ship1)], - [ship1, EndTurnAction.SINGLETON, Target.newFromShip(ship1)], - [ship2, EndTurnAction.SINGLETON, Target.newFromShip(ship2)], - [ship1, EndTurnAction.SINGLETON, Target.newFromShip(ship1)], - [ship2, EndTurnAction.SINGLETON, Target.newFromShip(ship2)], - [ship1, weapon.action, Target.newFromShip(ship1)], - [ship1, EndTurnAction.SINGLETON, Target.newFromShip(ship1)], + [ship1, toggle, undefined], + [ship1, toggle, undefined], + [ship1, EndTurnAction.SINGLETON, undefined], + [ship2, EndTurnAction.SINGLETON, undefined], + [ship1, toggle, undefined], + [ship1, EndTurnAction.SINGLETON, undefined], + [ship2, EndTurnAction.SINGLETON, undefined], + [ship1, EndTurnAction.SINGLETON, undefined], + [ship2, EndTurnAction.SINGLETON, undefined], + [ship1, toggle, undefined], + [ship1, EndTurnAction.SINGLETON, undefined], ], [ check => { check.equals(ship1.getValue("power"), 6, "power value"); @@ -67,15 +70,15 @@ module TK.SpaceTac.Specs { check.same(battle.playing_ship, ship1); }, check => { - check.equals(ship1.getValue("power"), 9, "power value"); + check.equals(ship1.getValue("power"), 10, "power value"); check.same(battle.playing_ship, ship2); }, check => { - check.equals(ship1.getValue("power"), 9, "power value"); + check.equals(ship1.getValue("power"), 10, "power value"); check.same(battle.playing_ship, ship1); }, check => { - check.equals(ship1.getValue("power"), 7, "power value"); + check.equals(ship1.getValue("power"), 8, "power value"); check.same(battle.playing_ship, ship1); }, check => { @@ -87,11 +90,11 @@ module TK.SpaceTac.Specs { check.same(battle.playing_ship, ship1); }, check => { - check.equals(ship1.getValue("power"), 9, "power value"); + check.equals(ship1.getValue("power"), 8, "power value"); check.same(battle.playing_ship, ship2); }, check => { - check.equals(ship1.getValue("power"), 9, "power value"); + check.equals(ship1.getValue("power"), 8, "power value"); check.same(battle.playing_ship, ship1); }, check => { @@ -110,13 +113,18 @@ module TK.SpaceTac.Specs { let ship = battle.play_order[0]; let equ1 = TestTools.addWeapon(ship); - equ1.cooldown.configure(1, 3); - equ1.cooldown.use(); + equ1.configureCooldown(1, 3); + let cd1 = ship.actions.getCooldown(equ1); + cd1.use(); + let equ2 = TestTools.addWeapon(ship); - equ2.cooldown.configure(1, 2); - equ2.cooldown.use(); + equ2.configureCooldown(1, 2); + let cd2 = ship.actions.getCooldown(equ2); + cd2.use(); + let equ3 = TestTools.addWeapon(ship); - equ3.cooldown.use(); + let cd3 = ship.actions.getCooldown(equ3); + cd3.use(); TestTools.actionChain(check, battle, [ [ship, EndTurnAction.SINGLETON, Target.newFromShip(ship)], @@ -124,24 +132,24 @@ module TK.SpaceTac.Specs { [ship, EndTurnAction.SINGLETON, Target.newFromShip(ship)], ], [ check => { - check.equals(equ1.cooldown.heat, 3, "equ1 heat"); - check.equals(equ2.cooldown.heat, 2, "equ2 heat"); - check.equals(equ3.cooldown.heat, 0, "equ3 heat"); + check.equals(cd1.heat, 3, "equ1 heat"); + check.equals(cd2.heat, 2, "equ2 heat"); + check.equals(cd3.heat, 0, "equ3 heat"); }, check => { - check.equals(equ1.cooldown.heat, 2, "equ1 heat"); - check.equals(equ2.cooldown.heat, 1, "equ2 heat"); - check.equals(equ3.cooldown.heat, 0, "equ3 heat"); + check.equals(cd1.heat, 2, "equ1 heat"); + check.equals(cd2.heat, 1, "equ2 heat"); + check.equals(cd3.heat, 0, "equ3 heat"); }, check => { - check.equals(equ1.cooldown.heat, 1, "equ1 heat"); - check.equals(equ2.cooldown.heat, 0, "equ2 heat"); - check.equals(equ3.cooldown.heat, 0, "equ3 heat"); + check.equals(cd1.heat, 1, "equ1 heat"); + check.equals(cd2.heat, 0, "equ2 heat"); + check.equals(cd3.heat, 0, "equ3 heat"); }, check => { - check.equals(equ1.cooldown.heat, 0, "equ1 heat"); - check.equals(equ2.cooldown.heat, 0, "equ2 heat"); - check.equals(equ3.cooldown.heat, 0, "equ3 heat"); + check.equals(cd1.heat, 0, "equ1 heat"); + check.equals(cd2.heat, 0, "equ2 heat"); + check.equals(cd3.heat, 0, "equ3 heat"); } ]); }); diff --git a/src/core/actions/EndTurnAction.ts b/src/core/actions/EndTurnAction.ts index c419c2e..ac29b3f 100644 --- a/src/core/actions/EndTurnAction.ts +++ b/src/core/actions/EndTurnAction.ts @@ -4,28 +4,27 @@ module TK.SpaceTac { /** * Action to end the ship's turn * - * This action is not provided by an equipment and is always available + * This action is always available (through its singleton) */ export class EndTurnAction extends BaseAction { // Singleton that may be used for all ships static SINGLETON = new EndTurnAction(); constructor() { - super("endturn"); + super("End turn"); } - getVerb(): string { - return "End ship's turn"; + getVerb(ship: Ship): string { + return this.name; + } + + getTitle(ship: Ship): string { + return this.name; } getActionPointsUsage(ship: Ship, target: Target | null): number { let toggled_cost = isum(imap(ship.iToggleActions(true), action => action.power)); - let power_diff = ship.getAttribute("power_generation") - toggled_cost; - let power_excess = ship.getValue("power") + power_diff - ship.getAttribute("power_capacity"); - if (power_excess > 0) { - power_diff -= power_excess; - } - return -power_diff; + return ship.getValue("power") + toggled_cost - ship.getAttribute("power_capacity"); } getSpecificDiffs(ship: Ship, battle: Battle, target: Target): BaseBattleDiff[] { @@ -33,10 +32,12 @@ module TK.SpaceTac { let result: BaseBattleDiff[] = []; let new_ship = battle.getNextShip(); - // Cool down equipment - ship.listEquipment().filter(equ => equ.cooldown.heat > 0).forEach(equ => { - result.push(new ShipCooldownDiff(ship, equ, 1)); - }); + // Cool down actions + ship.actions.listAll().forEach(action => { + if (ship.actions.getCooldown(action).heat > 0) { + result.push(new ShipCooldownDiff(ship, action, 1)); + } + }) // "On turn end" effects iforeach(ship.active_effects.iterator(), effect => { diff --git a/src/core/actions/MoveAction.spec.ts b/src/core/actions/MoveAction.spec.ts index 152bf59..681ff45 100644 --- a/src/core/actions/MoveAction.spec.ts +++ b/src/core/actions/MoveAction.spec.ts @@ -7,8 +7,8 @@ module TK.SpaceTac.Specs { ship.setValue("power", 6); ship.arena_x = 0; ship.arena_y = 0; - var engine = new Equipment(); - var action = new MoveAction(engine, 10); + var action = new MoveAction("Engine", { distance_per_power: 10 }); + ship.actions.addCustom(action); check.equals(action.getDistanceByActionPoint(ship), 10); @@ -26,7 +26,8 @@ module TK.SpaceTac.Specs { test.case("forbids targetting a ship", check => { var ship1 = new Ship(null, "Test1"); var ship2 = new Ship(null, "Test2"); - var action = new MoveAction(new Equipment()); + var action = new MoveAction(); + ship1.actions.addCustom(action); var result = action.checkTarget(ship1, Target.newFromShip(ship1)); check.equals(result, null); @@ -39,13 +40,11 @@ module TK.SpaceTac.Specs { let battle = TestTools.createBattle(); let ship = battle.play_order[0]; ship.setArenaPosition(500, 600) - TestTools.setShipAP(ship, 20); + TestTools.setShipModel(ship, 100, 0, 20); ship.setValue("power", 5); - let engine = new Equipment(SlotType.Engine); - let action = new MoveAction(engine, 1); - engine.action = action; - ship.addSlot(SlotType.Engine).attach(engine); + let action = new MoveAction("Engine", { distance_per_power: 1 }); + ship.actions.addCustom(action); TestTools.actionChain(check, battle, [ [ship, action, Target.newFromLocation(510, 605)], @@ -67,11 +66,11 @@ module TK.SpaceTac.Specs { var battle = TestTools.createBattle(1, 1); var ship = battle.fleets[0].ships[0]; var enemy = battle.fleets[1].ships[0]; - TestTools.setShipAP(ship, 100); + TestTools.setShipModel(ship, 100, 0, 100); ship.setArenaPosition(500, 500); enemy.setArenaPosition(1000, 500); - var action = new MoveAction(new Equipment(), 1000, 200); + var action = new MoveAction("Engine", { distance_per_power: 1000, safety_distance: 200 }); var result = action.checkLocationTarget(ship, Target.newFromLocation(700, 500)); check.equals(result, Target.newFromLocation(700, 500)); @@ -94,11 +93,11 @@ module TK.SpaceTac.Specs { var ship = battle.fleets[0].ships[0]; var enemy1 = battle.fleets[1].ships[0]; var enemy2 = battle.fleets[1].ships[1]; - TestTools.setShipAP(ship, 100); + TestTools.setShipModel(ship, 100, 0, 100); enemy1.setArenaPosition(0, 800); enemy2.setArenaPosition(0, 1000); - var action = new MoveAction(new Equipment(), 1000, 150); + var action = new MoveAction("Engine", { distance_per_power: 1000, safety_distance: 150 }); var result = action.checkLocationTarget(ship, Target.newFromLocation(0, 1100)); check.equals(result, Target.newFromLocation(0, 650)); @@ -109,11 +108,11 @@ module TK.SpaceTac.Specs { var ship = battle.fleets[0].ships[0]; var enemy1 = battle.fleets[1].ships[0]; var enemy2 = battle.fleets[1].ships[1]; - TestTools.setShipAP(ship, 100); + TestTools.setShipModel(ship, 100, 0, 100); enemy1.setArenaPosition(0, 500); enemy2.setArenaPosition(0, 800); - var action = new MoveAction(new Equipment(), 1000, 600); + var action = new MoveAction("Engine", { distance_per_power: 1000, safety_distance: 600 }); let result = action.checkLocationTarget(ship, Target.newFromLocation(0, 1000)); check.equals(result, null); @@ -124,7 +123,7 @@ module TK.SpaceTac.Specs { test.case("applies ship maneuvrability to determine distance per power point", check => { let ship = new Ship(); - let action = new MoveAction(new Equipment(), 100, undefined, 60); + let action = new MoveAction("Engine", { distance_per_power: 100, maneuvrability_factor: 60 }); TestTools.setAttribute(ship, "maneuvrability", 0); check.nears(action.getDistanceByActionPoint(ship), 40); TestTools.setAttribute(ship, "maneuvrability", 1); @@ -134,7 +133,7 @@ module TK.SpaceTac.Specs { TestTools.setAttribute(ship, "maneuvrability", 10); check.nears(action.getDistanceByActionPoint(ship), 90); - action = new MoveAction(new Equipment(), 100, undefined, 0); + action = new MoveAction("Engine", { distance_per_power: 100, maneuvrability_factor: 0 }); TestTools.setAttribute(ship, "maneuvrability", 0); check.nears(action.getDistanceByActionPoint(ship), 100); TestTools.setAttribute(ship, "maneuvrability", 10); @@ -142,13 +141,13 @@ module TK.SpaceTac.Specs { }); test.case("builds a textual description", check => { - let action = new MoveAction(new Equipment(), 58, 0, 0); + let action = new MoveAction("Engine", { distance_per_power: 58, safety_distance: 0 }); check.equals(action.getEffectsDescription(), "Move: 58km per power point"); - action = new MoveAction(new Equipment(), 58, 12, 0); + action = new MoveAction("Engine", { distance_per_power: 58, safety_distance: 12 }); check.equals(action.getEffectsDescription(), "Move: 58km per power point (safety: 12km)"); - action = new MoveAction(new Equipment(), 58, 12, 80); + action = new MoveAction("Engine", { distance_per_power: 58, safety_distance: 12, maneuvrability_factor: 80 }); check.equals(action.getEffectsDescription(), "Move: 12-58km per power point (safety: 12km)"); }); }); diff --git a/src/core/actions/MoveAction.ts b/src/core/actions/MoveAction.ts index 7231c3c..3d10618 100644 --- a/src/core/actions/MoveAction.ts +++ b/src/core/actions/MoveAction.ts @@ -1,25 +1,47 @@ module TK.SpaceTac { + /** + * Configuration of a trigger action + */ + export interface MoveActionConfig { + // Distance allowed for each power point (raw, without applying maneuvrability) + distance_per_power: number + // Safety distance from other ships + safety_distance: number + // Impact of maneuvrability (in % of distance) + maneuvrability_factor: number + } + /** * Action to move the ship to a specific location */ - export class MoveAction extends BaseAction { - constructor( - // Mandatory equipment - readonly equipment: Equipment, - // Distance allowed for each power point (raw, without applying maneuvrability) - readonly distance_per_power = 0, - // Safety distance from other ships - readonly safety_distance = 120, - // Impact of maneuvrability (in % of distance) - readonly maneuvrability_factor = 0 - ) { - super("move", equipment); + export class MoveAction extends BaseAction implements MoveActionConfig { + distance_per_power = 0 + safety_distance = 120 + maneuvrability_factor = 0 + + constructor(name = "Engine", config?: Partial, code = "move") { + super(name, code); + + if (config) { + this.configureEngine(config); + } } - getVerb(): string { + /** + * Configure the engine + */ + configureEngine(config: Partial): void { + copyfields(config, this); + } + + getVerb(ship: Ship): string { return "Move"; } + getTitle(ship: Ship): string { + return `Use ${this.name}`; + } + getTargettingMode(ship: Ship): ActionTargettingMode { return ActionTargettingMode.SPACE; } @@ -121,7 +143,7 @@ module TK.SpaceTac { protected getSpecificDiffs(ship: Ship, battle: Battle, target: Target): BaseBattleDiff[] { let angle = (arenaDistance(target, ship.location) < 0.00001) ? ship.arena_angle : arenaAngle(ship.location, target); let destination = new ArenaLocationAngle(target.x, target.y, angle); - return [new ShipMoveDiff(ship, ship.location, destination, this.equipment)]; + return [new ShipMoveDiff(ship, ship.location, destination, this)]; } getEffectsDescription(): string { diff --git a/src/core/actions/ToggleAction.spec.ts b/src/core/actions/ToggleAction.spec.ts index 0a9148d..7d65717 100644 --- a/src/core/actions/ToggleAction.spec.ts +++ b/src/core/actions/ToggleAction.spec.ts @@ -1,21 +1,25 @@ module TK.SpaceTac.Specs { testing("ToggleAction", test => { test.case("returns correct targetting mode", check => { - let action = new ToggleAction(new Equipment(), 1, 0, []); - check.same(action.getTargettingMode(new Ship()), ActionTargettingMode.SELF_CONFIRM); + let action = new ToggleAction("testtoggle"); + let ship = new Ship(); + ship.actions.addCustom(action); - action.activated = true; - check.same(action.getTargettingMode(new Ship()), ActionTargettingMode.SELF_CONFIRM); + check.same(action.getTargettingMode(ship), ActionTargettingMode.SELF_CONFIRM); - action = new ToggleAction(new Equipment(), 1, 50, []); - check.same(action.getTargettingMode(new Ship()), ActionTargettingMode.SURROUNDINGS); + ship.actions.toggle(action, true); + check.same(action.getTargettingMode(ship), ActionTargettingMode.SELF_CONFIRM); - action.activated = true; - check.same(action.getTargettingMode(new Ship()), ActionTargettingMode.SELF_CONFIRM); + action = new ToggleAction("testtoggle", { radius: 50 }); + ship.actions.addCustom(action); + check.same(action.getTargettingMode(ship), ActionTargettingMode.SURROUNDINGS); + + ship.actions.toggle(action, true); + check.same(action.getTargettingMode(ship), ActionTargettingMode.SELF_CONFIRM); }) test.case("collects impacted ships", check => { - let action = new ToggleAction(new Equipment(), 1, 50, []); + let action = new ToggleAction("testtoggle", { radius: 50 }); let battle = new Battle(); let ship1 = battle.fleets[0].addShip(); ship1.setArenaPosition(0, 0); diff --git a/src/core/actions/ToggleAction.ts b/src/core/actions/ToggleAction.ts index db10160..ff35dfc 100644 --- a/src/core/actions/ToggleAction.ts +++ b/src/core/actions/ToggleAction.ts @@ -1,35 +1,49 @@ /// module TK.SpaceTac { + /** + * Configuration of a toggle action + */ + export interface ToggleActionConfig { + // Power consumption (while active) + power: number + // Effect radius + radius: number + // Effects applied + effects: BaseEffect[] + } + /** * Action to toggle some effects on the ship or around it, until next turn start * * Toggle actions consume power when activated, and restore it when deactivated */ export class ToggleAction extends BaseAction { - // Current activation status - activated = false + power = 1 + radius = 0 + effects: BaseEffect[] = [] - constructor( - // Mandatory equipment - readonly equipment: Equipment, - // Power consumption (while active) - readonly power = 1, - // Effect radius - readonly radius = 0, - // Effects applied - readonly effects: BaseEffect[] = [], - code = `toggle-${equipment.code}` - ) { - super(code, equipment); + constructor(name: string, config?: Partial, code?: string) { + super(name, code); + + if (config) { + this.configureToggle(config); + } } - getVerb(): string { - return this.activated ? "Deactivate" : "Activate"; + /** + * Configure the toggling + */ + configureToggle(config: Partial): void { + copyfields(config, this); + } + + getVerb(ship: Ship): string { + return ship.actions.isToggled(this) ? "Deactivate" : "Activate"; } getTargettingMode(ship: Ship): ActionTargettingMode { - if (this.activated || !this.radius) { + if (ship.actions.isToggled(this) || !this.radius) { return ActionTargettingMode.SELF_CONFIRM; } else { return ActionTargettingMode.SURROUNDINGS; @@ -37,7 +51,7 @@ module TK.SpaceTac { } getActionPointsUsage(ship: Ship, target: Target | null): number { - return this.activated ? -this.power : this.power; + return ship.actions.isToggled(this) ? -this.power : this.power; } getRangeRadius(ship: Ship): number { @@ -53,14 +67,16 @@ module TK.SpaceTac { } getSpecificDiffs(ship: Ship, battle: Battle, target: Target): BaseBattleDiff[] { + let activated = ship.actions.isToggled(this); + let result: BaseBattleDiff[] = [ - new ShipActionToggleDiff(ship, this, !this.activated) + new ShipActionToggleDiff(ship, this, !activated) ]; let ships = this.getImpactedShips(ship, target, ship.location); ships.forEach(iship => { this.effects.forEach(effect => { - if (this.activated) { + if (activated) { result.push(new ShipEffectRemovedDiff(iship, effect)); result = result.concat(effect.getOffDiffs(iship)); } else { diff --git a/src/core/actions/TriggerAction.spec.ts b/src/core/actions/TriggerAction.spec.ts index 402b884..33c7d4b 100644 --- a/src/core/actions/TriggerAction.spec.ts +++ b/src/core/actions/TriggerAction.spec.ts @@ -1,25 +1,23 @@ module TK.SpaceTac.Specs { testing("TriggerAction", test => { test.case("constructs correctly", check => { - let equipment = new Equipment(SlotType.Weapon, "testweapon"); - let action = new TriggerAction(equipment, [], 4, 30, 10); - - check.equals(action.code, "fire-testweapon"); + let action = new TriggerAction("testweapon", { power: 4, range: 30, blast: 10 }); + check.equals(action.code, "testweapon"); check.equals(action.getVerb(), "Fire"); - check.same(action.equipment, equipment); + + action = new TriggerAction("testweapon", { blast: 10 }); + check.equals(action.getVerb(), "Trigger"); }) test.case("applies effects to alive ships in blast radius", check => { let fleet = new Fleet(); let ship = new Ship(fleet, "ship"); - let equipment = new Equipment(SlotType.Weapon, "testweapon"); let effect = new BaseEffect("testeffect"); let mock_apply = check.patch(effect, "getOnDiffs"); - let action = new TriggerAction(equipment, [effect], 5, 100, 10); - equipment.action = action; - ship.addSlot(SlotType.Weapon).attach(equipment); + let action = new TriggerAction("testweapon", { power: 5, range: 100, blast: 10, effects: [effect] }); - TestTools.setShipAP(ship, 10); + TestTools.setShipModel(ship, 100, 0, 10); + ship.actions.addCustom(action); let ship1 = new Ship(fleet, "ship1"); ship1.setArenaPosition(65, 72); @@ -45,8 +43,7 @@ module TK.SpaceTac.Specs { ship1.setArenaPosition(50, 10); let ship2 = new Ship(); ship2.setArenaPosition(150, 10); - let weapon = TestTools.addWeapon(ship1, 1, 0, 100, 30); - let action = nn(weapon.action); + let action = TestTools.addWeapon(ship1, 1, 0, 100, 30); let target = action.checkTarget(ship1, new Target(150, 10)); check.equals(target, new Target(150, 10)); @@ -74,14 +71,14 @@ module TK.SpaceTac.Specs { ship3.setArenaPosition(0, 30); let ships = [ship1, ship2, ship3]; - let action = new TriggerAction(new Equipment(), [], 1, 50); + let action = new TriggerAction("testaction", { range: 50 }); check.equals(action.filterImpactedShips({ x: 0, y: 0 }, Target.newFromShip(ship2), ships), [ship2]); check.equals(action.filterImpactedShips({ x: 0, y: 0 }, Target.newFromLocation(10, 50), ships), []); - action = new TriggerAction(new Equipment(), [], 1, 50, 40); + action = new TriggerAction("testaction", { range: 50, blast: 40 }); check.equals(action.filterImpactedShips({ x: 0, y: 0 }, Target.newFromLocation(20, 20), ships), [ship1, ship3]); - action = new TriggerAction(new Equipment(), [], 1, 100, 0, 30); + action = new TriggerAction("testaction", { range: 100, angle: 30 }); check.equals(action.filterImpactedShips({ x: 0, y: 51 }, Target.newFromLocation(30, 50), ships), [ship1, ship2]); }) @@ -93,7 +90,7 @@ module TK.SpaceTac.Specs { TestTools.setAttribute(ship1, "precision", precision); TestTools.setAttribute(ship2, "maneuvrability", maneuvrability); - let action = new TriggerAction(new Equipment(), [], 1, 0, 0, 0, precision_factor, maneuvrability_factor); + let action = new TriggerAction("testaction", { aim: precision_factor, evasion: maneuvrability_factor }); check.nears(action.getSuccessFactor(ship1, ship2), result, 3, `precision ${precision} (weight ${precision_factor}), maneuvrability ${maneuvrability} (weight ${maneuvrability_factor})`); } @@ -134,7 +131,7 @@ module TK.SpaceTac.Specs { function verify(success_base: number, luck: number, random: number, expected: number) { let ship1 = new Ship(); let ship2 = new Ship(); - let action = new TriggerAction(new Equipment(), [], 1, 0, 0, 0, 0, 0, luck); + let action = new TriggerAction("testaction", { luck: luck }); check.patch(action, "getSuccessFactor", () => success_base); check.nears(action.getEffectiveSuccess(ship1, ship2, new SkewedRandomGenerator([random])), expected, 5, `success ${success_base}, luck ${luck}, random ${random}`); @@ -163,28 +160,26 @@ module TK.SpaceTac.Specs { test.case("guesses targetting mode", check => { let ship = new Ship(); - let equ = new Equipment(); - let action = new TriggerAction(equ, []); + let action = new TriggerAction("testaction"); check.equals(action.getTargettingMode(ship), ActionTargettingMode.SELF_CONFIRM, "self"); - action = new TriggerAction(equ, [], 1, 50); + action = new TriggerAction("testaction", { range: 50 }); check.equals(action.getTargettingMode(ship), ActionTargettingMode.SHIP, "ship"); - action = new TriggerAction(equ, [], 1, 50, 20); + action = new TriggerAction("testaction", { range: 50, blast: 20 }); check.equals(action.getTargettingMode(ship), ActionTargettingMode.SPACE, "blast"); - action = new TriggerAction(equ, [], 1, 0, 20); + action = new TriggerAction("testaction", { blast: 20 }); check.equals(action.getTargettingMode(ship), ActionTargettingMode.SURROUNDINGS, "surroundings"); - action = new TriggerAction(equ, [], 1, 50, 0, 15); + action = new TriggerAction("testaction", { range: 50, angle: 15 }); check.equals(action.getTargettingMode(ship), ActionTargettingMode.SPACE, "angle"); }) test.case("rotates toward the target", check => { let battle = TestTools.createBattle(); let ship = battle.play_order[0]; - let weapon = TestTools.addWeapon(ship, 1, 0, 100, 30); - let action = nn(weapon.action); + let action = TestTools.addWeapon(ship, 1, 0, 100, 30); check.patch(action, "checkTarget", (ship: Ship, target: Target) => target); check.equals(ship.arena_angle, 0); @@ -198,32 +193,32 @@ module TK.SpaceTac.Specs { }) test.case("builds a textual description", check => { - let effects: BaseEffect[] = []; - let action = new TriggerAction(new Equipment(), effects, 0); + let action = new TriggerAction(); check.equals(action.getEffectsDescription(), ""); - effects.push(new AttributeMultiplyEffect("precision", 20)); + let effects: BaseEffect[] = [new AttributeMultiplyEffect("precision", 20)]; + action.configureTrigger({ effects: effects, power: 0 }); check.equals(action.getEffectsDescription(), "Trigger:\n• precision +20% on self"); - action = new TriggerAction(new Equipment(), effects, 2); + action.configureTrigger({ effects: effects, power: 2 }); check.equals(action.getEffectsDescription(), "Trigger (power 2):\n• precision +20% on self"); - action = new TriggerAction(new Equipment(), effects, 2, 120); + action.configureTrigger({ effects: effects, power: 2, range: 120 }); check.equals(action.getEffectsDescription(), "Fire (power 2, range 120km):\n• precision +20% on target"); - action = new TriggerAction(new Equipment(), effects, 2, 120, 0, 0, 10); + action.configureTrigger({ effects: effects, power: 2, range: 120, aim: 10 }); check.equals(action.getEffectsDescription(), "Fire (power 2, range 120km, aim +10%):\n• precision +20% on target"); - action = new TriggerAction(new Equipment(), effects, 2, 120, 0, 0, 10, 35); + action.configureTrigger({ effects: effects, power: 2, range: 120, aim: 10, evasion: 35 }); check.equals(action.getEffectsDescription(), "Fire (power 2, range 120km, aim +10%, evasion -35%):\n• precision +20% on target"); - action = new TriggerAction(new Equipment(), effects, 2, 120, 0, 80, 10, 35); + action.configureTrigger({ effects: effects, power: 2, range: 120, aim: 10, evasion: 35, angle: 80 }); check.equals(action.getEffectsDescription(), "Fire (power 2, range 120km, aim +10%, evasion -35%):\n• precision +20% in 80° arc"); - action = new TriggerAction(new Equipment(), effects, 2, 120, 100, 80, 10, 35); + action.configureTrigger({ effects: effects, power: 2, range: 120, aim: 10, evasion: 35, blast: 100, angle: 80 }); check.equals(action.getEffectsDescription(), "Fire (power 2, range 120km, aim +10%, evasion -35%):\n• precision +20% in 100km radius"); - action = new TriggerAction(new Equipment(), effects, 2, 120, 100, 80, 10, 35, 15); + action.configureTrigger({ effects: effects, power: 2, range: 120, aim: 10, evasion: 35, blast: 100, angle: 80, luck: 15 }); check.equals(action.getEffectsDescription(), "Fire (power 2, range 120km, aim +10%, evasion -35%, luck ±15%):\n• precision +20% in 100km radius"); }) }); diff --git a/src/core/actions/TriggerAction.ts b/src/core/actions/TriggerAction.ts index 0d44156..a18fd17 100644 --- a/src/core/actions/TriggerAction.ts +++ b/src/core/actions/TriggerAction.ts @@ -1,34 +1,56 @@ /// module TK.SpaceTac { + /** + * Configuration of a trigger action + */ + export interface TriggerActionConfig { + // Effects applied on target + effects: BaseEffect[] + // Power consumption + power: number + // Maximal range of the weapon (distance to target) + range: number + // Radius around the target that will be impacted + blast: number + // Angle of the area between the source and the target that will be impacted + angle: number + // Influence of "precision" of firing ship (0..100) + aim: number + // Influence of "maneuvrability" of impacted ship (0..100) + evasion: number + // Influence of luck (0..100) + luck: number + } + /** * Action to trigger an equipment (for example a weapon), with an optional target * * The target will be resolved as a list of ships, on which all the action effects will be applied */ - export class TriggerAction extends BaseAction { - constructor( - // Mandatory equipment - readonly equipment: Equipment, - // Effects applied on target - readonly effects: BaseEffect[] = [], - // Power consumption - readonly power = 1, - // Maximal range of the weapon (distance to target) - readonly range = 0, - // Radius around the target that will be impacted - readonly blast = 0, - // Angle of the area between the source and the target that will be impacted - readonly angle = 0, - // Influence of "precision" of firing ship (0..100) - readonly aim = 0, - // Influence of "maneuvrability" of impacted ship (0..100) - readonly evasion = 0, - // Influence of luck - readonly luck = 0, - code = `fire-${equipment.code}` - ) { - super(code, equipment); + export class TriggerAction extends BaseAction implements TriggerActionConfig { + effects: BaseEffect[] = [] + power = 1 + range = 0 + blast = 0 + angle = 0 + aim = 0 + evasion = 0 + luck = 0 + + constructor(name?: string, config?: Partial, code?: string) { + super(name, code); + + if (config) { + this.configureTrigger(config); + } + } + + /** + * Configure the triggering and effects of this action + */ + configureTrigger(config: Partial) { + copyfields(config, this); } getVerb(): string { @@ -180,13 +202,13 @@ module TK.SpaceTac { let angle = arenaAngle(ship.location, target); if (Math.abs(angularDifference(angle, ship.arena_angle)) > 1e-6) { let destination = new ArenaLocationAngle(ship.arena_x, ship.arena_y, angle); - let engine = first(ship.listEquipment(SlotType.Engine), () => true); + let engine = first(ship.actions.listAll(), action => action instanceof MoveAction); result.push(new ShipMoveDiff(ship, ship.location, destination, engine)); } // Fire a projectile - if (this.equipment && this.equipment.slot_type == SlotType.Weapon) { - result.push(new ProjectileFiredDiff(ship, this.equipment, target)); + if (this.range) { + result.push(new ProjectileFiredDiff(ship, this, target)); } } diff --git a/src/core/ai/Maneuver.spec.ts b/src/core/ai/Maneuver.spec.ts index a3d9bf0..bc1fc4b 100644 --- a/src/core/ai/Maneuver.spec.ts +++ b/src/core/ai/Maneuver.spec.ts @@ -6,23 +6,23 @@ module TK.SpaceTac.Specs { let ship2 = battle.fleets[1].addShip(); let ship3 = battle.fleets[1].addShip(); let ship4 = battle.fleets[1].addShip(); + ship1.setArenaPosition(0, 0); + TestTools.setShipModel(ship1, 20, 20, 10); + ship2.setArenaPosition(500, 0); + TestTools.setShipModel(ship2, 70, 100); + ship3.setArenaPosition(560, 0); + TestTools.setShipModel(ship3, 80, 30); + ship4.setArenaPosition(640, 0); + TestTools.setShipModel(ship4, 30, 30); + let weapon = TestTools.addWeapon(ship1, 50, 2, 200, 100); let engine = TestTools.addEngine(ship1, 100); - ship1.setArenaPosition(0, 0); - TestTools.setShipHP(ship1, 20, 20); - TestTools.setShipAP(ship1, 10); - ship2.setArenaPosition(500, 0); - TestTools.setShipHP(ship2, 70, 100); - ship3.setArenaPosition(560, 0); - TestTools.setShipHP(ship3, 80, 30); - ship4.setArenaPosition(640, 0); - TestTools.setShipHP(ship4, 30, 30); - let maneuver = new Maneuver(ship1, nn(weapon.action), Target.newFromLocation(530, 0)); - check.contains(maneuver.effects, new ShipActionUsedDiff(ship1, nn(engine.action), Target.newFromLocation(331, 0)), "engine use"); + let maneuver = new Maneuver(ship1, weapon, Target.newFromLocation(530, 0)); + check.contains(maneuver.effects, new ShipActionUsedDiff(ship1, engine, Target.newFromLocation(331, 0)), "engine use"); check.contains(maneuver.effects, new ShipValueDiff(ship1, "power", -4), "engine power"); check.contains(maneuver.effects, new ShipMoveDiff(ship1, ship1.location, new ArenaLocationAngle(331, 0), engine), "move"); - check.contains(maneuver.effects, new ShipActionUsedDiff(ship1, nn(weapon.action), Target.newFromLocation(530, 0)), "weapon use"); + check.contains(maneuver.effects, new ShipActionUsedDiff(ship1, weapon, Target.newFromLocation(530, 0)), "weapon use"); check.contains(maneuver.effects, new ProjectileFiredDiff(ship1, weapon, Target.newFromLocation(530, 0)), "weapon power"); check.contains(maneuver.effects, new ShipValueDiff(ship1, "power", -2), "weapon power"); check.contains(maneuver.effects, new ShipValueDiff(ship2, "shield", -50), "ship2 shield value"); diff --git a/src/core/ai/TacticalAIHelpers.spec.ts b/src/core/ai/TacticalAIHelpers.spec.ts index 836c37e..5781eb2 100644 --- a/src/core/ai/TacticalAIHelpers.spec.ts +++ b/src/core/ai/TacticalAIHelpers.spec.ts @@ -7,7 +7,7 @@ module TK.SpaceTac.Specs { let ship1a = battle.fleets[1].addShip(new Ship(null, "1A")); let ship1b = battle.fleets[1].addShip(new Ship(null, "1B")); - TestTools.setShipAP(ship0a, 10); + TestTools.setShipModel(ship0a, 100, 0, 10); TestTools.setShipPlaying(battle, ship0a); let result = imaterialize(TacticalAIHelpers.produceDirectShots(ship0a, battle)); @@ -17,10 +17,10 @@ module TK.SpaceTac.Specs { let weapon2 = TestTools.addWeapon(ship0a, 15); result = imaterialize(TacticalAIHelpers.produceDirectShots(ship0a, battle)); check.equals(result.length, 4); - check.contains(result, new Maneuver(ship0a, nn(weapon1.action), Target.newFromShip(ship1a))); - check.contains(result, new Maneuver(ship0a, nn(weapon1.action), Target.newFromShip(ship1b))); - check.contains(result, new Maneuver(ship0a, nn(weapon2.action), Target.newFromShip(ship1a))); - check.contains(result, new Maneuver(ship0a, nn(weapon2.action), Target.newFromShip(ship1b))); + check.contains(result, new Maneuver(ship0a, weapon1, Target.newFromShip(ship1a))); + check.contains(result, new Maneuver(ship0a, weapon1, Target.newFromShip(ship1b))); + check.contains(result, new Maneuver(ship0a, weapon2, Target.newFromShip(ship1a))); + check.contains(result, new Maneuver(ship0a, weapon2, Target.newFromShip(ship1b))); }); test.case("produces random moves inside a grid", check => { @@ -29,7 +29,7 @@ module TK.SpaceTac.Specs { battle.height = 100; let ship = battle.fleets[0].addShip(); - TestTools.setShipAP(ship, 10); + TestTools.setShipModel(ship, 100, 0, 10); TestTools.setShipPlaying(battle, ship); let result = imaterialize(TacticalAIHelpers.produceRandomMoves(ship, battle, 2, 1)); @@ -39,10 +39,10 @@ module TK.SpaceTac.Specs { result = imaterialize(TacticalAIHelpers.produceRandomMoves(ship, battle, 2, 1, new SkewedRandomGenerator([0.5], true))); check.equals(result, [ - new Maneuver(ship, nn(engine.action), Target.newFromLocation(25, 25)), - new Maneuver(ship, nn(engine.action), Target.newFromLocation(75, 25)), - new Maneuver(ship, nn(engine.action), Target.newFromLocation(25, 75)), - new Maneuver(ship, nn(engine.action), Target.newFromLocation(75, 75)), + new Maneuver(ship, engine, Target.newFromLocation(25, 25)), + new Maneuver(ship, engine, Target.newFromLocation(75, 25)), + new Maneuver(ship, engine, Target.newFromLocation(25, 75)), + new Maneuver(ship, engine, Target.newFromLocation(75, 75)), ]); }); @@ -51,8 +51,9 @@ module TK.SpaceTac.Specs { let ship = battle.fleets[0].addShip(); let weapon = TestTools.addWeapon(ship, 50, 1, 1000, 105); - TestTools.setShipAP(ship, 10); + TestTools.setShipModel(ship, 100, 0, 10); TestTools.setShipPlaying(battle, ship); + ship.actions.addCustom(weapon); let result = imaterialize(TacticalAIHelpers.produceInterestingBlastShots(ship, battle)); check.equals(result.length, 0); @@ -68,8 +69,8 @@ module TK.SpaceTac.Specs { result = imaterialize(TacticalAIHelpers.produceInterestingBlastShots(ship, battle)); check.equals(result, [ - new Maneuver(ship, nn(weapon.action), Target.newFromLocation(600, 0)), - new Maneuver(ship, nn(weapon.action), Target.newFromLocation(600, 0)), + new Maneuver(ship, weapon, Target.newFromLocation(600, 0)), + new Maneuver(ship, weapon, Target.newFromLocation(600, 0)), ]); let enemy3 = battle.fleets[1].addShip(); @@ -77,8 +78,8 @@ module TK.SpaceTac.Specs { result = imaterialize(TacticalAIHelpers.produceInterestingBlastShots(ship, battle)); check.equals(result, [ - new Maneuver(ship, nn(weapon.action), Target.newFromLocation(600, 0)), - new Maneuver(ship, nn(weapon.action), Target.newFromLocation(600, 0)), + new Maneuver(ship, weapon, Target.newFromLocation(600, 0)), + new Maneuver(ship, weapon, Target.newFromLocation(600, 0)), ]); }); @@ -86,7 +87,7 @@ module TK.SpaceTac.Specs { let battle = new Battle(); let ship = battle.fleets[0].addShip(); let weapon = TestTools.addWeapon(ship, 50, 5, 100); - let action = nn(weapon.action); + let action = weapon; let engine = TestTools.addEngine(ship, 25); let maneuver = new Maneuver(ship, new BaseAction("fake"), new Target(0, 0), 0); @@ -95,11 +96,11 @@ module TK.SpaceTac.Specs { maneuver = new Maneuver(ship, action, Target.newFromLocation(100, 0), 0); check.same(TacticalAIHelpers.evaluateTurnCost(ship, battle, maneuver), -Infinity); - TestTools.setShipAP(ship, 4); + TestTools.setShipModel(ship, 100, 0, 4, 1, [engine, action]); maneuver = new Maneuver(ship, action, Target.newFromLocation(100, 0), 0); check.same(TacticalAIHelpers.evaluateTurnCost(ship, battle, maneuver), -Infinity); - TestTools.setShipAP(ship, 10); + TestTools.setShipModel(ship, 100, 0, 10, 1, [engine, action]); maneuver = new Maneuver(ship, action, Target.newFromLocation(100, 0), 0); check.equals(TacticalAIHelpers.evaluateTurnCost(ship, battle, maneuver), 0.5); // 5 power remaining on 10 @@ -116,37 +117,37 @@ module TK.SpaceTac.Specs { test.case("evaluates the drawback of doing nothing", check => { let battle = new Battle(); let ship = battle.fleets[0].addShip(); - TestTools.setShipAP(ship, 10, 5); + TestTools.setShipModel(ship, 100, 0, 10); let engine = TestTools.addEngine(ship, 50); let weapon = TestTools.addWeapon(ship, 10, 2, 100, 10); - let maneuver = new Maneuver(ship, nn(weapon.action), Target.newFromLocation(0, 0)); - check.equals(TacticalAIHelpers.evaluateIdling(ship, battle, maneuver), -0.3); + let maneuver = new Maneuver(ship, weapon, Target.newFromLocation(0, 0)); + check.equals(TacticalAIHelpers.evaluateIdling(ship, battle, maneuver), 0.5); - maneuver = new Maneuver(ship, nn(engine.action), Target.newFromLocation(0, 0)); - check.equals(TacticalAIHelpers.evaluateIdling(ship, battle, maneuver), -0.5); + maneuver = new Maneuver(ship, engine, Target.newFromLocation(0, 0)); + check.equals(TacticalAIHelpers.evaluateIdling(ship, battle, maneuver), 0); + + maneuver = new Maneuver(ship, EndTurnAction.SINGLETON, Target.newFromShip(ship)); + check.equals(TacticalAIHelpers.evaluateIdling(ship, battle, maneuver), -1); ship.setValue("power", 2); - maneuver = new Maneuver(ship, nn(weapon.action), Target.newFromLocation(0, 0)); - check.equals(TacticalAIHelpers.evaluateIdling(ship, battle, maneuver), 0.5); - - maneuver = new Maneuver(ship, nn(engine.action), Target.newFromLocation(0, 0)); - check.equals(TacticalAIHelpers.evaluateIdling(ship, battle, maneuver), 0); + maneuver = new Maneuver(ship, EndTurnAction.SINGLETON, Target.newFromShip(ship)); + check.equals(TacticalAIHelpers.evaluateIdling(ship, battle, maneuver), -0.2); }); test.case("evaluates damage to enemies", check => { let battle = new Battle(); let ship = battle.fleets[0].addShip(); let weapon = TestTools.addWeapon(ship, 50, 5, 500, 100); - let action = nn(weapon.action); + let action = weapon; let enemy1 = battle.fleets[1].addShip(); enemy1.setArenaPosition(250, 0); - TestTools.setShipHP(enemy1, 50, 25); + TestTools.setShipModel(enemy1, 50, 25); let enemy2 = battle.fleets[1].addShip(); enemy2.setArenaPosition(300, 0); - TestTools.setShipHP(enemy2, 25, 0); + TestTools.setShipModel(enemy2, 25, 0); // no enemies hurt let maneuver = new Maneuver(ship, action, Target.newFromLocation(100, 0)); @@ -164,11 +165,11 @@ module TK.SpaceTac.Specs { test.case("evaluates ship clustering", check => { let battle = new Battle(); let ship = battle.fleets[0].addShip(); + TestTools.setShipModel(ship, 100, 0, 10); TestTools.addEngine(ship, 100); - TestTools.setShipAP(ship, 10); let weapon = TestTools.addWeapon(ship, 100, 1, 100, 10); - let maneuver = new Maneuver(ship, nn(weapon.action), Target.newFromLocation(200, 0), 0.5); + let maneuver = new Maneuver(ship, weapon, Target.newFromLocation(200, 0), 0.5); check.nears(maneuver.simulation.move_location.x, 100.5, 1); check.equals(maneuver.simulation.move_location.y, 0); check.equals(TacticalAIHelpers.evaluateClustering(ship, battle, maneuver), 0); @@ -190,7 +191,7 @@ module TK.SpaceTac.Specs { let battle = new Battle(undefined, undefined, 200, 100); let ship = battle.fleets[0].addShip(); let weapon = TestTools.addWeapon(ship, 1, 1, 400); - let action = nn(weapon.action); + let action = weapon; ship.setArenaPosition(0, 0); let maneuver = new Maneuver(ship, action, new Target(0, 0), 0); @@ -214,19 +215,27 @@ module TK.SpaceTac.Specs { let ship = battle.fleets[0].addShip(); let weapon = TestTools.addWeapon(ship, 1, 1, 400); - let maneuver = new Maneuver(ship, nn(weapon.action), new Target(0, 0)); + let maneuver = new Maneuver(ship, weapon, new Target(0, 0)); check.equals(TacticalAIHelpers.evaluateOverheat(ship, battle, maneuver), 0); - weapon.cooldown.configure(1, 1); + weapon.configureCooldown(1, 1); + ship.actions.updateFromShip(ship); + ship.actions.addCustom(weapon); check.equals(TacticalAIHelpers.evaluateOverheat(ship, battle, maneuver), -0.4); - weapon.cooldown.configure(1, 2); + weapon.configureCooldown(1, 2); + ship.actions.updateFromShip(ship); + ship.actions.addCustom(weapon); check.equals(TacticalAIHelpers.evaluateOverheat(ship, battle, maneuver), -0.8); - weapon.cooldown.configure(1, 3); + weapon.configureCooldown(1, 3); + ship.actions.updateFromShip(ship); + ship.actions.addCustom(weapon); check.equals(TacticalAIHelpers.evaluateOverheat(ship, battle, maneuver), -1); - weapon.cooldown.configure(2, 1); + weapon.configureCooldown(2, 1); + ship.actions.updateFromShip(ship); + ship.actions.addCustom(weapon); check.equals(TacticalAIHelpers.evaluateOverheat(ship, battle, maneuver), 0); }); }); diff --git a/src/core/ai/TacticalAIHelpers.ts b/src/core/ai/TacticalAIHelpers.ts index 7b3177f..7a36be2 100644 --- a/src/core/ai/TacticalAIHelpers.ts +++ b/src/core/ai/TacticalAIHelpers.ts @@ -14,7 +14,7 @@ module TK.SpaceTac { * Get a list of all playable actions (like the actionbar for player) for a ship */ function getPlayableActions(ship: Ship): Iterator { - let actions = ship.getAvailableActions(); + let actions = ship.actions.listAll(); return ifilter(iarray(actions), action => !action.checkCannotBeApplied(ship)); } @@ -142,10 +142,11 @@ module TK.SpaceTac { * Evaluate doing nothing, between -1 and 1 */ static evaluateIdling(ship: Ship, battle: Battle, maneuver: Maneuver): number { - let lost = ship.getValue("power") - maneuver.getPowerUsage() + ship.getAttribute("power_generation") - ship.getAttribute("power_capacity"); - if (lost > 0) { - return -lost / ship.getAttribute("power_capacity"); - } else if (maneuver.action instanceof TriggerAction || maneuver.action instanceof DeployDroneAction) { + if (maneuver.action instanceof EndTurnAction) { + return -ship.getValue("power") / ship.getAttribute("power_capacity"); + } else if (maneuver.action instanceof TriggerAction || maneuver.action instanceof ToggleAction) { + // TODO Evaluate if drone is useful + // TODO Check there are "interesting" effects if (maneuver.effects.length == 0) { return -1; } else { @@ -215,8 +216,9 @@ module TK.SpaceTac { * Evaluate the cost of overheating an equipment */ static evaluateOverheat(ship: Ship, battle: Battle, maneuver: Maneuver): number { - if (maneuver.action.equipment && maneuver.action.equipment.cooldown.willOverheat()) { - return -Math.min(1, 0.4 * maneuver.action.equipment.cooldown.cooling); + let cooldown = ship.actions.getCooldown(maneuver.action); + if (cooldown.willOverheat()) { + return -Math.min(1, 0.4 * cooldown.cooling); } else { return 0; } diff --git a/src/core/diffs/EndBattleDiff.spec.ts b/src/core/diffs/EndBattleDiff.spec.ts index 5c18bbe..a2ae94c 100644 --- a/src/core/diffs/EndBattleDiff.spec.ts +++ b/src/core/diffs/EndBattleDiff.spec.ts @@ -6,13 +6,6 @@ module TK.SpaceTac.Specs { let ship1 = battle.fleets[0].addShip(); let ship2 = battle.fleets[1].addShip(); - let equ1 = new Equipment(SlotType.Weapon); - equ1.price = 10000; - ship1.addSlot(SlotType.Weapon).attach(equ1); - let equ2 = new Equipment(SlotType.Weapon); - equ2.price = 20000; - ship2.addSlot(SlotType.Weapon).attach(equ2); - battle.start(); TestTools.diffChain(check, battle, [ @@ -21,20 +14,10 @@ module TK.SpaceTac.Specs { check => { check.equals(battle.ended, false, "battle is ongoing"); check.equals(battle.outcome, null, "battle has no outcome"); - check.equals(equ1.wear, 0, "equipment1 wear"); - check.equals(equ2.wear, 0, "equipment2 wear"); - check.equals(battle.stats.getImportant(1), [ - { name: 'Equipment wear (zotys)', attacker: 10000, defender: 20000 } - ], "stats stores equipment value"); }, check => { check.equals(battle.ended, true, "battle is ended"); check.same(nn(battle.outcome).winner, battle.fleets[1], "battle has an outcome"); - check.equals(equ1.wear, 4, "equipment1 wear"); - check.equals(equ2.wear, 4, "equipment2 wear"); - check.equals(battle.stats.getImportant(1), [ - { name: 'Equipment wear (zotys)', attacker: 80, defender: 159 } - ], "stats stores equipment wear"); }, ]); }); diff --git a/src/core/diffs/EndBattleDiff.ts b/src/core/diffs/EndBattleDiff.ts index 9483d85..9a9540e 100644 --- a/src/core/diffs/EndBattleDiff.ts +++ b/src/core/diffs/EndBattleDiff.ts @@ -22,26 +22,10 @@ module TK.SpaceTac { apply(battle: Battle): void { battle.outcome = this.outcome; - - iforeach(battle.iships(), ship => { - ship.listEquipment().forEach(equipment => { - equipment.addWear(this.cycles); - }); - }); - - battle.stats.addFleetsValue(battle.fleets[0], battle.fleets[1], false); } revert(battle: Battle): void { battle.outcome = null; - - battle.stats.addFleetsValue(battle.fleets[0], battle.fleets[1], true); - - iforeach(battle.iships(), ship => { - ship.listEquipment().forEach(equipment => { - equipment.addWear(-this.cycles); - }); - }); } } } diff --git a/src/core/diffs/ProjectileFiredDiff.ts b/src/core/diffs/ProjectileFiredDiff.ts index 0483956..e2af613 100644 --- a/src/core/diffs/ProjectileFiredDiff.ts +++ b/src/core/diffs/ProjectileFiredDiff.ts @@ -7,13 +7,13 @@ module TK.SpaceTac { * This does not do anything, and is just there for animations */ export class ProjectileFiredDiff extends BaseBattleShipDiff { - equipment: RObjectId + action: RObjectId target: Target - constructor(ship: Ship, equipment: Equipment, target: Target) { + constructor(ship: Ship, action: TriggerAction, target: Target) { super(ship); - this.equipment = equipment.id; + this.action = action.id; this.target = target; } } diff --git a/src/core/diffs/ShipActionToggleDiff.spec.ts b/src/core/diffs/ShipActionToggleDiff.spec.ts index 8fcdd26..dbbc135 100644 --- a/src/core/diffs/ShipActionToggleDiff.spec.ts +++ b/src/core/diffs/ShipActionToggleDiff.spec.ts @@ -4,23 +4,22 @@ module TK.SpaceTac.Specs { let battle = new Battle(); let ship = battle.fleets[0].addShip(); - let generator = TestTools.setShipAP(ship, 10); - let weapon = TestTools.addWeapon(ship, 50, 3, 10, 20); - let action = new ToggleAction(weapon, 2); - weapon.action = action; + let generator = TestTools.setShipModel(ship, 100, 0, 10); + let action = new ToggleAction("testtoggle", { power: 2 }); + ship.actions.addCustom(action); TestTools.diffChain(check, battle, [ new ShipActionToggleDiff(ship, action, true), new ShipActionToggleDiff(ship, action, false), ], [ check => { - check.equals(action.activated, false, "not activated"); + check.equals(ship.actions.isToggled(action), false, "not activated"); }, check => { - check.equals(action.activated, true, "activated"); + check.equals(ship.actions.isToggled(action), true, "activated"); }, check => { - check.equals(action.activated, false, "not activated"); + check.equals(ship.actions.isToggled(action), false, "not activated"); }, ]); }); diff --git a/src/core/diffs/ShipActionToggleDiff.ts b/src/core/diffs/ShipActionToggleDiff.ts index 5374978..c3d26d9 100644 --- a/src/core/diffs/ShipActionToggleDiff.ts +++ b/src/core/diffs/ShipActionToggleDiff.ts @@ -19,12 +19,13 @@ module TK.SpaceTac { } applyOnShip(ship: Ship, battle: Battle): void { - let action = ship.getAction(this.action); + let action = ship.actions.getById(this.action); if (action && action instanceof ToggleAction) { - if (action.activated == this.activated) { + let activated = ship.actions.isToggled(action); + if (activated == this.activated) { console.warn("Diff not applied - action already in good state", this, action); } else { - action.activated = this.activated; + ship.actions.toggle(action, this.activated); } } else { console.error("Diff not applied - action not found on ship", this, ship); diff --git a/src/core/diffs/ShipActionUsedDiff.spec.ts b/src/core/diffs/ShipActionUsedDiff.spec.ts index fdf74d9..5271582 100644 --- a/src/core/diffs/ShipActionUsedDiff.spec.ts +++ b/src/core/diffs/ShipActionUsedDiff.spec.ts @@ -4,28 +4,23 @@ module TK.SpaceTac.Specs { let battle = new Battle(); let ship = battle.fleets[0].addShip(); - let generator = TestTools.setShipAP(ship, 10); + let generator = TestTools.setShipModel(ship, 100, 0, 10); let weapon = TestTools.addWeapon(ship, 50, 3, 10, 20); - weapon.cooldown.configure(2, 1); + weapon.configureCooldown(2, 1); + let cooldown = ship.actions.getCooldown(weapon); TestTools.diffChain(check, battle, [ - new ShipActionUsedDiff(ship, nn(weapon.action), Target.newFromShip(ship)), - new ShipActionUsedDiff(ship, nn(weapon.action), Target.newFromShip(ship)), + new ShipActionUsedDiff(ship, weapon, Target.newFromShip(ship)), + new ShipActionUsedDiff(ship, weapon, Target.newFromShip(ship)), ], [ check => { - check.equals(weapon.cooldown.getRemainingUses(), 2, "cooldown"); - check.equals(weapon.wear, 0, "weapon wear"); - check.equals(generator.wear, 0, "generator wear"); + check.equals(cooldown.getRemainingUses(), 2, "cooldown"); }, check => { - check.equals(weapon.cooldown.getRemainingUses(), 1, "cooldown"); - check.equals(weapon.wear, 1, "weapon wear"); - check.equals(generator.wear, 1, "generator wear"); + check.equals(cooldown.getRemainingUses(), 1, "cooldown"); }, check => { - check.equals(weapon.cooldown.getRemainingUses(), 0, "cooldown"); - check.equals(weapon.wear, 2, "weapon wear"); - check.equals(generator.wear, 2, "generator wear"); + check.equals(cooldown.getRemainingUses(), 0, "cooldown"); }, ]); }); diff --git a/src/core/diffs/ShipActionUsedDiff.ts b/src/core/diffs/ShipActionUsedDiff.ts index c92ea6e..41a73b3 100644 --- a/src/core/diffs/ShipActionUsedDiff.ts +++ b/src/core/diffs/ShipActionUsedDiff.ts @@ -23,40 +23,30 @@ module TK.SpaceTac { } protected applyOnShip(ship: Ship, battle: Battle): void { - let action = first(ship.getAvailableActions(), action => action.is(this.action)); + let action = ship.actions.getById(this.action); if (!action) { console.error("Action failed - not found on ship", this, ship); return; } - if (action.cooldown.canUse()) { - action.cooldown.use(1); + if (ship.actions.isUsable(action)) { + ship.actions.storeUsage(action, 1); } else { console.error("Action apply failed - in cooldown", this, ship); return; } - - if (action.equipment) { - action.equipment.addWear(1); - ship.listEquipment(SlotType.Power).forEach(equipment => equipment.addWear(1)); - } } protected revertOnShip(ship: Ship, battle: Battle): void { - let action = first(ship.getAvailableActions(), action => action.is(this.action)); + let action = ship.actions.getById(this.action); if (!action) { console.error("Action revert failed - not found on ship", this, ship); return; } - action.cooldown.use(-1); - - if (action.equipment) { - action.equipment.addWear(-1); - ship.listEquipment(SlotType.Power).forEach(equipment => equipment.addWear(-1)); - } + ship.actions.storeUsage(action, -1); } } } diff --git a/src/core/diffs/ShipCooldownDiff.spec.ts b/src/core/diffs/ShipCooldownDiff.spec.ts index 9f3213f..a310ee8 100644 --- a/src/core/diffs/ShipCooldownDiff.spec.ts +++ b/src/core/diffs/ShipCooldownDiff.spec.ts @@ -4,24 +4,25 @@ module TK.SpaceTac.Specs { let battle = TestTools.createBattle(); let ship = battle.play_order[0]; let weapon = TestTools.addWeapon(ship); - weapon.cooldown.configure(1, 3); - weapon.cooldown.use(); + weapon.configureCooldown(1, 3); + let cooldown = ship.actions.getCooldown(weapon); + cooldown.use(); TestTools.diffChain(check, battle, [ new ShipCooldownDiff(ship, weapon, 1), new ShipCooldownDiff(ship, weapon, 2), ], [ check => { - check.equals(weapon.cooldown.heat, 3, "heat"); - check.equals(weapon.cooldown.uses, 1, "uses"); + check.equals(cooldown.heat, 3, "heat"); + check.equals(cooldown.uses, 1, "uses"); }, check => { - check.equals(weapon.cooldown.heat, 2, "heat"); - check.equals(weapon.cooldown.uses, 1, "uses"); + check.equals(cooldown.heat, 2, "heat"); + check.equals(cooldown.uses, 1, "uses"); }, check => { - check.equals(weapon.cooldown.heat, 0, "heat"); - check.equals(weapon.cooldown.uses, 0, "uses"); + check.equals(cooldown.heat, 0, "heat"); + check.equals(cooldown.uses, 0, "uses"); }, ]); }); diff --git a/src/core/diffs/ShipCooldownDiff.ts b/src/core/diffs/ShipCooldownDiff.ts index 4268130..62ae861 100644 --- a/src/core/diffs/ShipCooldownDiff.ts +++ b/src/core/diffs/ShipCooldownDiff.ts @@ -2,43 +2,45 @@ module TK.SpaceTac { /** - * A ship's equipment cools down + * A ship's action cools down */ export class ShipCooldownDiff extends BaseBattleShipDiff { - // Equipment to cool - equipment: RObjectId + // Action to cool + action: RObjectId // Quantity of heat to dissipate heat: number - constructor(ship: Ship | RObjectId, equipment: Equipment | RObjectId, heat: number) { + constructor(ship: Ship | RObjectId, action: BaseAction | RObjectId, heat: number) { super(ship); - this.equipment = (equipment instanceof Equipment) ? equipment.id : equipment; + this.action = (action instanceof BaseAction) ? action.id : action; this.heat = heat; } applyOnShip(ship: Ship, battle: Battle) { - let equipment = ship.getEquipment(this.equipment); - if (equipment) { - equipment.cooldown.heat -= this.heat; - if (equipment.cooldown.heat == 0) { - equipment.cooldown.uses = 0; + let action = ship.actions.getById(this.action); + if (action) { + let cooldown = ship.actions.getCooldown(action); + cooldown.heat -= this.heat; + if (cooldown.heat == 0) { + cooldown.uses = 0; } } else { - console.error("Cannot apply diff, equipment not found", this); + console.error("Cannot apply diff, action not found", this, ship.actions); } } revertOnShip(ship: Ship, battle: Battle) { - let equipment = ship.getEquipment(this.equipment); - if (equipment) { - if (equipment.cooldown.heat == 0) { - equipment.cooldown.uses = equipment.cooldown.overheat; + let action = ship.actions.getById(this.action); + if (action) { + let cooldown = ship.actions.getCooldown(action); + if (cooldown.heat == 0) { + cooldown.uses = cooldown.overheat; } - equipment.cooldown.heat += this.heat; + cooldown.heat += this.heat; } else { - console.error("Cannot revert diff, equipment not found", this); + console.error("Cannot revert diff, action not found", this, ship.actions); } } } diff --git a/src/core/diffs/ShipDamageDiff.spec.ts b/src/core/diffs/ShipDamageDiff.spec.ts index 8f121ca..a6a4888 100644 --- a/src/core/diffs/ShipDamageDiff.spec.ts +++ b/src/core/diffs/ShipDamageDiff.spec.ts @@ -3,7 +3,7 @@ module TK.SpaceTac.Specs { test.case("applies and reverts", check => { let battle = TestTools.createBattle(); let ship = battle.play_order[0]; - let [hull, shield] = TestTools.setShipHP(ship, 80, 100); + TestTools.setShipModel(ship, 80, 100); TestTools.diffChain(check, battle, [ new ShipDamageDiff(ship, 0, 10), @@ -11,26 +11,18 @@ module TK.SpaceTac.Specs { new ShipDamageDiff(ship, 30, 90), ], [ check => { - check.equals(hull.wear, 0, "hull wear"); - check.equals(shield.wear, 0, "shield wear"); check.equals(ship.getValue("hull"), 80, "hull value"); check.equals(ship.getValue("shield"), 100, "shield value"); }, check => { - check.equals(hull.wear, 0, "hull wear"); - check.equals(shield.wear, 1, "shield wear"); check.equals(ship.getValue("hull"), 80, "hull value"); check.equals(ship.getValue("shield"), 100, "shield value"); }, check => { - check.equals(hull.wear, 2, "hull wear"); - check.equals(shield.wear, 1, "shield wear"); check.equals(ship.getValue("hull"), 80, "hull value"); check.equals(ship.getValue("shield"), 100, "shield value"); }, check => { - check.equals(hull.wear, 5, "hull wear"); - check.equals(shield.wear, 10, "shield wear"); check.equals(ship.getValue("hull"), 80, "hull value"); check.equals(ship.getValue("shield"), 100, "shield value"); }, diff --git a/src/core/diffs/ShipDamageDiff.ts b/src/core/diffs/ShipDamageDiff.ts index 99b52ba..f4f8192 100644 --- a/src/core/diffs/ShipDamageDiff.ts +++ b/src/core/diffs/ShipDamageDiff.ts @@ -4,7 +4,7 @@ module TK.SpaceTac { /** * A ship takes damage (to hull or shield) * - * This does not apply the damage on ship values (there are ShipValueDiff for this), but apply equipment wear. + * This is only informative, and does not apply the damage on ship values (there are ShipValueDiff for this). */ export class ShipDamageDiff extends BaseBattleShipDiff { // Damage to hull @@ -23,23 +23,5 @@ module TK.SpaceTac { this.shield = shield; this.theoretical = theoretical; } - - protected applyOnShip(ship: Ship, battle: Battle): void { - if (this.shield > 0) { - ship.listEquipment(SlotType.Shield).forEach(equipment => equipment.addWear(Math.ceil(this.shield * 0.1))); - } - if (this.hull > 0) { - ship.listEquipment(SlotType.Hull).forEach(equipment => equipment.addWear(Math.ceil(this.hull * 0.1))); - } - } - - protected revertOnShip(ship: Ship, battle: Battle): void { - if (this.shield > 0) { - ship.listEquipment(SlotType.Shield).forEach(equipment => equipment.addWear(-Math.ceil(this.shield * 0.1))); - } - if (this.hull > 0) { - ship.listEquipment(SlotType.Hull).forEach(equipment => equipment.addWear(-Math.ceil(this.hull * 0.1))); - } - } } } diff --git a/src/core/diffs/ShipMoveDiff.spec.ts b/src/core/diffs/ShipMoveDiff.spec.ts index 204cb26..3054df5 100644 --- a/src/core/diffs/ShipMoveDiff.spec.ts +++ b/src/core/diffs/ShipMoveDiff.spec.ts @@ -5,7 +5,7 @@ module TK.SpaceTac.Specs { let ship = battle.fleets[0].addShip(); check.equals(ship.location, new ArenaLocationAngle(0, 0, 0)); - let engine = new Equipment(); + let engine = new MoveAction(); let event = new ShipMoveDiff(ship, ship.location, new ArenaLocationAngle(50, 20, 1.2), engine); event.apply(battle); check.equals(ship.location, new ArenaLocationAngle(50, 20, 1.2)); diff --git a/src/core/diffs/ShipMoveDiff.ts b/src/core/diffs/ShipMoveDiff.ts index 32bb740..62183bc 100644 --- a/src/core/diffs/ShipMoveDiff.ts +++ b/src/core/diffs/ShipMoveDiff.ts @@ -12,9 +12,9 @@ module TK.SpaceTac { end: ArenaLocationAngle // Engine used - engine: Equipment | null + engine: MoveAction | null - constructor(ship: Ship | RObjectId, start: ArenaLocationAngle, end: ArenaLocationAngle, engine: Equipment | null = null) { + constructor(ship: Ship | RObjectId, start: ArenaLocationAngle, end: ArenaLocationAngle, engine: MoveAction | null = null) { super(ship); this.start = start; diff --git a/src/core/effects/AttributeMultiplyEffect.spec.ts b/src/core/effects/AttributeMultiplyEffect.spec.ts index adfb26b..138463f 100644 --- a/src/core/effects/AttributeMultiplyEffect.spec.ts +++ b/src/core/effects/AttributeMultiplyEffect.spec.ts @@ -22,8 +22,8 @@ module TK.SpaceTac { }); test.case("has a description", check => { - let effect = new AttributeMultiplyEffect("power_generation", 20); - check.equals(effect.getDescription(), "power generation +20%"); + let effect = new AttributeMultiplyEffect("power_capacity", 20); + check.equals(effect.getDescription(), "power capacity +20%"); }); }); } diff --git a/src/core/effects/CooldownEffect.spec.ts b/src/core/effects/CooldownEffect.spec.ts index e850226..8b34063 100644 --- a/src/core/effects/CooldownEffect.spec.ts +++ b/src/core/effects/CooldownEffect.spec.ts @@ -4,29 +4,29 @@ module TK.SpaceTac { let battle = new Battle(); let ship = battle.fleets[0].addShip(); let weapons = [TestTools.addWeapon(ship), TestTools.addWeapon(ship), TestTools.addWeapon(ship)]; - weapons.forEach(weapon => weapon.cooldown.configure(1, 3)); - check.equals(weapons.map(weapon => weapon.cooldown.heat), [0, 0, 0]); + weapons.forEach(weapon => weapon.configureCooldown(1, 3)); + check.equals(weapons.map(weapon => ship.actions.getCooldown(weapon).heat), [0, 0, 0]); let effect = new CooldownEffect(0, 0); battle.applyDiffs(effect.getOnDiffs(ship, ship, 1)); - check.equals(weapons.map(weapon => weapon.cooldown.heat), [0, 0, 0]); + check.equals(weapons.map(weapon => ship.actions.getCooldown(weapon).heat), [0, 0, 0]); - weapons.forEach(weapon => weapon.cooldown.use()); - check.equals(weapons.map(weapon => weapon.cooldown.heat), [3, 3, 3]); + weapons.forEach(weapon => ship.actions.storeUsage(weapon)); + check.equals(weapons.map(weapon => ship.actions.getCooldown(weapon).heat), [3, 3, 3]); battle.applyDiffs(effect.getOnDiffs(ship, ship, 1)); - check.equals(weapons.map(weapon => weapon.cooldown.heat), [0, 0, 0]); + check.equals(weapons.map(weapon => ship.actions.getCooldown(weapon).heat), [0, 0, 0]); - weapons.forEach(weapon => weapon.cooldown.use()); - check.equals(weapons.map(weapon => weapon.cooldown.heat), [3, 3, 3]); + weapons.forEach(weapon => ship.actions.storeUsage(weapon)); + check.equals(weapons.map(weapon => ship.actions.getCooldown(weapon).heat), [3, 3, 3]); effect = new CooldownEffect(1, 0); battle.applyDiffs(effect.getOnDiffs(ship, ship, 1)); - check.equals(weapons.map(weapon => weapon.cooldown.heat), [2, 2, 2]); + check.equals(weapons.map(weapon => ship.actions.getCooldown(weapon).heat), [2, 2, 2]); effect = new CooldownEffect(1, 2); battle.applyDiffs(effect.getOnDiffs(ship, ship, 1)); - check.equals(weapons.map(weapon => weapon.cooldown.heat).sort(), [1, 1, 2]); + check.equals(weapons.map(weapon => ship.actions.getCooldown(weapon).heat).sort(), [1, 1, 2]); }) test.case("builds a textual description", check => { diff --git a/src/core/effects/CooldownEffect.ts b/src/core/effects/CooldownEffect.ts index f3f6524..3e6981c 100644 --- a/src/core/effects/CooldownEffect.ts +++ b/src/core/effects/CooldownEffect.ts @@ -19,14 +19,14 @@ module TK.SpaceTac { } getOnDiffs(ship: Ship, source: Ship | Drone, success: number): BaseBattleDiff[] { - let equipments = ship.listEquipment().filter(equ => equ.cooldown.heat > 0); + let actions = ship.actions.listOverheated(); - if (this.maxcount && equipments.length > this.maxcount) { + if (this.maxcount && actions.length > this.maxcount) { let random = RandomGenerator.global; - equipments = random.sample(equipments, this.maxcount); + actions = random.sample(actions, this.maxcount); } - return equipments.map(equ => new ShipCooldownDiff(ship, equ, this.cooling || equ.cooldown.heat)); + return actions.map(action => new ShipCooldownDiff(ship, action, this.cooling || ship.actions.getCooldown(action).heat)); } isBeneficial(): boolean { diff --git a/src/core/effects/DamageEffect.spec.ts b/src/core/effects/DamageEffect.spec.ts index 4f6d582..d05a7ee 100644 --- a/src/core/effects/DamageEffect.spec.ts +++ b/src/core/effects/DamageEffect.spec.ts @@ -1,36 +1,30 @@ module TK.SpaceTac.Specs { testing("DamageEffect", test => { - test.case("applies damage and wear", check => { + test.case("applies damage", check => { let battle = new Battle(); let ship = battle.fleets[0].addShip(); + TestTools.setShipModel(ship, 150, 400); - TestTools.setShipHP(ship, 150, 400); - let hull = ship.listEquipment(SlotType.Hull)[0]; - let shield = ship.listEquipment(SlotType.Shield)[0]; - ship.restoreHealth(); - - function checkValues(desc: string, hull_value: number, shield_value: number, hull_wear: number, shield_wear: number) { + function checkValues(desc: string, hull_value: number, shield_value: number) { check.in(desc, check => { check.equals(ship.getValue("hull"), hull_value, "hull value"); check.equals(ship.getValue("shield"), shield_value, "shield value"); - check.equals(hull.wear, hull_wear, "hull wear"); - check.equals(shield.wear, shield_wear, "shield wear"); }); } - checkValues("initial", 150, 400, 0, 0); + checkValues("initial", 150, 400); battle.applyDiffs(new DamageEffect(50).getOnDiffs(ship, ship, 1)); - checkValues("after 50 damage", 150, 350, 0, 5); + checkValues("after 50 damage", 150, 350); battle.applyDiffs(new DamageEffect(250).getOnDiffs(ship, ship, 1)); - checkValues("after 250 damage", 150, 100, 0, 30); + checkValues("after 250 damage", 150, 100); battle.applyDiffs(new DamageEffect(201).getOnDiffs(ship, ship, 1)); - checkValues("after 201 damage", 49, 0, 11, 40); + checkValues("after 201 damage", 49, 0); battle.applyDiffs(new DamageEffect(8000).getOnDiffs(ship, ship, 1)); - checkValues("after 8000 damage", 0, 0, 16, 40); + checkValues("after 8000 damage", 0, 0); }); test.case("gets a textual description", check => { @@ -40,7 +34,7 @@ module TK.SpaceTac.Specs { test.case("applies damage modifiers", check => { let ship = new Ship(); - TestTools.setShipHP(ship, 1000, 1000); + TestTools.setShipModel(ship, 1000, 1000); let damage = new DamageEffect(200); check.equals(damage.getEffectiveDamage(ship, 1), new ShipDamageDiff(ship, 0, 200)); diff --git a/src/core/effects/ValueTransferEffect.spec.ts b/src/core/effects/ValueTransferEffect.spec.ts index ffc7f7f..a211bbc 100644 --- a/src/core/effects/ValueTransferEffect.spec.ts +++ b/src/core/effects/ValueTransferEffect.spec.ts @@ -3,10 +3,10 @@ module TK.SpaceTac.Specs { test.case("takes or gives value", check => { let battle = new Battle(); let ship1 = battle.fleets[0].addShip(); - TestTools.setShipHP(ship1, 100, 50); + TestTools.setShipModel(ship1, 100, 50); ship1.setValue("hull", 10); let ship2 = battle.fleets[0].addShip(); - TestTools.setShipHP(ship2, 100, 50); + TestTools.setShipModel(ship2, 100, 50); let effect = new ValueTransferEffect("hull", -30); battle.applyDiffs(effect.getOnDiffs(ship2, ship1, 1)); diff --git a/src/core/equipments/DamageProtector.spec.ts b/src/core/equipments/DamageProtector.spec.ts deleted file mode 100644 index 0530595..0000000 --- a/src/core/equipments/DamageProtector.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -module TK.SpaceTac.Specs { - testing("DamageProtector", test => { - test.case("generates equipment based on level", check => { - let template = new Equipments.DamageProtector(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_time": 3 }); - compare_toggle_action(check, equipment.action, new ToggleAction(equipment, 2, 300, [ - new DamageModifierEffect(-17) - ])); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_time": 4 }); - compare_toggle_action(check, equipment.action, new ToggleAction(equipment, 2, 310, [ - new DamageModifierEffect(-22) - ])); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_time": 5 }); - compare_toggle_action(check, equipment.action, new ToggleAction(equipment, 2, 322, [ - new DamageModifierEffect(-28) - ])); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_time": 22 }); - compare_toggle_action(check, equipment.action, new ToggleAction(equipment, 8, 462, [ - new DamageModifierEffect(-60) - ])); - }); - }); -} diff --git a/src/core/equipments/DamageProtector.ts b/src/core/equipments/DamageProtector.ts deleted file mode 100644 index 860c658..0000000 --- a/src/core/equipments/DamageProtector.ts +++ /dev/null @@ -1,14 +0,0 @@ -/// - -module TK.SpaceTac.Equipments { - export class DamageProtector extends LootTemplate { - constructor() { - super(SlotType.Weapon, "Damage Protector", "Extend a time-displacement subfield, to reduce damage taken by ships around", 145); - - this.setSkillsRequirements({ "skill_time": leveled(3) }); - this.addToggleAction(leveled(2, 0.4), leveled(300, 10), [ - new EffectTemplate(new DamageModifierEffect(), { factor: imap(leveled(-20), x => x * (100 / (100 - x))) }) - ]); - } - } -} diff --git a/src/core/equipments/Engines.spec.ts b/src/core/equipments/Engines.spec.ts deleted file mode 100644 index 77ca0df..0000000 --- a/src/core/equipments/Engines.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -module TK.SpaceTac.Specs { - testing("Engines", test => { - test.case("generates RocketEngine based on level", check => { - let template = new Equipments.RocketEngine(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_materials": 1 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", 2)]); - check.equals(equipment.cooldown, new Cooldown(2, 0)); - compare_action(check, equipment.action, new MoveAction(equipment, 200, 120, 70)); - check.equals(equipment.price, 120); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_materials": 2 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", 2)]); - check.equals(equipment.cooldown, new Cooldown(2, 0)); - compare_action(check, equipment.action, new MoveAction(equipment, 210, 120, 70)); - check.equals(equipment.price, 420); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_materials": 3 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", 3)]); - check.equals(equipment.cooldown, new Cooldown(2, 0)); - compare_action(check, equipment.action, new MoveAction(equipment, 220, 120, 70)); - check.equals(equipment.price, 1020); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_materials": 17 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", 14)]); - check.equals(equipment.cooldown, new Cooldown(2, 0)); - compare_action(check, equipment.action, new MoveAction(equipment, 290, 120, 70)); - check.equals(equipment.price, 13620); - }); - - test.case("generates IonThruster based on level", check => { - let template = new Equipments.IonThruster(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_photons": 1 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", 1)]); - check.equals(equipment.cooldown, new Cooldown(3, 1)); - compare_action(check, equipment.action, new MoveAction(equipment, 120, 120, 80)); - check.equals(equipment.price, 150); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_photons": 2 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", 2)]); - check.equals(equipment.cooldown, new Cooldown(3, 1)); - compare_action(check, equipment.action, new MoveAction(equipment, 130, 120, 80)); - check.equals(equipment.price, 525); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_photons": 3 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", 3)]); - check.equals(equipment.cooldown, new Cooldown(3, 1)); - compare_action(check, equipment.action, new MoveAction(equipment, 140, 120, 80)); - check.equals(equipment.price, 1275); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_photons": 17 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", 17)]); - check.equals(equipment.cooldown, new Cooldown(3, 1)); - compare_action(check, equipment.action, new MoveAction(equipment, 210, 120, 80)); - check.equals(equipment.price, 17025); - }); - - test.case("generates VoidhawkEngine based on level", check => { - let template = new Equipments.VoidhawkEngine(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_gravity": 2 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", -3)]); - check.equals(equipment.cooldown, new Cooldown(1, 0)); - compare_action(check, equipment.action, new MoveAction(equipment, 2000, 270, 0)); - check.equals(equipment.price, 300); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_gravity": 3 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", -4)]); - check.equals(equipment.cooldown, new Cooldown(1, 0)); - compare_action(check, equipment.action, new MoveAction(equipment, 2000, 245, 0)); - check.equals(equipment.price, 1050); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_gravity": 5 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", -4)]); - check.equals(equipment.cooldown, new Cooldown(1, 0)); - compare_action(check, equipment.action, new MoveAction(equipment, 2000, 224, 0)); - check.equals(equipment.price, 2550); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_gravity": 26 }); - compare_effects(check, equipment.effects, [new AttributeEffect("maneuvrability", -5)]); - check.equals(equipment.cooldown, new Cooldown(2, 0)); - compare_action(check, equipment.action, new MoveAction(equipment, 2000, 155, 0)); - check.equals(equipment.price, 34050); - }); - }); -} diff --git a/src/core/equipments/Engines.ts b/src/core/equipments/Engines.ts deleted file mode 100644 index 0a1fd32..0000000 --- a/src/core/equipments/Engines.ts +++ /dev/null @@ -1,36 +0,0 @@ -/// - -module TK.SpaceTac.Equipments { - export class RocketEngine extends LootTemplate { - constructor() { - super(SlotType.Engine, "Rocket Engine", "First-era conventional deep-space engine, based on gas exhausts pushed through a nozzle", 120); - - this.setSkillsRequirements({ "skill_materials": leveled(1, 1) }); - this.setCooldown(irepeat(2), leveled(0)); - this.addAttributeEffect("maneuvrability", leveled(2)); - this.addMoveAction(leveled(200, 10, 0), undefined, irepeat(70)); - } - } - - export class IonThruster extends LootTemplate { - constructor() { - super(SlotType.Engine, "Ion Thruster", "Electric propulsion based on accelerating ions through an electrostatic grid", 150); - - this.setSkillsRequirements({ "skill_photons": leveled(1, 1) }); - this.setCooldown(irepeat(3), irepeat(1)); - this.addAttributeEffect("maneuvrability", leveled(1, 1)); - this.addMoveAction(leveled(120, 10, 0)); - } - } - - export class VoidhawkEngine extends LootTemplate { - constructor() { - super(SlotType.Engine, "VoidHawk Engine", "Mid-range gravity field warp generator, allowing to make small jumps", 300); - - this.setSkillsRequirements({ "skill_gravity": leveled(2, 1.5) }); - this.setCooldown(leveled(1, 0.2, 0), irepeat(0)); - this.addAttributeEffect("maneuvrability", leveled(-3, -0.1)); - this.addMoveAction(irepeat(2000), imap(leveled(1), x => 420 - (300 * x / (x + 1))), irepeat(0)); - } - } -} diff --git a/src/core/equipments/Generators.spec.ts b/src/core/equipments/Generators.spec.ts deleted file mode 100644 index 2894b9e..0000000 --- a/src/core/equipments/Generators.spec.ts +++ /dev/null @@ -1,83 +0,0 @@ -module TK.SpaceTac.Specs { - testing("Generators", test => { - test.case("generates NuclearReactor based on level", check => { - let template = new Equipments.NuclearReactor(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_photons": 1 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("maneuvrability", 1), - new AttributeEffect("power_capacity", 7), - new AttributeEffect("power_generation", 4), - ]); - check.equals(equipment.price, 395); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_photons": 3 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("maneuvrability", 2), - new AttributeEffect("power_capacity", 7), - new AttributeEffect("power_generation", 5), - ]); - check.equals(equipment.price, 1382); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_photons": 5 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("maneuvrability", 3), - new AttributeEffect("power_capacity", 8), - new AttributeEffect("power_generation", 5), - ]); - check.equals(equipment.price, 3357); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_photons": 33 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("maneuvrability", 10), - new AttributeEffect("power_capacity", 15), - new AttributeEffect("power_generation", 12), - ]); - check.equals(equipment.price, 44832); - }) - - test.case("generates KelvinGenerator based on level", check => { - let template = new Equipments.KelvinGenerator(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_time": 1 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("power_capacity", 5), - new AttributeEffect("power_generation", 4), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new CooldownEffect(1, 1)])); - check.equals(equipment.price, 420); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_time": 2 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("power_capacity", 6), - new AttributeEffect("power_generation", 4), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new CooldownEffect(1, 1)])); - check.equals(equipment.price, 1470); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_time": 4, "skill_gravity": 1 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("power_capacity", 6), - new AttributeEffect("power_generation", 5), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new CooldownEffect(1, 1)])); - check.equals(equipment.price, 3570); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_time": 28, "skill_gravity": 6 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("power_capacity", 13), - new AttributeEffect("power_generation", 12), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new CooldownEffect(4, 7)], 7)); - check.equals(equipment.price, 47670); - }) - }) -} diff --git a/src/core/equipments/Generators.ts b/src/core/equipments/Generators.ts deleted file mode 100644 index ad11d2f..0000000 --- a/src/core/equipments/Generators.ts +++ /dev/null @@ -1,27 +0,0 @@ -/// - -module TK.SpaceTac.Equipments { - export class NuclearReactor extends LootTemplate { - constructor() { - super(SlotType.Power, "Nuclear Reactor", "A standard nuclear power core, drawing power from atom fusion cycles", 395); - - this.setSkillsRequirements({ "skill_photons": leveled(1, 2) }); - this.addAttributeEffect("maneuvrability", leveled(1, 1, 0)); - this.addAttributeEffect("power_capacity", leveled(7, 0.5)); - this.addAttributeEffect("power_generation", leveled(4.5, 0.5)); - } - } - - export class KelvinGenerator extends LootTemplate { - constructor() { - super(SlotType.Power, "Kelvin Generator", "A power generator operating at ultra-low temperature, improving equipment cooldown", 420); - - this.setSkillsRequirements({ "skill_time": leveled(1, 1.7), "skill_gravity": leveled(0.3, 0.4) }); - this.addAttributeEffect("power_capacity", leveled(5.5, 0.5)); - this.addAttributeEffect("power_generation", leveled(4, 0.5)); - this.addTriggerAction(leveled(1, 0.4), [ - new EffectTemplate(new CooldownEffect(), { cooling: leveled(1, 0.2), maxcount: leveled(1, 0.4) }) - ]) - } - } -} diff --git a/src/core/equipments/Hulls.spec.ts b/src/core/equipments/Hulls.spec.ts deleted file mode 100644 index 5579838..0000000 --- a/src/core/equipments/Hulls.spec.ts +++ /dev/null @@ -1,107 +0,0 @@ -module TK.SpaceTac.Specs { - testing("Hulls", test => { - test.case("generates IronHull based on level", check => { - let template = new Equipments.IronHull(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_materials": 1 }); - compare_effects(check, equipment.effects, [new AttributeEffect("hull_capacity", 100)]); - check.equals(equipment.price, 100); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_materials": 2 }); - compare_effects(check, equipment.effects, [new AttributeEffect("hull_capacity", 140)]); - check.equals(equipment.price, 350); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_materials": 3 }); - compare_effects(check, equipment.effects, [new AttributeEffect("hull_capacity", 188)]); - check.equals(equipment.price, 850); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_materials": 17 }); - compare_effects(check, equipment.effects, [new AttributeEffect("hull_capacity", 748)]); - check.equals(equipment.price, 11350); - }); - - test.case("generates HardCoatedHull based on level", check => { - let template = new Equipments.HardCoatedHull(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_materials": 2 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("hull_capacity", 130), - new AttributeEffect("maneuvrability", -2), - ]); - check.equals(equipment.price, 124); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_materials": 5 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("hull_capacity", 182), - new AttributeEffect("maneuvrability", -3), - ]); - check.equals(equipment.price, 434); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_materials": 8 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("hull_capacity", 244), - new AttributeEffect("maneuvrability", -5), - ]); - check.equals(equipment.price, 1054); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_materials": 50 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("hull_capacity", 972), - new AttributeEffect("maneuvrability", -19), - ]); - check.equals(equipment.price, 14074); - }); - - test.case("generates FractalHull based on level", check => { - let template = new Equipments.FractalHull(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_quantum": 1 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("hull_capacity", 60), - new AttributeEffect("precision", 2), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new ValueEffect("hull", 60)], 1)); - check.equals(equipment.cooldown, new Cooldown(1, 4)); - check.equals(equipment.price, 250); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_quantum": 3 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("hull_capacity", 84), - new AttributeEffect("precision", 2), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new ValueEffect("hull", 84)], 1)); - check.equals(equipment.cooldown, new Cooldown(1, 4)); - check.equals(equipment.price, 875); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_quantum": 5 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("hull_capacity", 112), - new AttributeEffect("precision", 3), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new ValueEffect("hull", 112)], 1)); - check.equals(equipment.cooldown, new Cooldown(1, 4)); - check.equals(equipment.price, 2125); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_quantum": 33 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("hull_capacity", 448), - new AttributeEffect("precision", 14), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new ValueEffect("hull", 448)], 2)); - check.equals(equipment.cooldown, new Cooldown(1, 4)); - check.equals(equipment.price, 28375); - }); - }); -} diff --git a/src/core/equipments/Hulls.ts b/src/core/equipments/Hulls.ts deleted file mode 100644 index 6955b41..0000000 --- a/src/core/equipments/Hulls.ts +++ /dev/null @@ -1,36 +0,0 @@ -/// - -module TK.SpaceTac.Equipments { - export class IronHull extends LootTemplate { - constructor() { - super(SlotType.Hull, "Iron Hull", "Protective hull, based on layered iron alloys"); - - this.setSkillsRequirements({ "skill_materials": leveled(1, 1) }); - this.addAttributeEffect("hull_capacity", leveled(100)); - } - } - - export class HardCoatedHull extends LootTemplate { - constructor() { - super(SlotType.Hull, "Hard Coated Hull", "Hardened hull, with titanium coating", 124); - - this.setSkillsRequirements({ "skill_materials": leveled(2, 3) }); - this.addAttributeEffect("hull_capacity", leveled(130)); - this.addAttributeEffect("maneuvrability", leveled(-2, -1)); - } - } - - export class FractalHull extends LootTemplate { - constructor() { - super(SlotType.Hull, "Fractal Hull", "Hull composed of recursively bound quantum patches", 250); - - this.setSkillsRequirements({ "skill_quantum": leveled(1, 2) }); - this.addAttributeEffect("hull_capacity", leveled(60)); - this.addAttributeEffect("precision", leveled(2)); - this.addTriggerAction(leveled(1, 0.1), [ - new EffectTemplate(new ValueEffect("hull"), { value_on: leveled(60) }) - ]) - this.setCooldown(irepeat(1), irepeat(4)); - } - } -} diff --git a/src/core/equipments/PowerDepleter.spec.ts b/src/core/equipments/PowerDepleter.spec.ts deleted file mode 100644 index 80eaba0..0000000 --- a/src/core/equipments/PowerDepleter.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -module TK.SpaceTac.Specs { - testing("PowerDepleter", test => { - test.case("generates equipment based on level", check => { - let template = new Equipments.PowerDepleter(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_antimatter": 1 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [ - new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 1) - ], 4, 460, 0)); - check.equals(equipment.price, 100); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_antimatter": 2 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [ - new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 1) - ], 4, 490, 0)); - check.equals(equipment.price, 350); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_antimatter": 4 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [ - new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 1) - ], 4, 526, 0)); - check.equals(equipment.price, 850); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_antimatter": 25 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [ - new StickyEffect(new AttributeLimitEffect("power_capacity", 3), 1) - ], 4, 946, 0)); - check.equals(equipment.price, 11350); - }); - }); -} diff --git a/src/core/equipments/PowerDepleter.ts b/src/core/equipments/PowerDepleter.ts deleted file mode 100644 index 9cb5b11..0000000 --- a/src/core/equipments/PowerDepleter.ts +++ /dev/null @@ -1,15 +0,0 @@ -/// - -module TK.SpaceTac.Equipments { - export class PowerDepleter extends LootTemplate { - constructor() { - super(SlotType.Weapon, "Power Depleter", "Direct-hit weapon that creates an antimatter well near the target, sucking its power surplus"); - - this.setSkillsRequirements({ "skill_antimatter": leveled(1, 1.5) }); - this.setCooldown(irepeat(2), irepeat(3)); - this.addTriggerAction(irepeat(4), [ - new StickyEffectTemplate(new AttributeLimitEffect("power_capacity"), { "value": irepeat(3) }, irepeat(1)) - ], leveled(460, 30)); - } - } -} diff --git a/src/core/equipments/RawWeapons.spec.ts b/src/core/equipments/RawWeapons.spec.ts deleted file mode 100644 index da1e939..0000000 --- a/src/core/equipments/RawWeapons.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -module TK.SpaceTac.Specs { - testing("RawWeapons", test => { - test.case("generates GatlingGun based on level", check => { - let template = new Equipments.GatlingGun(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_materials": 1 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(30, 20)], 3, 400, 0, 0, 60, 20, 15)); - check.equals(equipment.price, 100); - check.equals(equipment.cooldown, new Cooldown(2, 2)); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_materials": 2 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(42, 28)], 3, 412, 0, 0, 60, 20, 15)); - check.equals(equipment.price, 350); - check.equals(equipment.cooldown, new Cooldown(2, 2)); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_materials": 4 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(56, 37)], 3, 426, 0, 0, 60, 20, 15)); - check.equals(equipment.price, 850); - check.equals(equipment.cooldown, new Cooldown(2, 2)); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_materials": 23 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(224, 149)], 3, 594, 0, 0, 60, 20, 15)); - check.equals(equipment.price, 11350); - check.equals(equipment.cooldown, new Cooldown(2, 2)); - }); - - test.case("generates SubMunitionMissile based on level", check => { - let template = new Equipments.SubMunitionMissile(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_materials": 1, "skill_photons": 1 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(26, 4)], 4, 500, 150, 0, 30, 40, 10)); - check.equals(equipment.cooldown, new Cooldown(1, 0)); - check.equals(equipment.price, 163); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_materials": 2, "skill_photons": 1 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(28, 5)], 4, 520, 155, 0, 30, 40, 10)); - check.equals(equipment.cooldown, new Cooldown(1, 0)); - check.equals(equipment.price, 570); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_materials": 3, "skill_photons": 2 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(30, 6)], 4, 544, 161, 0, 30, 40, 10)); - check.equals(equipment.cooldown, new Cooldown(1, 0)); - check.equals(equipment.price, 1385); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_materials": 20, "skill_photons": 13 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(58, 20)], 4, 824, 231, 0, 30, 40, 10)); - check.equals(equipment.cooldown, new Cooldown(1, 0)); - check.equals(equipment.price, 18500); - }); - - test.case("generates ProkhorovLaser based on level", check => { - let template = new Equipments.ProkhorovLaser(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_photons": 1, "skill_quantum": 1 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(20, 25)], 5, 300, 0, 40, 45, 60, 20)); - check.equals(equipment.cooldown, new Cooldown(1, 1)); - check.equals(equipment.price, 152); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_antimatter": 1, "skill_photons": 2, "skill_quantum": 2 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(28, 35)], 5, 310, 0, 42, 45, 60, 20)); - check.equals(equipment.cooldown, new Cooldown(1, 1)); - check.equals(equipment.price, 532); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_antimatter": 1, "skill_photons": 4, "skill_quantum": 3 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(37, 47)], 5, 322, 0, 44, 45, 60, 20)); - check.equals(equipment.cooldown, new Cooldown(1, 1)); - check.equals(equipment.price, 1292); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_antimatter": 11, "skill_photons": 23, "skill_quantum": 20 }); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new DamageEffect(149, 187)], 5, 462, 0, 72, 45, 60, 20)); - check.equals(equipment.cooldown, new Cooldown(1, 1)); - check.equals(equipment.price, 17252); - }); - }); -} diff --git a/src/core/equipments/RawWeapons.ts b/src/core/equipments/RawWeapons.ts deleted file mode 100644 index 3a5cf5d..0000000 --- a/src/core/equipments/RawWeapons.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// - -module TK.SpaceTac.Equipments { - export class GatlingGun extends LootTemplate { - constructor() { - super(SlotType.Weapon, "Gatling Gun", "Mechanical weapon using loads of metal bullets propelled by guided explosions"); - - this.setSkillsRequirements({ "skill_materials": leveled(1, 1.4) }); - this.setCooldown(irepeat(2), irepeat(2)); - this.addTriggerAction(irepeat(3), [ - new EffectTemplate(new DamageEffect(), { base: leveled(30), span: leveled(20) }) - ], leveled(400, 12), undefined, undefined, irepeat(60), irepeat(20), irepeat(15)); - } - } - - export class SubMunitionMissile extends LootTemplate { - constructor() { - super(SlotType.Weapon, "SubMunition Missile", "Explosive missile releasing small shelled payloads, that will in turn explode on impact", 163); - - this.setSkillsRequirements({ "skill_materials": leveled(1, 1.2), "skill_photons": leveled(1, 0.8) }); - this.setCooldown(irepeat(1), irepeat(0)); - this.addTriggerAction(irepeat(4), [ - new EffectTemplate(new DamageEffect(), { base: leveled(26, 2), span: leveled(4, 1) }) - ], leveled(500, 20), leveled(150, 5), undefined, irepeat(30), irepeat(40), irepeat(10)); - } - } - - export class ProkhorovLaser extends LootTemplate { - constructor() { - super(SlotType.Weapon, "Prokhorov Laser", "Powerful mid-range perforating laser, using antimatter to contain the tremendous photonic energy", 152); - - // TODO increased damage to hull - this.setSkillsRequirements({ "skill_antimatter": leveled(0.3, 0.7), "skill_quantum": leveled(1, 1.2), "skill_photons": leveled(1, 1.4) }); - this.setCooldown(irepeat(1), irepeat(1)); - this.addTriggerAction(irepeat(5), [ - new EffectTemplate(new DamageEffect(), { base: leveled(20), span: leveled(25) }) - ], leveled(300, 10), irepeat(0), leveled(40, 2), irepeat(45), irepeat(60), irepeat(20)); - } - } -} diff --git a/src/core/equipments/RepairDrone.spec.ts b/src/core/equipments/RepairDrone.spec.ts deleted file mode 100644 index e709ada..0000000 --- a/src/core/equipments/RepairDrone.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -module TK.SpaceTac.Specs { - testing("RepairDrone", test => { - test.case("generates equipment based on level", check => { - let template = new Equipments.RepairDrone(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_quantum": 1 }); - compare_drone_action(check, equipment.action, new DeployDroneAction(equipment, 3, 300, 150, [ - new ValueEffect("hull", 0, 0, 0, 30) - ])); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_quantum": 4 }); - compare_drone_action(check, equipment.action, new DeployDroneAction(equipment, 3, 310, 155, [ - new ValueEffect("hull", 0, 0, 0, 42) - ])); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_quantum": 7 }); - compare_drone_action(check, equipment.action, new DeployDroneAction(equipment, 3, 322, 161, [ - new ValueEffect("hull", 0, 0, 0, 56) - ])); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_quantum": 49 }); - compare_drone_action(check, equipment.action, new DeployDroneAction(equipment, 6, 462, 231, [ - new ValueEffect("hull", 0, 0, 0, 224) - ])); - }); - }); -} diff --git a/src/core/equipments/RepairDrone.ts b/src/core/equipments/RepairDrone.ts deleted file mode 100644 index 0c3fe2d..0000000 --- a/src/core/equipments/RepairDrone.ts +++ /dev/null @@ -1,17 +0,0 @@ -/// - -module TK.SpaceTac.Equipments { - /** - * Drone that repairs damage done to the hull. - */ - export class RepairDrone extends LootTemplate { - constructor() { - super(SlotType.Weapon, "Repair Drone", "Drone able to repair small hull breaches, using quantum patches", 190); - - this.setSkillsRequirements({ "skill_quantum": leveled(1, 3) }); - this.addDroneAction(leveled(3, 0.2), leveled(300, 10), leveled(150, 5), [ - new EffectTemplate(new ValueEffect("hull"), { "value_end": leveled(30) }) - ]); - } - } -} \ No newline at end of file diff --git a/src/core/equipments/ShieldTransfer.spec.ts b/src/core/equipments/ShieldTransfer.spec.ts deleted file mode 100644 index 3edcfcb..0000000 --- a/src/core/equipments/ShieldTransfer.spec.ts +++ /dev/null @@ -1,35 +0,0 @@ -module TK.SpaceTac.Specs { - testing("ShieldTransfer", test => { - test.case("generates equipment based on level", check => { - let template = new Equipments.ShieldTransfer(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_gravity": 2 }); - check.equals(equipment.cooldown, new Cooldown(3, 3)); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [ - new ValueTransferEffect("shield", -40) - ], 3, 0, 250)); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_gravity": 3 }); - check.equals(equipment.cooldown, new Cooldown(3, 3)); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [ - new ValueTransferEffect("shield", -44) - ], 3, 0, 270)); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_gravity": 5 }); - check.equals(equipment.cooldown, new Cooldown(3, 3)); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [ - new ValueTransferEffect("shield", -49) - ], 3, 0, 294)); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_gravity": 26 }); - check.equals(equipment.cooldown, new Cooldown(3, 3)); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [ - new ValueTransferEffect("shield", -105) - ], 3, 0, 574)); - }) - }) -} diff --git a/src/core/equipments/ShieldTransfer.ts b/src/core/equipments/ShieldTransfer.ts deleted file mode 100644 index c8f8f3b..0000000 --- a/src/core/equipments/ShieldTransfer.ts +++ /dev/null @@ -1,15 +0,0 @@ -/// - -module TK.SpaceTac.Equipments { - export class ShieldTransfer extends LootTemplate { - constructor() { - super(SlotType.Weapon, "Shield Transfer", "Generates small gravity wells between the ship's and the target's shields, stealing physical properties and energy"); - - this.setSkillsRequirements({ "skill_gravity": leveled(2, 1.5) }); - this.setCooldown(irepeat(3), irepeat(3)); - this.addTriggerAction(irepeat(3), [ - new EffectTemplate(new ValueTransferEffect("shield"), { "amount": leveled(-40, -4) }) - ], irepeat(0), leveled(250, 20)); - } - } -} diff --git a/src/core/equipments/Shields.spec.ts b/src/core/equipments/Shields.spec.ts deleted file mode 100644 index 66fbb3a..0000000 --- a/src/core/equipments/Shields.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -module TK.SpaceTac.Specs { - testing("Shields", test => { - test.case("generates ForceField based on level", check => { - let template = new Equipments.ForceField(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_photons": 1 }); - compare_effects(check, equipment.effects, [new AttributeEffect("shield_capacity", 80)]); - check.equals(equipment.price, 95); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_photons": 3 }); - compare_effects(check, equipment.effects, [new AttributeEffect("shield_capacity", 112)]); - check.equals(equipment.price, 332); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_photons": 5 }); - compare_effects(check, equipment.effects, [new AttributeEffect("shield_capacity", 150)]); - check.equals(equipment.price, 807); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_photons": 33 }); - compare_effects(check, equipment.effects, [new AttributeEffect("shield_capacity", 598)]); - check.equals(equipment.price, 10782); - }); - - test.case("generates GravitShield based on level", check => { - let template = new Equipments.GravitShield(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_gravity": 2 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("shield_capacity", 60), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new RepelEffect(100)], 2, 0, 300)); - check.equals(equipment.price, 140); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_gravity": 5 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("shield_capacity", 84), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new RepelEffect(105)], 2, 0, 310)); - check.equals(equipment.price, 490); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_gravity": 8 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("shield_capacity", 112), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new RepelEffect(111)], 2, 0, 322)); - check.equals(equipment.price, 1190); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_gravity": 50 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("shield_capacity", 448), - ]); - compare_trigger_action(check, equipment.action, new TriggerAction(equipment, [new RepelEffect(181)], 2, 0, 462)); - check.equals(equipment.price, 15890); - }); - - test.case("generates InverterShield based on level", check => { - let template = new Equipments.InverterShield(); - - let equipment = template.generate(1); - check.equals(equipment.requirements, { "skill_antimatter": 2, "skill_time": 1 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("shield_capacity", 140), - new AttributeEffect("power_capacity", -1), - ]); - check.equals(equipment.price, 258); - - equipment = template.generate(2); - check.equals(equipment.requirements, { "skill_antimatter": 3, "skill_time": 2 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("shield_capacity", 196), - new AttributeEffect("power_capacity", -1), - ]); - check.equals(equipment.price, 903); - - equipment = template.generate(3); - check.equals(equipment.requirements, { "skill_antimatter": 5, "skill_time": 3 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("shield_capacity", 263), - new AttributeEffect("power_capacity", -1), - ]); - check.equals(equipment.price, 2193); - - equipment = template.generate(10); - check.equals(equipment.requirements, { "skill_antimatter": 26, "skill_time": 17 }); - compare_effects(check, equipment.effects, [ - new AttributeEffect("shield_capacity", 1047), - new AttributeEffect("power_capacity", -4), - ]); - check.equals(equipment.price, 29283); - }); - }); -} diff --git a/src/core/equipments/Shields.ts b/src/core/equipments/Shields.ts deleted file mode 100644 index b35c4ce..0000000 --- a/src/core/equipments/Shields.ts +++ /dev/null @@ -1,34 +0,0 @@ -/// - -module TK.SpaceTac.Equipments { - export class ForceField extends LootTemplate { - constructor() { - super(SlotType.Shield, "Force Field", "A basic force field, generated by radiating waves of compressed energy", 95); - - this.setSkillsRequirements({ "skill_photons": leveled(1, 2) }); - this.addAttributeEffect("shield_capacity", leveled(80)); - } - } - - export class GravitShield extends LootTemplate { - constructor() { - super(SlotType.Shield, "Gravit Shield", "A shield able to repel damage and enemies using micro-gravity wells", 140); - - this.setSkillsRequirements({ "skill_gravity": leveled(2, 3) }); - this.addAttributeEffect("shield_capacity", leveled(60)); - this.addTriggerAction(irepeat(2), [ - new EffectTemplate(new RepelEffect(), { value: leveled(100, 5) }) - ], irepeat(0), leveled(300, 10)); - } - } - - export class InverterShield extends LootTemplate { - constructor() { - super(SlotType.Shield, "Inverter Shield", "An antimatter shield that tries to cancel inbound energy", 258); - - this.setSkillsRequirements({ "skill_antimatter": leveled(2, 1.5), "skill_time": leveled(1, 1) }); - this.addAttributeEffect("shield_capacity", leveled(140)); - this.addAttributeEffect("power_capacity", leveled(-0.2, -0.2)); - } - } -} diff --git a/src/core/missions/Mission.spec.ts b/src/core/missions/Mission.spec.ts index 83c168f..fd93c20 100644 --- a/src/core/missions/Mission.spec.ts +++ b/src/core/missions/Mission.spec.ts @@ -38,16 +38,11 @@ module TK.SpaceTac.Specs { mission.reward = 720; check.equals(mission.getRewardText(), "720 zotys"); - - mission.reward = new Equipment(); - mission.reward.name = "Super Equipment"; - check.equals(mission.getRewardText(), "Super Equipment Mk1"); }) test.case("gives the reward on completion", check => { let fleet = new Fleet(); let ship = fleet.addShip(); - ship.cargo_space = 5; fleet.credits = 150; let mission = new Mission(new Universe(), fleet); @@ -58,14 +53,6 @@ module TK.SpaceTac.Specs { mission.setCompleted(); check.equals(fleet.credits, 225); - - mission = new Mission(new Universe(), fleet); - mission.reward = new Equipment(); - check.equals(ship.cargo, []); - mission.setCompleted(); - check.equals(mission.completed, true); - check.equals(fleet.credits, 225); - check.equals(ship.cargo, [mission.reward]); }) }) } diff --git a/src/core/missions/Mission.ts b/src/core/missions/Mission.ts index 9f43a1c..9c75b55 100644 --- a/src/core/missions/Mission.ts +++ b/src/core/missions/Mission.ts @@ -1,8 +1,8 @@ module TK.SpaceTac { /** - * Reward for a mission (either an equipment or money) + * Reward for a mission (currently, only money) */ - export type MissionReward = Equipment | number + export type MissionReward = number /** * Level of difficulty for a mission @@ -84,11 +84,7 @@ module TK.SpaceTac { */ getRewardText(): string { if (this.reward) { - if (this.reward instanceof Equipment) { - return this.reward.getFullName(); - } else { - return `${this.reward} zotys`; - } + return `${this.reward} zotys`; } else { return "-"; } @@ -146,11 +142,7 @@ module TK.SpaceTac { if (!this.completed) { this.completed = true; if (this.reward) { - if (this.reward instanceof Equipment) { - this.fleet.addCargo(this.reward); - } else { - this.fleet.credits += this.reward; - } + this.fleet.credits += this.reward; } } } diff --git a/src/core/missions/MissionGenerator.spec.ts b/src/core/missions/MissionGenerator.spec.ts index 01531fd..2969286 100644 --- a/src/core/missions/MissionGenerator.spec.ts +++ b/src/core/missions/MissionGenerator.spec.ts @@ -76,39 +76,5 @@ module TK.SpaceTac.Specs { check.same(mission.difficulty, MissionDifficulty.easy); check.equals(mission.value, 6400); }) - - test.case("generates equipment reward", check => { - let generator = new MissionGenerator(new Universe(), new StarLocation()); - let template = new LootTemplate(SlotType.Weapon, "Test Weapon"); - generator.equipment_generator.templates = [template]; - - template.price = irepeat(350); - let result = generator.tryGenerateEquipmentReward(500); - check.equals(result, null); - - template.price = irepeat(800); - result = generator.tryGenerateEquipmentReward(500); - check.equals(result, null); - - template.price = irepeat(500); - result = generator.tryGenerateEquipmentReward(500); - check.notequals(result, null); - }) - - test.case("falls back to money reward when no suitable equipment have been generated", check => { - let generator = new MissionGenerator(new Universe(), new StarLocation()); - generator.equipment_generator.templates = []; - - let result = generator.generateReward(15000); - check.equals(result, 15000); - - let template = new LootTemplate(SlotType.Weapon, "Test Weapon"); - template.price = irepeat(15000); - generator.equipment_generator.templates.push(template); - - generator.random = new SkewedRandomGenerator([0], true); - result = generator.generateReward(15000); - check.equals(result instanceof Equipment, true); - }) }); } diff --git a/src/core/missions/MissionGenerator.ts b/src/core/missions/MissionGenerator.ts index fe123ab..e004481 100644 --- a/src/core/missions/MissionGenerator.ts +++ b/src/core/missions/MissionGenerator.ts @@ -21,13 +21,11 @@ module TK.SpaceTac { universe: Universe around: StarLocation random: RandomGenerator - equipment_generator: LootGenerator constructor(universe: Universe, around: StarLocation, random = RandomGenerator.global) { this.universe = universe; this.around = around; this.random = random; - this.equipment_generator = new LootGenerator(this.random); } /** @@ -64,49 +62,12 @@ module TK.SpaceTac { return result; } - /** - * Try to generate an equipment of given value - */ - tryGenerateEquipmentReward(value: number): Equipment | null { - let minvalue = value * 0.8; - let maxvalue = value * 1.2; - let qualities = [EquipmentQuality.FINE, EquipmentQuality.PREMIUM, EquipmentQuality.LEGENDARY]; - - let candidates: Equipment[] = []; - for (let pass = 0; pass < 10; pass++) { - let equipment: Equipment | null; - let level = 1; - do { - let quality = qualities[this.random.weighted([15, 12, 2])]; - equipment = this.equipment_generator.generate(level, quality); - if (equipment && equipment.getPrice() >= minvalue && equipment.getPrice() <= maxvalue) { - candidates.push(equipment); - } - level += 1; - } while (equipment && equipment.getPrice() < maxvalue * 1.5 && level < 20); - } - - if (candidates.length > 0) { - return this.random.choice(candidates); - } else { - return null; - } - } - /** * Generate a reward */ generateReward(value: number): MissionReward { - if (this.random.bool()) { - let equipment = this.tryGenerateEquipmentReward(value); - if (equipment) { - return equipment; - } else { - return value; - } - } else { - return value; - } + // TODO + return value; } /** diff --git a/src/core/missions/MissionPartEscort.spec.ts b/src/core/missions/MissionPartEscort.spec.ts index 6e69613..436ffd5 100644 --- a/src/core/missions/MissionPartEscort.spec.ts +++ b/src/core/missions/MissionPartEscort.spec.ts @@ -48,7 +48,7 @@ module TK.SpaceTac.Specs { let enemy = new Fleet(); enemy.addShip(); let battle = new Battle(fleet, enemy); - battle.ships.list().forEach(ship => TestTools.setShipHP(ship, 10, 0)); + battle.ships.list().forEach(ship => TestTools.setShipModel(ship, 10, 0)); battle.start(); battle.performChecks(); check.equals(battle.ended, false); diff --git a/src/core/models/BaseModel.spec.ts b/src/core/models/BaseModel.spec.ts new file mode 100644 index 0000000..c35e4bf --- /dev/null +++ b/src/core/models/BaseModel.spec.ts @@ -0,0 +1,59 @@ +module TK.SpaceTac.Specs { + testing("BaseModel", test => { + test.case("picks random models from default collection", check => { + check.patch(console, "error", null); + check.patch(BaseModel, "getDefaultCollection", iterator([ + [new BaseModel("a")], + [], + [new BaseModel("a"), new BaseModel("b")], + [new BaseModel("a")], + [], + ])); + + check.equals(BaseModel.getRandomModel(), new BaseModel("a"), "pick from a one-item list"); + check.equals(BaseModel.getRandomModel(), new BaseModel(), "pick from an empty list"); + + check.equals(sorted(BaseModel.getRandomModels(2), (a, b) => cmp(a.code, b.code)), [new BaseModel("a"), new BaseModel("b")], "sample from good-sized list"); + check.equals(BaseModel.getRandomModels(2), [new BaseModel("a"), new BaseModel("a")], "sample from too small list"); + check.equals(BaseModel.getRandomModels(2), [new BaseModel(), new BaseModel()], "sample from empty list"); + }); + + test.case("makes upgrades available by level", check => { + let model = new BaseModel(); + + function verify(desc: string, level: number, specific: string[], available: string[], activated: string[], chosen: string[] = []) { + check.in(`${desc} level ${level}`, check => { + check.equals(model.getLevelUpgrades(level).map(u => u.code), specific, "specific"); + check.equals(model.getAvailableUpgrades(level).map(u => u.code), available, "available"); + check.equals(model.getActivatedUpgrades(level, chosen).map(u => u.code), activated, "activated"); + }); + } + + verify("initial", 1, [], [], []); + + check.patch(model, "getLevelUpgrades", (level: number): ModelUpgrade[] => { + if (level == 1) { + return [ + { code: "l1" }, + ]; + } else if (level == 2) { + return [ + { code: "l2a" }, + { code: "l2b" } + ]; + } else { + return []; + } + }); + + verify("standard", 0, [], [], []); + verify("standard", 1, ["l1"], ["l1"], ["l1"]); + verify("standard", 2, ["l2a", "l2b"], ["l1", "l2a", "l2b"], ["l1"]); + verify("standard", 3, [], ["l1", "l2a", "l2b"], ["l1"]); + + verify("with actives", 1, ["l1"], ["l1"], ["l1"], ["l2a", "l666"]); + verify("with actives", 2, ["l2a", "l2b"], ["l1", "l2a", "l2b"], ["l1", "l2a"], ["l2a", "l666"]); + verify("with actives", 3, [], ["l1", "l2a", "l2b"], ["l1", "l2a"], ["l2a", "l666"]); + }); + }); +} diff --git a/src/core/models/BaseModel.ts b/src/core/models/BaseModel.ts new file mode 100644 index 0000000..8665f68 --- /dev/null +++ b/src/core/models/BaseModel.ts @@ -0,0 +1,182 @@ +module TK.SpaceTac { + /** + * Single upgrade for a ship + * + * Upgrades allow for customizing a model, and are unlocked at given levels + */ + export type ModelUpgrade = { + // Displayable upgrade name, should be unique on the model + code: string + // Upgrade points cost (may be used to balance upgrades) + cost?: number + // Optional list of upgrade codes that must be activated for this one to be available + depends?: string[] + // Optional list of upgrade codes that this upgrade will fully replace + replaces?: string[] + // Optional list of upgrade codes that conflicts with this upgrade + conflicts?: string[] + // List of actions that this upgrade offers + actions?: BaseAction[] + // List of effects that this upgrade offers + effects?: BaseEffect[] + } + + /** + * Base class for ship models. + * + * A model defines the ship's design, actions, permanent effects, and levelling options. + */ + export class BaseModel { + constructor( + // Code to identify the model + readonly code = "default", + // Human-readable model name + readonly name = "Ship" + ) { } + + /** + * Check if this model is available at a given level + */ + isAvailable(level: number): boolean { + // TODO + return true; + } + + /** + * Get a textual description of the model + */ + getDescription(): string { + return ""; + } + + /** + * Get basic level upgrades + */ + protected getStandardUpgrades(level: number): ModelUpgrade[] { + return [ + { code: `Hull upgrade Lv${level - 1}`, effects: [new AttributeEffect("hull_capacity", 5)], cost: 2 }, + { code: `Shield upgrade Lv${level - 1}`, effects: [new AttributeEffect("shield_capacity", 5)], cost: 2 }, + { code: `Power upgrade Lv${level - 1}`, effects: [new AttributeEffect("power_capacity", 1)], cost: 3 }, + ]; + } + + /** + * Get the list of upgrades unlocked at a given level + */ + getLevelUpgrades(level: number): ModelUpgrade[] { + return []; + } + + /** + * Get the list of upgrades activated, given a ship level and an upgrade set + */ + getActivatedUpgrades(level: number, upgrade_codes: string[]): ModelUpgrade[] { + let result: ModelUpgrade[] = []; + + range(level).forEach(i => { + let upgrades = this.getLevelUpgrades(i + 1); + if (i == 0) { + result = result.concat(upgrades); + } else { + // TODO Apply depends, replaces and conflicts + upgrades.forEach(upgrade => { + if (contains(upgrade_codes, upgrade.code)) { + result.push(upgrade); + } + }); + } + }); + + return result; + } + + /** + * Get the list of available upgrades, given a ship level + * + * This does not filter the upgrades on dependencies + */ + getAvailableUpgrades(level: number): ModelUpgrade[] { + return flatten(range(level).map(i => this.getLevelUpgrades(i + 1))); + } + + /** + * Get the list of actions at a given level and upgrades set + * + * This does not include an "end turn" action. + */ + getActions(level: number, upgrade_codes: string[]): BaseAction[] { + return flatten(this.getActivatedUpgrades(level, upgrade_codes).map(upgrade => upgrade.actions || [])); + } + + /** + * Get the list of permanent effects at a given level and upgrades set + */ + getEffects(level: number, upgrade_codes: string[]): BaseEffect[] { + return flatten(this.getActivatedUpgrades(level, upgrade_codes).map(upgrade => upgrade.effects || [])); + } + + /** + * Get the default ship model collection available in-game + * + * This scans the current namespace for model classes starting with 'Model'. + */ + static getDefaultCollection(): BaseModel[] { + let result: BaseModel[] = []; + let namespace: any = TK.SpaceTac; + + for (let class_name in namespace) { + if (class_name && class_name.indexOf("Model") == 0) { + let model_class = namespace[class_name]; + if (model_class.prototype instanceof BaseModel) { + let model = new model_class(); + result.push(model); + } + } + } + + return result; + } + + /** + * Pick a random model in the default collection + */ + static getRandomModel(level?: number, random = RandomGenerator.global): BaseModel { + let collection = BaseModel.getDefaultCollection(); + if (level) { + collection = collection.filter(model => model.isAvailable(level)); + } + + if (collection.length == 0) { + console.error("Couldn't pick a random ship model"); + return new BaseModel(); + } else { + return random.choice(collection); + } + } + + /** + * Pick random models in the default collection + * + * At first it tries to pick unique models, then fill with duplicates + */ + static getRandomModels(count: number, level?: number, random = RandomGenerator.global): BaseModel[] { + let collection = BaseModel.getDefaultCollection(); + if (level) { + collection = collection.filter(model => model.isAvailable(level)); + } + + if (collection.length == 0) { + console.error("Couldn't pick a random model"); + return range(count).map(() => new BaseModel()); + } else { + let result: BaseModel[] = []; + while (count > 0) { + let picked = random.sample(collection, Math.min(count, collection.length)); + result = result.concat(picked); + count -= picked.length; + } + return result; + } + } + } +} diff --git a/src/core/models/ModelAvenger.ts b/src/core/models/ModelAvenger.ts new file mode 100644 index 0000000..a0cd08f --- /dev/null +++ b/src/core/models/ModelAvenger.ts @@ -0,0 +1,120 @@ +/// + +module TK.SpaceTac { + export class ModelAvenger extends BaseModel { + constructor() { + super("avenger", "Avenger"); + } + + getDescription(): string { + return "A heavy ship, dedicated to firing high precision charged shots across great distances."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + let engine = new MoveAction("Engine", { + distance_per_power: 50, + safety_distance: 250, + }); + engine.configureCooldown(1, 1); + + // TODO Weapons should be less efficient in short range + + let charged_shot = new TriggerAction("Charged Shot", { + effects: [new DamageEffect(30, 20)], + power: 3, + range: 900, + aim: 90, evasion: 40, luck: 20 + }, "gatlinggun"); + charged_shot.configureCooldown(2, 2); + + let long_range_missile = new TriggerAction("Long Range Missile", { + effects: [new DamageEffect(15, 25)], + power: 4, + range: 700, blast: 120, + aim: 70, evasion: 20, luck: 50 + }, "submunitionmissile"); + long_range_missile.configureCooldown(1, 2); + + let shield_booster = new TriggerAction("Shield Booster", { + effects: [ + new StickyEffect(new AttributeEffect("shield_capacity", 50), 2), + new ValueEffect("shield", 70), + ], + power: 2 + }, "forcefield"); + shield_booster.configureCooldown(1, 4); + + if (level == 1) { + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 8), + new AttributeEffect("maneuvrability", 0), + new AttributeEffect("hull_capacity", 80), + new AttributeEffect("shield_capacity", 20), + new AttributeEffect("power_capacity", 8), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Charged Shot", + actions: [charged_shot] + }, + { + code: "Long Range Missile", + actions: [long_range_missile] + }, + ]; + } else if (level == 2) { + return [ + { + code: "Laser Targetting", + cost: 1, + effects: [new AttributeEffect("precision", 2)] + }, + { + code: "Basic Countermeasures", + cost: 1, + effects: [new AttributeEffect("maneuvrability", 2)] + }, + { + code: "Targetting Assist", + cost: 3, + actions: [new ToggleAction("Targetting Assist", { + power: 3, + radius: 300, + effects: [new AttributeEffect("precision", 2)] + }, "precisionboost")] + }, + ]; + } else if (level == 3) { + return [ + { + code: "Gyroscopic Stabilizers", + cost: 1, + effects: [ + new AttributeEffect("precision", 3), + new AttributeEffect("maneuvrability", -2) + ] + }, + { + code: "Shield Booster", + cost: 3, + actions: [shield_booster] + }, + { + code: "Hard Coated Hull", + cost: 2, + effects: [new AttributeEffect("hull_capacity", 10)] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelBreeze.ts b/src/core/models/ModelBreeze.ts new file mode 100644 index 0000000..b25b7c1 --- /dev/null +++ b/src/core/models/ModelBreeze.ts @@ -0,0 +1,66 @@ +/// + +module TK.SpaceTac { + export class ModelBreeze extends BaseModel { + constructor() { + super("breeze", "Breeze"); + } + + getDescription(): string { + return "A swift piece of maneuvrability, able to go deep behind enemy lines, and come back without a scratch."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 300, + safety_distance: 100, + maneuvrability_factor: 60 + }); + engine.configureCooldown(2, 1); + + let gatling = new TriggerAction("Gatling Gun", { + effects: [new DamageEffect(35, 20)], + power: 2, + range: 200, + aim: 30, evasion: 10, luck: 20 + }, "gatlinggun"); + gatling.configureCooldown(3, 1); + + let shield_steal = new TriggerAction("Shield Steal", { + effects: [new ValueTransferEffect("shield", -40)], + power: 1, + blast: 300 + }, "shieldtransfer"); + shield_steal.configureCooldown(1, 2); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 3), + new AttributeEffect("maneuvrability", 12), + new AttributeEffect("hull_capacity", 30), + new AttributeEffect("shield_capacity", 50), + new AttributeEffect("power_capacity", 7), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Gatling Gun", + actions: [gatling] + }, + { + code: "Shield Steal", + actions: [shield_steal] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelCommodore.ts b/src/core/models/ModelCommodore.ts new file mode 100644 index 0000000..da5a3a6 --- /dev/null +++ b/src/core/models/ModelCommodore.ts @@ -0,0 +1,63 @@ +/// + +module TK.SpaceTac { + export class ModelCommodore extends BaseModel { + constructor() { + super("commodore", "Commodore"); + } + + getDescription(): string { + return "A devil whirlwind, very dangerous to surround."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 150, + }); + + let laser = new TriggerAction("Wingspan Laser", { + effects: [new DamageEffect(25, 25)], + power: 4, + range: 250, angle: 140, + aim: 30, evasion: 45, luck: 30, + }, "prokhorovlaser"); + laser.configureCooldown(3, 1); + + let power_steal = new TriggerAction("Power Thief", { + effects: [new ValueTransferEffect("power", -1)], + power: 1, + blast: 250 + }, "powerdepleter"); + power_steal.configureCooldown(1, 1); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 5), + new AttributeEffect("maneuvrability", 6), + new AttributeEffect("hull_capacity", 70), + new AttributeEffect("shield_capacity", 40), + new AttributeEffect("power_capacity", 8), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Wingspan Laser", + actions: [laser] + }, + { + code: "Power Thief", + actions: [power_steal] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelCreeper.ts b/src/core/models/ModelCreeper.ts new file mode 100644 index 0000000..fbbe81d --- /dev/null +++ b/src/core/models/ModelCreeper.ts @@ -0,0 +1,74 @@ +/// + +module TK.SpaceTac { + export class ModelCreeper extends BaseModel { + constructor() { + super("creeper", "Creeper"); + } + + getDescription(): string { + return "A fast ship, with low firepower but extensive support modules."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 220, + }); + + let gatling = new TriggerAction("Gatling Gun", { + effects: [new DamageEffect(15, 10)], + power: 2, + range: 200, + }, "gatlinggun"); + gatling.configureCooldown(1, 1); + + let repulse = new TriggerAction("Repulser", { + effects: [new RepelEffect(150)], + power: 2, + blast: 350, + }, "gravitshield"); + repulse.configureCooldown(1, 1); + + let repairdrone = new DeployDroneAction("Repair Drone", { power: 3 }, { + deploy_distance: 300, + drone_radius: 150, + drone_effects: [ + new ValueEffect("hull", undefined, undefined, undefined, 30) + ] + }, "repairdrone"); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 3), + new AttributeEffect("maneuvrability", 12), + new AttributeEffect("hull_capacity", 30), + new AttributeEffect("shield_capacity", 50), + new AttributeEffect("power_capacity", 7), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Gatling Gun", + actions: [gatling] + }, + { + code: "Repulser", + actions: [repulse] + }, + { + code: "Repair Drone", + actions: [repairdrone] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelFalcon.ts b/src/core/models/ModelFalcon.ts new file mode 100644 index 0000000..177cd27 --- /dev/null +++ b/src/core/models/ModelFalcon.ts @@ -0,0 +1,62 @@ +/// + +module TK.SpaceTac { + export class ModelFalcon extends BaseModel { + constructor() { + super("falcon", "Falcon"); + } + + getDescription(): string { + return "A ship with an efficient targetting system, allowing to hit multiple foes."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 130, + }); + + let missile = new TriggerAction("SubMunition Missile", { + effects: [new DamageEffect(10, 10)], + power: 2, + range: 250, blast: 150, + }, "submunitionmissile"); + missile.configureCooldown(2, 2); + + let gatling = new TriggerAction("Gatling Gun", { + effects: [new DamageEffect(10, 10)], + power: 1, + range: 350, + }, "gatlinggun"); + gatling.configureCooldown(3, 2); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 8), + new AttributeEffect("maneuvrability", 4), + new AttributeEffect("hull_capacity", 50), + new AttributeEffect("shield_capacity", 50), + new AttributeEffect("power_capacity", 9), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Submunition Missile", + actions: [missile] + }, + { + code: "Gatling Gun", + actions: [gatling] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelFlea.ts b/src/core/models/ModelFlea.ts new file mode 100644 index 0000000..2a66c61 --- /dev/null +++ b/src/core/models/ModelFlea.ts @@ -0,0 +1,60 @@ +/// + +module TK.SpaceTac { + export class ModelFlea extends BaseModel { + constructor() { + super("flea", "Flea"); + } + + getDescription(): string { + return "An agile but weak ship, specialized in disruptive technologies."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 400, + }); + + let depleter = new TriggerAction("Power Depleter", { + effects: [new StickyEffect(new AttributeLimitEffect("power_capacity", 3))], + power: 2, + range: 450, + }, "powerdepleter"); + depleter.configureCooldown(1, 1); + + let gatling = new TriggerAction("Gatling Gun", { + effects: [new DamageEffect(5, 30)], + }, "gatlinggun"); + gatling.configureCooldown(2, 1); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 0), + new AttributeEffect("maneuvrability", 15), + new AttributeEffect("hull_capacity", 25), + new AttributeEffect("shield_capacity", 45), + new AttributeEffect("power_capacity", 8), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Power Depleter", + actions: [depleter] + }, + { + code: "Gatling Gun", + actions: [gatling] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelJumper.ts b/src/core/models/ModelJumper.ts new file mode 100644 index 0000000..fdd597d --- /dev/null +++ b/src/core/models/ModelJumper.ts @@ -0,0 +1,72 @@ +/// + +module TK.SpaceTac { + export class ModelJumper extends BaseModel { + constructor() { + super("jumper", "Jumper"); + } + + getDescription(): string { + return "A mid-range action ship, with support abilities."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 200, + safety_distance: 160, + }); + + let missile = new TriggerAction("SubMunition Missile", { + effects: [new DamageEffect(30, 30)], + power: 3, + range: 400, blast: 120, + aim: 70, evasion: 30, luck: 10, + }, "submunitionmissile"); + + let protector = new TriggerAction("Damage Reductor", { + effects: [new StickyEffect(new DamageModifierEffect(-20), 2)], + power: 3, + range: 300, blast: 150 + }, "damageprotector"); + protector.configureCooldown(1, 3); + + let hull_regrowth = new ToggleAction("Hull Regrowth", { + power: 2, + effects: [new ValueEffect("hull", 0, 0, 10)] + }, "fractalhull"); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 9), + new AttributeEffect("maneuvrability", 3), + new AttributeEffect("hull_capacity", 40), + new AttributeEffect("shield_capacity", 40), + new AttributeEffect("power_capacity", 6), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Missile", + actions: [missile] + }, + { + code: "Damage Reductor", + actions: [protector] + }, + { + code: "Hull Regrowth", + actions: [hull_regrowth] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelRhino.ts b/src/core/models/ModelRhino.ts new file mode 100644 index 0000000..cdd31ad --- /dev/null +++ b/src/core/models/ModelRhino.ts @@ -0,0 +1,62 @@ +/// + +module TK.SpaceTac { + export class ModelRhino extends BaseModel { + constructor() { + super("rhino", "Rhino"); + } + + getDescription(): string { + return "A sturdy ship, able to sustain massive damage."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 140, + }); + + let gatling = new TriggerAction("Gatling Gun", { + effects: [new DamageEffect(30, 20)], + power: 3, + range: 400, + }, "gatlinggun"); + gatling.configureCooldown(2, 2); + + let laser = new TriggerAction("Prokhorov Laser", { + effects: [new DamageEffect(25, 25)], + power: 4, + range: 250, angle: 60, + aim: 30, evasion: 45, luck: 30, + }, "prokhorovlaser"); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 4), + new AttributeEffect("maneuvrability", 3), + new AttributeEffect("hull_capacity", 100), + new AttributeEffect("shield_capacity", 20), + new AttributeEffect("power_capacity", 9), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Gatling Gun", + actions: [gatling] + }, + { + code: "Prokhorov Laser", + actions: [laser] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelTomahawk.ts b/src/core/models/ModelTomahawk.ts new file mode 100644 index 0000000..bb3a20b --- /dev/null +++ b/src/core/models/ModelTomahawk.ts @@ -0,0 +1,91 @@ +/// + +module TK.SpaceTac { + export class ModelTomahawk extends BaseModel { + constructor() { + super("tomahawk", "Tomahawk"); + } + + getDescription(): string { + return "A ship compensating its somewhat weak equipments with high power and usability."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 160, + }); + + let gatling1 = new TriggerAction("Primary Gatling", { + effects: [new DamageEffect(15, 15)], + power: 2, range: 400 + }, "gatlinggun"); + gatling1.configureCooldown(1, 1); + + let gatling2 = new TriggerAction("Secondary Gatling", { + effects: [new DamageEffect(20, 15)], + power: 1, range: 200 + }, "gatlinggun"); + gatling2.configureCooldown(1, 1); + + let missile = new TriggerAction("Diffuse Missiles", { + effects: [new DamageEffect(10, 18)], + power: 2, + range: 200, blast: 100, + }, "submunitionmissile"); + missile.configureCooldown(1, 1); + + let laser = new TriggerAction("Low-power Laser", { + effects: [new DamageEffect(20, 20)], + power: 2, + range: 200, angle: 30 + }, "prokhorovlaser"); + laser.configureCooldown(1, 1); + + let cooler = new TriggerAction("Circuits Cooler", { + effects: [new CooldownEffect(1, 1)], + power: 1, + }, "kelvingenerator"); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 8), + new AttributeEffect("maneuvrability", 3), + new AttributeEffect("hull_capacity", 60), + new AttributeEffect("shield_capacity", 40), + new AttributeEffect("power_capacity", 11), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Primary Gatling", + actions: [gatling1] + }, + { + code: "Secondary Gatling", + actions: [gatling2] + }, + { + code: "SubMunition Missile", + actions: [missile] + }, + { + code: "Laser", + actions: [laser] + }, + { + code: "Cooler", + actions: [cooler] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelTrapper.ts b/src/core/models/ModelTrapper.ts new file mode 100644 index 0000000..8b7d8c2 --- /dev/null +++ b/src/core/models/ModelTrapper.ts @@ -0,0 +1,72 @@ +/// + +module TK.SpaceTac { + export class ModelTrapper extends BaseModel { + constructor() { + super("trapper", "Trapper"); + } + + getDescription(): string { + return "A mostly defensive ship, used to protect allies from enemy fire."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 220, + }); + engine.configureCooldown(1, 1); + + let protector = new ToggleAction("Damage Protector", { + power: 4, + radius: 300, + effects: [new DamageModifierEffect(-35)] + }); + + let depleter = new TriggerAction("Power Depleter", { + effects: [new StickyEffect(new AttributeLimitEffect("power_capacity", 3))], + power: 2, + range: 200, + }, "powerdepleter"); + depleter.configureCooldown(1, 1); + + let missile = new TriggerAction("Defense Missiles", { + effects: [new DamageEffect(25, 30)], + power: 3, + range: 200, blast: 200, + }, "submunitionmissile"); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 3), + new AttributeEffect("maneuvrability", 2), + new AttributeEffect("hull_capacity", 40), + new AttributeEffect("shield_capacity", 70), + new AttributeEffect("power_capacity", 8), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Damage Protector", + actions: [protector] + }, + { + code: "Power Depleter", + actions: [depleter] + }, + { + code: "SubMunition Missile", + actions: [missile] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/core/models/ModelXander.ts b/src/core/models/ModelXander.ts new file mode 100644 index 0000000..8a69e26 --- /dev/null +++ b/src/core/models/ModelXander.ts @@ -0,0 +1,72 @@ +/// + +module TK.SpaceTac { + export class ModelXander extends BaseModel { + constructor() { + super("xander", "Xander"); + } + + getDescription(): string { + return "A ship with impressive survival capabilities."; + } + + getLevelUpgrades(level: number): ModelUpgrade[] { + if (level == 1) { + let engine = new MoveAction("Engine", { + distance_per_power: 150, + }); + + let laser = new TriggerAction("Prokhorov Laser", { + effects: [new DamageEffect(20, 40)], + power: 3, + range: 250, angle: 80, + aim: 30, evasion: 45, luck: 30, + }); + + let hull = new TriggerAction("Hull Shedding", { + effects: [new ValueEffect("hull", 120)], + power: 1 + }, "fractalhull"); + hull.configureCooldown(1, 4); + + // TODO Is currently always used by move-fire simulator + let disengage = new MoveAction("Disengage", { + distance_per_power: 1000, + safety_distance: 200, + }, "ionthruster"); + disengage.configureCooldown(1, 3); + + return [ + { + code: "Base Attributes", + effects: [ + new AttributeEffect("precision", 8), + new AttributeEffect("maneuvrability", 5), + new AttributeEffect("hull_capacity", 80), + new AttributeEffect("shield_capacity", 15), + new AttributeEffect("power_capacity", 7), + ] + }, + { + code: "Main Engine", + actions: [engine] + }, + { + code: "Prokhorov Laser", + actions: [laser] + }, + { + code: "Fractal Hull", + actions: [hull] + }, + { + code: "Disengage", + actions: [disengage] + }, + ]; + } else { + return this.getStandardUpgrades(level); + } + } + } +} diff --git a/src/ui/AssetLoading.ts b/src/ui/AssetLoading.ts index 98e239a..7f1f27c 100644 --- a/src/ui/AssetLoading.ts +++ b/src/ui/AssetLoading.ts @@ -118,7 +118,6 @@ module TK.SpaceTac.UI { this.loadSheet("map/action.png", 323, 192); this.loadImage("map/orbit.png"); this.loadImage("map/boundaries.png"); - this.loadSheet("map/buttons.png", 115, 191); this.loadSheet("map/mission-action.png", 192, 56); this.loadSound("music/division.mp3"); diff --git a/src/ui/BaseView.ts b/src/ui/BaseView.ts index 164313c..ca91e7a 100644 --- a/src/ui/BaseView.ts +++ b/src/ui/BaseView.ts @@ -240,10 +240,10 @@ module TK.SpaceTac.UI { /** * Get an image from atlases */ - getImageInfo(name: string): { key: string, frame: number } { + getImageInfo(name: string): { key: string, frame: number, exists: boolean } { // TODO Cache if (this.game.cache.checkImageKey(name)) { - return { key: name, frame: 0 }; + return { key: name, frame: 0, exists: true }; } else { let i = 1; while (this.game.cache.checkImageKey(`atlas-${i}`)) { @@ -251,11 +251,11 @@ module TK.SpaceTac.UI { let frames = data.getFrames(); let frame = first(frames, frame => AssetLoading.getKey(frame.name) == `graphics-exported-${name}`); if (frame) { - return { key: `atlas-${i}`, frame: frame.index }; + return { key: `atlas-${i}`, frame: frame.index, exists: true }; } i++; } - return { key: `-missing-${name}`, frame: 0 }; + return { key: `-missing-${name}`, frame: 0, exists: false }; } } diff --git a/src/ui/battle/ActionBar.spec.ts b/src/ui/battle/ActionBar.spec.ts index 8e997cc..7531c0a 100644 --- a/src/ui/battle/ActionBar.spec.ts +++ b/src/ui/battle/ActionBar.spec.ts @@ -30,7 +30,7 @@ module TK.SpaceTac.UI.Specs { TestTools.addWeapon(ship, 10, 1, 100); bar.setShip(ship); check.equals(bar.action_icons.length, 3); - check.equals(bar.action_icons[1].action.code, "fire-equipment"); + check.equals(bar.action_icons[1].action.code, "weapon"); }); test.case("updates power points display", check => { @@ -54,7 +54,7 @@ module TK.SpaceTac.UI.Specs { // not owned ship let ship = new Ship(); - TestTools.setShipAP(ship, 8); + TestTools.setShipModel(ship, 100, 0, 8); bar.setShip(ship); checkpoints("not owned ship"); diff --git a/src/ui/battle/ActionBar.ts b/src/ui/battle/ActionBar.ts index 41086af..958b75b 100644 --- a/src/ui/battle/ActionBar.ts +++ b/src/ui/battle/ActionBar.ts @@ -83,7 +83,7 @@ module TK.SpaceTac.UI { } else if (diff instanceof ShipCooldownDiff) { return { background: async () => { - let icons = this.action_icons.filter(icon => icon.action.equipment && icon.action.equipment.is(diff.equipment)); + let icons = this.action_icons.filter(icon => icon.action.is(diff.action)); icons.forEach(icon => icon.refresh()); } } @@ -226,11 +226,7 @@ module TK.SpaceTac.UI { this.clearAll(); if (ship && this.battleview.player.is(ship.fleet.player) && ship.alive) { - var actions = ship.getAvailableActions(); - actions.forEach((action: BaseAction) => { - this.addAction(ship, action); - }); - + ship.actions.listAll().forEach(action => this.addAction(ship, action)); this.ship = ship; } else { this.ship = null; diff --git a/src/ui/battle/ActionIcon.spec.ts b/src/ui/battle/ActionIcon.spec.ts index 49bcf80..03617ce 100644 --- a/src/ui/battle/ActionIcon.spec.ts +++ b/src/ui/battle/ActionIcon.spec.ts @@ -32,8 +32,8 @@ module TK.SpaceTac.UI.Specs { test.case("displays disabled and fading states", check => { let bar = testgame.view.action_bar; let ship = new Ship(); - TestTools.setShipAP(ship, 5); - let action = nn(TestTools.addWeapon(ship, 50, 3).action); + TestTools.setShipModel(ship, 100, 0, 5); + let action = TestTools.addWeapon(ship, 50, 3); let icon = new ActionIcon(bar, ship, action, 0); check.equals(icon.container.name, "battle-actionbar-frame-enabled", "5/5"); @@ -70,11 +70,9 @@ module TK.SpaceTac.UI.Specs { test.case("displays toggle state", check => { let bar = testgame.view.action_bar; let ship = new Ship(); - TestTools.setShipAP(ship, 5); - let equipment = new Equipment(SlotType.Weapon); - ship.addSlot(SlotType.Weapon).attach(equipment); - let action = new ToggleAction(equipment, 2); - equipment.action = action; + TestTools.setShipModel(ship, 100, 0, 5); + let action = new ToggleAction("toggle", { power: 2 }); + ship.actions.addCustom(action); let icon = new ActionIcon(bar, ship, action, 0); check.equals(icon.img_bottom.name, "battle-actionbar-bottom-enabled", "initial"); @@ -82,7 +80,7 @@ module TK.SpaceTac.UI.Specs { check.equals(icon.img_sticky.name, "battle-actionbar-sticky-untoggled", "initial"); check.same(icon.img_sticky.visible, true, "initial"); - action.activated = true; + ship.actions.toggle(action, true); icon.refresh(); check.equals(icon.img_bottom.name, "battle-actionbar-bottom-toggled", "initial"); check.equals(icon.img_power.name, "battle-actionbar-consumption-toggled", "initial"); @@ -93,9 +91,10 @@ module TK.SpaceTac.UI.Specs { test.case("displays overheat/cooldown", check => { let bar = testgame.view.action_bar; let ship = new Ship(); - TestTools.setShipAP(ship, 5); - let action = nn(TestTools.addWeapon(ship, 50, 3).action); - action.cooldown.configure(1, 3); + let action = new TriggerAction("weapon"); + + action.configureCooldown(1, 3); + TestTools.setShipModel(ship, 100, 0, 5, 1, [action]); let icon = new ActionIcon(bar, ship, action, 0); check.same(icon.img_sticky.visible, false, "initial"); check.equals(icon.img_sticky.name, "battle-actionbar-sticky-untoggled", "initial"); @@ -106,14 +105,16 @@ module TK.SpaceTac.UI.Specs { check.equals(icon.img_sticky.name, "battle-actionbar-sticky-overheat", "overheat"); check.same(icon.img_sticky.children.length, 3, "overheat"); - action.cooldown.configure(1, 12); + action.configureCooldown(1, 12); + TestTools.setShipModel(ship, 100, 0, 5, 1, [action]); icon.refresh(action); check.same(icon.img_sticky.visible, true, "superheat"); check.equals(icon.img_sticky.name, "battle-actionbar-sticky-overheat", "superheat"); check.same(icon.img_sticky.children.length, 5, "superheat"); - action.cooldown.configure(1, 4); - action.cooldown.use(); + action.configureCooldown(1, 4); + TestTools.setShipModel(ship, 100, 0, 5, 1, [action]); + ship.actions.getCooldown(action).use(); icon.refresh(action); check.same(icon.img_sticky.visible, true, "cooling"); check.equals(icon.img_sticky.name, "battle-actionbar-sticky-disabled", "cooling"); @@ -125,8 +126,8 @@ module TK.SpaceTac.UI.Specs { let bar = testgame.view.action_bar; let ship = new Ship(); - TestTools.setShipAP(ship, 5); - let action = nn(TestTools.addWeapon(ship, 50, 3).action); + TestTools.setShipModel(ship, 100, 0, 5); + let action = TestTools.addWeapon(ship, 50, 3); let icon = new ActionIcon(bar, ship, action, 0); check.same(icon.img_targetting.visible, false, "initial"); diff --git a/src/ui/battle/ActionIcon.ts b/src/ui/battle/ActionIcon.ts index f41c6d4..b2fddde 100644 --- a/src/ui/battle/ActionIcon.ts +++ b/src/ui/battle/ActionIcon.ts @@ -50,7 +50,7 @@ module TK.SpaceTac.UI { let builder = new UIBuilder(this.view, this.container); // Action icon - this.img_action = builder.image([`action-${action.code}`, `equipment-${action.equipment ? action.equipment.code : "---"}`]); + this.img_action = builder.image(`action-${action.code}`); this.img_action.anchor.set(0.5); this.img_action.scale.set(0.35); this.img_action.alpha = 0.2; @@ -147,7 +147,7 @@ module TK.SpaceTac.UI { this.processSelection(Target.newFromShip(this.ship)); } else { // Switch to targetting mode (will apply action when a target is selected) - this.view.enterTargettingMode(this.action, mode); + this.view.enterTargettingMode(this.ship, this.action, mode); } } @@ -170,13 +170,14 @@ module TK.SpaceTac.UI { refresh(used: BaseAction | null = null, power_consumption = 0): void { let disabled = bool(this.action.checkCannotBeApplied(this.ship)); let selected = (used === this.action); - let toggled = (this.action instanceof ToggleAction) && this.action.activated; + let toggled = (this.action instanceof ToggleAction) && this.ship.actions.isToggled(this.action); let fading = bool(this.action.checkCannotBeApplied(this.ship, this.ship.getValue("power") - power_consumption)); - let cooldown = this.action.cooldown.heat; + let cooldown = this.ship.actions.getCooldown(this.action); + let heat = cooldown.heat; let targetting = used !== null; - if (this.action == used && this.action.cooldown.willOverheat()) { + if (this.action == used && cooldown.willOverheat()) { fading = true; - cooldown = this.action.cooldown.cooling; + heat = cooldown.cooling; } // inputs @@ -242,7 +243,7 @@ module TK.SpaceTac.UI { } // right - if (toggled != this.toggled || disabled != this.disabled || cooldown != this.cooldown) { + if (toggled != this.toggled || disabled != this.disabled || heat != this.cooldown) { destroyChildren(this.img_sticky); if (this.action instanceof ToggleAction) { if (toggled) { @@ -251,13 +252,13 @@ module TK.SpaceTac.UI { this.view.changeImage(this.img_sticky, "battle-actionbar-sticky-untoggled"); } this.img_sticky.visible = !disabled; - } else if (cooldown) { + } else if (heat) { if (disabled) { this.view.changeImage(this.img_sticky, "battle-actionbar-sticky-disabled"); } else { this.view.changeImage(this.img_sticky, "battle-actionbar-sticky-overheat"); } - range(Math.min(cooldown - 1, 4)).forEach(i => { + range(Math.min(heat - 1, 4)).forEach(i => { this.img_sticky.addChild(this.view.newImage("battle-actionbar-cooldown-one", 0, 2 - i * 7)); }); this.img_sticky.addChild(this.view.newImage("battle-actionbar-cooldown-front", -4, -20)); @@ -272,7 +273,7 @@ module TK.SpaceTac.UI { this.targetting = targetting; this.fading = fading; this.toggled = toggled; - this.cooldown = cooldown; + this.cooldown = heat; } } } diff --git a/src/ui/battle/ActionTooltip.spec.ts b/src/ui/battle/ActionTooltip.spec.ts index ebb6c9b..70f20fa 100644 --- a/src/ui/battle/ActionTooltip.spec.ts +++ b/src/ui/battle/ActionTooltip.spec.ts @@ -7,26 +7,21 @@ module TK.SpaceTac.UI.Specs { test.case("displays action information", check => { let tooltip = new Tooltip(testgame.view); let ship = new Ship(); - TestTools.setShipAP(ship, 10); + TestTools.setShipModel(ship, 100, 0, 10); - let action1 = new MoveAction(new Equipment()); - nn(action1.equipment).name = "Engine"; - check.patch(action1, "getVerb", () => "Move"); - let action2 = new TriggerAction(new Equipment(), [new DamageEffect(12)], 2, 50, 0); - nn(action2.equipment).name = "Weapon"; - check.patch(action2, "getVerb", () => "Fire"); + let action1 = new MoveAction("Thruster"); + let action2 = new TriggerAction("Superweapon", { effects: [new DamageEffect(12)], power: 2, range: 50 }); let action3 = new EndTurnAction(); - check.patch(action3, "getVerb", () => "End turn"); ActionTooltip.fill(tooltip.getBuilder(), ship, action1, 0); - checkText(check, (tooltip).container.content.children[1], "Engine"); + checkText(check, (tooltip).container.content.children[1], "Use Thruster"); checkText(check, (tooltip).container.content.children[2], "Cost: 1 power per 0km"); checkText(check, (tooltip).container.content.children[3], "Move: 0km per power point (safety: 120km)"); checkText(check, (tooltip).container.content.children[4], "[ 1 ]"); tooltip.hide(); ActionTooltip.fill(tooltip.getBuilder(), ship, action2, 1); - checkText(check, (tooltip).container.content.children[1], "Weapon"); + checkText(check, (tooltip).container.content.children[1], "Fire Superweapon"); checkText(check, (tooltip).container.content.children[2], "Cost: 2 power"); checkText(check, (tooltip).container.content.children[3], "Fire (power 2, range 50km):\n• do 12 damage on target"); checkText(check, (tooltip).container.content.children[4], "[ 2 ]"); diff --git a/src/ui/battle/ActionTooltip.ts b/src/ui/battle/ActionTooltip.ts index ab95c64..f888698 100644 --- a/src/ui/battle/ActionTooltip.ts +++ b/src/ui/battle/ActionTooltip.ts @@ -9,10 +9,10 @@ module TK.SpaceTac.UI { static fill(filler: TooltipBuilder, ship: Ship, action: BaseAction, position: number) { let builder = filler.styled({ size: 20 }); - let icon = builder.image([`equipment-${action.equipment ? action.equipment.code : "---"}`, `action-${action.code}`]); + let icon = builder.image(`action-${action.code}`); icon.scale.set(0.5); - builder.text(action.equipment ? action.equipment.name : action.getVerb(), 150, 0, { size: 24 }); + builder.text(action.getTitle(ship), 150, 0, { size: 24 }); let cost = ""; if (action instanceof MoveAction) { @@ -37,8 +37,8 @@ module TK.SpaceTac.UI { builder.text(cost, 150, 40, { color: "#ffdd4b" }); } - if (action.equipment && action.equipment.cooldown.overheat) { - let cooldown = action.equipment.cooldown; + let cooldown = ship.actions.getCooldown(action); + if (cooldown.overheat) { if (cooldown.heat > 0) { builder.text("Cooling down ...", 150, 80, { color: "#d8894d" }); } else if (cooldown.willOverheat() && cost != "Not enough power") { @@ -49,7 +49,7 @@ module TK.SpaceTac.UI { builder.text("Unavailable until next turn if used", 150, 80, { color: "#d8894d" }); } } - } else if (action instanceof ToggleAction && action.activated) { + } else if (action instanceof ToggleAction && ship.actions.isToggled(action)) { builder.text(`Activated`, 150, 80, { color: "#dbe748" }); } diff --git a/src/ui/battle/Arena.ts b/src/ui/battle/Arena.ts index 606cb2c..e7eafca 100644 --- a/src/ui/battle/Arena.ts +++ b/src/ui/battle/Arena.ts @@ -65,9 +65,12 @@ module TK.SpaceTac.UI { this.range_hint.setLayer(this.layer_hints); this.addShipSprites(); + view.battle.drones.list().forEach(drone => this.addDrone(drone, false)); this.container.onDestroy.add(() => this.destroy()); + view.log_processor.register(diff => this.checkDroneDeployed(diff)); + view.log_processor.register(diff => this.checkDroneRecalled(diff)); view.log_processor.watchForShipChange(ship => { return { foreground: async () => { @@ -292,5 +295,45 @@ module TK.SpaceTac.UI { getBoundaries(): IBounded { return this.boundaries; } + + /** + * Check if a new drone as been deployed + */ + private checkDroneDeployed(diff: BaseBattleDiff): LogProcessorDelegate { + if (diff instanceof DroneDeployedDiff) { + return { + foreground: async (animate) => { + let duration = this.addDrone(diff.drone, animate); + if (duration) { + this.view.gameui.audio.playOnce("battle-drone-deploy"); + if (animate) { + await this.view.timer.sleep(duration); + } + } + } + } + } else { + return {}; + } + } + + /** + * Check if a drone as been recalled + */ + private checkDroneRecalled(diff: BaseBattleDiff): LogProcessorDelegate { + if (diff instanceof DroneRecalledDiff) { + return { + foreground: async () => { + let duration = this.removeDrone(diff.drone); + if (duration) { + this.view.gameui.audio.playOnce("battle-drone-destroy"); + await this.view.timer.sleep(duration); + } + } + } + } else { + return {}; + } + } } } diff --git a/src/ui/battle/ArenaDrone.ts b/src/ui/battle/ArenaDrone.ts index e5c196b..3ed4639 100644 --- a/src/ui/battle/ArenaDrone.ts +++ b/src/ui/battle/ArenaDrone.ts @@ -39,8 +39,7 @@ module TK.SpaceTac.UI { this.activation.visible = false; this.add(this.activation); - let name = this.view.getFirstImage(`equipment-${drone.code}`, `battle-actions-deploy-${drone.code}`); - this.sprite = this.view.newButton(name); + this.sprite = this.view.newButton(`action-${drone.code}`); this.sprite.anchor.set(0.5, 0.5); this.sprite.scale.set(0.1, 0.1); this.add(this.sprite); diff --git a/src/ui/battle/ArenaShip.spec.ts b/src/ui/battle/ArenaShip.spec.ts index 9e61ebb..26907c7 100644 --- a/src/ui/battle/ArenaShip.spec.ts +++ b/src/ui/battle/ArenaShip.spec.ts @@ -10,11 +10,11 @@ module TK.SpaceTac.UI.Specs { check.equals(sprite.effects_messages.children.length, 0); - sprite.displayAttributeChanged(new ShipAttributeDiff(ship, "power_generation", { cumulative: -4 }, {})); + sprite.displayAttributeChanged(new ShipAttributeDiff(ship, "power_capacity", { cumulative: -4 }, {})); check.equals(sprite.effects_messages.children.length, 1); let t1 = sprite.effects_messages.getChildAt(0); - check.equals(t1.text, "power generation -4"); + check.equals(t1.text, "power capacity -4"); }); test.case("adds sticky effects display", check => { diff --git a/src/ui/battle/ArenaShip.ts b/src/ui/battle/ArenaShip.ts index 81c0ffa..5f7db3a 100644 --- a/src/ui/battle/ArenaShip.ts +++ b/src/ui/battle/ArenaShip.ts @@ -210,15 +210,13 @@ module TK.SpaceTac.UI { } else if (diff instanceof ShipActionToggleDiff) { return { foreground: async (animate, timer) => { - let action = this.ship.getAction(diff.action); - if (action && action.equipment) { - let equname = action.equipment.name; - + let action = this.ship.actions.getById(diff.action); + if (action) { if (animate) { if (diff.activated) { - await this.displayEffect(`${equname} ON`, true); + await this.displayEffect(`${action.name} ON`, true); } else { - await this.displayEffect(`${equname} OFF`, false); + await this.displayEffect(`${action.name} OFF`, false); } } @@ -228,19 +226,9 @@ module TK.SpaceTac.UI { } } } else if (diff instanceof ShipActionUsedDiff) { - let action = this.ship.getAction(diff.action); + let action = this.ship.actions.getById(diff.action); if (action) { - if (!(action instanceof ToggleAction) && action.equipment) { - let equipment = action.equipment; - return { - foreground: async (animate, timer) => { - if (animate) { - await this.displayEffect(equipment.name, true); - await timer.sleep(300); - } - } - } - } else if (action instanceof EndTurnAction) { + if (action instanceof EndTurnAction) { return { foreground: async (animate, timer) => { if (animate) { @@ -249,6 +237,16 @@ module TK.SpaceTac.UI { } } } + } else if (!(action instanceof ToggleAction)) { + let action_name = action.name; + return { + foreground: async (animate, timer) => { + if (animate) { + await this.displayEffect(action_name, true); + await timer.sleep(300); + } + } + } } else { return {}; } @@ -408,13 +406,11 @@ module TK.SpaceTac.UI { */ updateEffectsRadius(): void { this.effects_radius.clear(); - this.ship.getAvailableActions().forEach(action => { - if (action instanceof ToggleAction && action.activated) { - this.effects_radius.lineStyle(2, 0xe9f2f9, 0.3); - this.effects_radius.beginFill(0xe9f2f9, 0.0); - this.effects_radius.drawCircle(0, 0, action.radius * 2); - this.effects_radius.endFill(); - } + this.ship.actions.listToggled().forEach(action => { + this.effects_radius.lineStyle(2, 0xe9f2f9, 0.3); + this.effects_radius.beginFill(0xe9f2f9, 0.0); + this.effects_radius.drawCircle(0, 0, action.radius * 2); + this.effects_radius.endFill(); }); } } diff --git a/src/ui/battle/BattleView.spec.ts b/src/ui/battle/BattleView.spec.ts index 9ff98c7..597d8ac 100644 --- a/src/ui/battle/BattleView.spec.ts +++ b/src/ui/battle/BattleView.spec.ts @@ -34,15 +34,16 @@ module TK.SpaceTac.UI.Specs { check.equals(battleview.targetting.active, false); battleview.setInteractionEnabled(true); - let weapon = TestTools.addWeapon(nn(battleview.battle.playing_ship), 10); - battleview.enterTargettingMode(nn(weapon.action), ActionTargettingMode.SPACE); + let ship = nn(battleview.battle.playing_ship); + let weapon = TestTools.addWeapon(ship, 10); + battleview.enterTargettingMode(ship, weapon, ActionTargettingMode.SPACE); check.equals(battleview.targetting.active, true); battleview.cursorHovered(new ArenaLocation(5, 8), null); check.equals(battleview.targetting.target, Target.newFromLocation(5, 8)); check.equals(battleview.ship_hovered, null); - let ship = battleview.battle.play_order[3]; + ship = battleview.battle.play_order[3]; battleview.cursorHovered(ship.location, ship); check.equals(battleview.targetting.target, Target.newFromLocation(ship.arena_x, ship.arena_y)); check.equals(battleview.ship_hovered, null); diff --git a/src/ui/battle/BattleView.ts b/src/ui/battle/BattleView.ts index a523b21..5116d88 100644 --- a/src/ui/battle/BattleView.ts +++ b/src/ui/battle/BattleView.ts @@ -119,7 +119,7 @@ module TK.SpaceTac.UI { this.layer_borders, this.getWidth() - 112, 0); this.ship_list.bindToLog(this.log_processor); this.ship_tooltip = new ShipTooltip(this); - this.character_sheet = new CharacterSheet(this, -this.getWidth()); + this.character_sheet = new CharacterSheet(this); this.layer_sheets.add(this.character_sheet); // Targetting info @@ -192,7 +192,7 @@ module TK.SpaceTac.UI { let ship = this.actual_battle.playing_ship; if (ship) { - let ship_action = first(ship.getAvailableActions(), ac => ac.is(action)); + let ship_action = ship.actions.getById(action.id); if (ship_action) { let result = this.actual_battle.applyOneAction(action.id, target); if (result) { @@ -200,7 +200,7 @@ module TK.SpaceTac.UI { } return result; } else { - console.error("Action not found in available list", action, ship.getAvailableActions()); + console.error("Action not found in available list", action, ship.actions); return false; } } else { @@ -327,20 +327,20 @@ module TK.SpaceTac.UI { // Enter targetting mode // While in this mode, the Targetting object will receive hover and click events, and handle them - enterTargettingMode(action: BaseAction, mode: ActionTargettingMode): Targetting | null { + enterTargettingMode(ship: Ship, action: BaseAction, mode: ActionTargettingMode): Targetting | null { if (!this.interacting) { return null; } this.setShipHovered(null); - this.targetting.setAction(action, mode); + this.targetting.setAction(ship, action, mode); return this.targetting; } // Exit targetting mode exitTargettingMode(): void { - this.targetting.setAction(null); + this.targetting.setAction(null, null); } /** diff --git a/src/ui/battle/LogProcessor.ts b/src/ui/battle/LogProcessor.ts index e510227..ccda5e5 100644 --- a/src/ui/battle/LogProcessor.ts +++ b/src/ui/battle/LogProcessor.ts @@ -44,8 +44,6 @@ module TK.SpaceTac.UI { this.register((diff) => this.checkProjectileFired(diff)); this.register((diff) => this.checkShipDeath(diff)); this.register((diff) => this.checkBattleEnded(diff)); - this.register((diff) => this.checkDroneDeployed(diff)); - this.register((diff) => this.checkDroneRecalled(diff)); } /** @@ -136,7 +134,7 @@ module TK.SpaceTac.UI { changed = true; } else if (!immediate && diff instanceof ShipActionEndedDiff) { let ship = this.view.battle.getShip(diff.ship_id); - if (ship && ship.getAction(diff.action) instanceof EndTurnAction) { + if (ship && ship.actions.getById(diff.action) instanceof EndTurnAction) { changed = true; } } @@ -260,9 +258,9 @@ module TK.SpaceTac.UI { if (diff instanceof ProjectileFiredDiff) { let ship = this.view.battle.getShip(diff.ship_id); if (ship) { - let equipment = ship.getEquipment(diff.equipment); - if (equipment && equipment.slot_type == SlotType.Weapon) { - let effect = new WeaponEffect(this.view.arena, ship, diff.target, equipment); + let action = ship.actions.getById(diff.action); + if (action && action instanceof TriggerAction) { + let effect = new WeaponEffect(this.view.arena, ship, diff.target, action); return { foreground: async (animate, timer) => { if (animate) { @@ -316,62 +314,6 @@ module TK.SpaceTac.UI { return {}; } - - /** - * Check if a new drone as been deployed - */ - private checkDroneDeployed(diff: BaseBattleDiff): LogProcessorDelegate { - if (diff instanceof DroneDeployedDiff) { - return { - foreground: async (animate) => { - let duration = this.view.arena.addDrone(diff.drone, animate); - if (duration) { - this.view.gameui.audio.playOnce("battle-drone-deploy"); - if (animate) { - await this.view.timer.sleep(duration); - } - } - } - } - } else { - return {}; - } - } - - /** - * Check if a drone as been recalled - */ - private checkDroneRecalled(diff: BaseBattleDiff): LogProcessorDelegate { - if (diff instanceof DroneRecalledDiff) { - return { - foreground: async () => { - let duration = this.view.arena.removeDrone(diff.drone); - if (duration) { - this.view.gameui.audio.playOnce("battle-drone-destroy"); - await this.view.timer.sleep(duration); - } - } - } - } else { - return {}; - } - } - - // Drone applied - /*private processDroneAppliedEvent(event: DroneAppliedDiff): number { - let drone = this.view.arena.findDrone(event.drone); - if (drone) { - let duration = drone.setApplied(); - - if (duration) { - this.view.gameui.audio.playOnce("battle-drone-activate"); - } - - return duration; - } else { - return 0; - } - }*/ } /** diff --git a/src/ui/battle/OutcomeDialog.ts b/src/ui/battle/OutcomeDialog.ts index e4b472d..41fc694 100644 --- a/src/ui/battle/OutcomeDialog.ts +++ b/src/ui/battle/OutcomeDialog.ts @@ -54,25 +54,9 @@ module TK.SpaceTac.UI { parent.exitBattle(); }); } else if (victory) { - if (this.outcome.loot.length) { - this.addActionButton(535, "Loot equipment", "Open character sheet to loot equipment from defeated fleet", () => { - let sheet = new CharacterSheet(this.view, undefined, undefined, () => { - sheet.destroy(true); - this.refreshContent(); - }); - sheet.show(this.player.fleet.ships[0], false, undefined, true); - sheet.setLoot(outcome.loot); - this.view.add.existing(sheet); - }); - - this.addActionButton(957, "Back to map", "Exit the battle and go back to the map", () => { - parent.exitBattle(); - }); - } else { - this.addActionButton(747, "Back to map", "Exit the battle and go back to the map", () => { - parent.exitBattle(); - }); - } + this.addActionButton(747, "Back to map", "Exit the battle and go back to the map", () => { + parent.exitBattle(); + }); } else { this.addActionButton(535, "Revert battle", "Go back to where the fleet was before the battle happened", () => { parent.revertBattle(); diff --git a/src/ui/battle/ShipList.spec.ts b/src/ui/battle/ShipList.spec.ts index 86a5342..5f37d9b 100644 --- a/src/ui/battle/ShipList.spec.ts +++ b/src/ui/battle/ShipList.spec.ts @@ -27,7 +27,7 @@ module TK.SpaceTac.UI.Specs { }); let ship = battle.fleets[0].addShip(); - TestTools.setShipHP(ship, 10, 0); + TestTools.setShipModel(ship, 10, 0); list.setShipsFromBattle(battle, false); check.in("one ship added but not in play order", check => { check.equals(list.items.length, 1, "item count"); @@ -41,7 +41,7 @@ module TK.SpaceTac.UI.Specs { }); ship = battle.fleets[1].addShip(); - TestTools.setShipHP(ship, 10, 0); + TestTools.setShipModel(ship, 10, 0); battle.throwInitiative(); list.setShipsFromBattle(battle, false); check.in("ship added in the other fleet", check => { @@ -65,7 +65,7 @@ module TK.SpaceTac.UI.Specs { }); ship = battle.fleets[1].addShip(); - TestTools.setShipHP(ship, 10, 0); + TestTools.setShipModel(ship, 10, 0); battle.throwInitiative(); battle.setPlayingShip(battle.play_order[0]); list.setShipsFromBattle(battle, false); diff --git a/src/ui/battle/ShipTooltip.spec.ts b/src/ui/battle/ShipTooltip.spec.ts index 0a7d91b..5cb3206 100644 --- a/src/ui/battle/ShipTooltip.spec.ts +++ b/src/ui/battle/ShipTooltip.spec.ts @@ -5,11 +5,10 @@ module TK.SpaceTac.UI.Specs { test.case("fills ship details", check => { let tooltip = new ShipTooltip(testgame.view); let ship = testgame.view.battle.play_order[2]; + TestTools.setShipModel(ship, 58, 140, 12); ship.name = "Fury"; - ship.model = new ShipModel("fake", "Fury"); - ship.listEquipment().forEach(equ => equ.detach()); - TestTools.setShipHP(ship, 58, 140); - TestTools.setShipAP(ship, 12); + ship.model = new BaseModel("fake", "Fury"); + check.patch(ship.model, "getDescription", () => "Super ship model !"); TestTools.addWeapon(ship, 50); TestTools.setAttribute(ship, "precision", 7); TestTools.setAttribute(ship, "maneuvrability", 3); @@ -24,12 +23,12 @@ module TK.SpaceTac.UI.Specs { let images = collectImages((tooltip).container); let texts = collectTexts((tooltip).container); check.contains(images, "ship-fake-portrait"); - check.contains(images, "equipment-equipment"); + check.contains(images, "action-weapon"); check.equals(texts, [ "Level 1 Fury", "Plays in 2 turns", "7", "3", "9", "max", "12", "57", "max", "58", "100", "max", "140", - "Active effects", "• hull capacity +50", "• damage -15% for 3 turns", "• limit precision to 10", - "Weapons", "equipment Mk1" + "Weapon", "• hull capacity +50", "• damage -15% for 3 turns", "• limit precision to 10", + "Super ship model !" ]); }); }); diff --git a/src/ui/battle/ShipTooltip.ts b/src/ui/battle/ShipTooltip.ts index c5f4e23..f0d9782 100644 --- a/src/ui/battle/ShipTooltip.ts +++ b/src/ui/battle/ShipTooltip.ts @@ -23,10 +23,9 @@ module TK.SpaceTac.UI { builder.configure(10, 6, this.battleview.arena.getBoundaries()); - let portrait_bg = builder.image("battle-tooltip-ship-portrait", -18, -18); + let portrait_bg = builder.image("battle-tooltip-ship-portrait", 0, 0); builder.in(portrait_bg, builder => { - let portrait = builder.image(`ship-${ship.model.code}-portrait`, portrait_bg.width / 2, portrait_bg.height / 2); - portrait.anchor.set(0.5); + let portrait = builder.image(`ship-${ship.model.code}-portrait`, 1, 1); portrait.scale.set(0.75); }); @@ -37,36 +36,32 @@ module TK.SpaceTac.UI { let turns = this.battleview.battle.getPlayOrder(ship); builder.text((turns == 0) ? "Playing" : ((turns == 1) ? "Plays next" : `Plays in ${turns} turns`), 230, 36, { color: "#cccccc", size: 18 }); - ShipTooltip.addValue(builder, 0, "#aa6f33", "character-attribute-precision", ship.getAttribute("precision")); - ShipTooltip.addValue(builder, 1, "#c1f06b", "character-attribute-maneuvrability", ship.getAttribute("maneuvrability")); - ShipTooltip.addValue(builder, 2, "#ffdd4b", "character-value-power", ship.getValue("power"), ship.getAttribute("power_capacity")); - ShipTooltip.addValue(builder, 3, "#eb4e4a", "character-value-hull", ship.getValue("hull"), ship.getAttribute("hull_capacity")); - ShipTooltip.addValue(builder, 4, "#2ad8dc", "character-value-shield", ship.getValue("shield"), ship.getAttribute("shield_capacity")); + ShipTooltip.addValue(builder, 0, "#aa6f33", "attribute-precision", ship.getAttribute("precision")); + ShipTooltip.addValue(builder, 1, "#c1f06b", "attribute-maneuvrability", ship.getAttribute("maneuvrability")); + ShipTooltip.addValue(builder, 2, "#ffdd4b", "attribute-power_capacity", ship.getValue("power"), ship.getAttribute("power_capacity")); + ShipTooltip.addValue(builder, 3, "#eb4e4a", "attribute-hull_capacity", ship.getValue("hull"), ship.getAttribute("hull_capacity")); + ShipTooltip.addValue(builder, 4, "#2ad8dc", "attribute-shield_capacity", ship.getValue("shield"), ship.getAttribute("shield_capacity")); let iy = 210; - let effects = ship.active_effects.list(); - if (effects.length > 0) { - builder.text("Active effects", 0, iy, { color: "#ffffff", size: 18, bold: true }); - iy += 30; - effects.forEach(effect => { - builder.text(`• ${effect.getDescription()}`, 0, iy, { color: effect.isBeneficial() ? "#afe9c6" : "#e9afaf" }); - iy += 26; - }); - } - let weapons = ship.listEquipment(SlotType.Weapon); - if (weapons.length > 0) { - builder.text("Weapons", 0, iy, { size: 18, bold: true }); - iy += 30; - weapons.forEach(weapon => { - let icon = builder.image(`equipment-${weapon.code}`, 0, iy); - icon.scale.set(0.1); - builder.text(weapon.getFullName(), 32, iy); - iy += 26; - }); - } + ship.actions.listAll().forEach(action => { + if (!(action instanceof EndTurnAction) && !(action instanceof MoveAction)) { + let icon = builder.image(`action-${action.code}`, 0, iy); + icon.scale.set(0.15); + builder.text(action.name, 46, iy + 8); + iy += 40; + } + }); + + ship.active_effects.list().forEach(effect => { + builder.text(`• ${effect.getDescription()}`, 0, iy, { color: effect.isBeneficial() ? "#afe9c6" : "#e9afaf" }); + iy += 32; + }); + + builder.text(ship.model.getDescription(), 0, iy + 4, { size: 14, color: "#999999", width: 540 }); } else { - builder.text("Emergency Stasis Protocol\nship disabled", 140, 36, { color: "#a899db", size: 20, center: true, vcenter: true }); + builder.text("Emergency Stasis Protocol\nship disabled", 140, 36, + { color: "#a899db", size: 20, center: true, vcenter: true }); } let sprite = this.battleview.arena.findShipSprite(ship); diff --git a/src/ui/battle/Targetting.spec.ts b/src/ui/battle/Targetting.spec.ts index 5bce90b..cc4af9e 100644 --- a/src/ui/battle/Targetting.spec.ts +++ b/src/ui/battle/Targetting.spec.ts @@ -16,12 +16,12 @@ module TK.SpaceTac.UI.Specs { ship.setArenaPosition(10, 20); let weapon = TestTools.addWeapon(ship); let engine = TestTools.addEngine(ship, 12); - targetting.setAction(weapon.action); + targetting.setAction(ship, weapon); let drawvector = check.patch(targetting, "drawVector", null); let part = { - action: nn(weapon.action), + action: weapon, target: new Target(50, 30), ap: 5, possible: true @@ -36,8 +36,8 @@ module TK.SpaceTac.UI.Specs { [0x8e8e8e, 10, 20, 50, 30, 0] ]); - targetting.action = engine.action; - part.action = nn(engine.action); + targetting.action = engine; + part.action = engine; targetting.drawPart(part, true, null); check.called(drawvector, [ [0xe09c47, 10, 20, 50, 30, 12] @@ -48,7 +48,7 @@ module TK.SpaceTac.UI.Specs { let targetting = newTargetting(); let ship = nn(testgame.view.battle.playing_ship); let impacts = targetting.impact_indicators; - let action = new TriggerAction(new Equipment(), [], 1, 0, 50); + let action = new TriggerAction("weapon", { range: 50 }); let collect = check.patch(action, "getImpactedShips", iterator([ [new Ship(), new Ship(), new Ship()], @@ -85,7 +85,7 @@ module TK.SpaceTac.UI.Specs { let engine = TestTools.addEngine(ship, 8000); let weapon = TestTools.addWeapon(ship, 30, 5, 100, 50); - targetting.setAction(weapon.action); + targetting.setAction(ship, weapon); targetting.setTarget(Target.newFromLocation(156, 65)); check.patch(targetting, "simulate", () => { @@ -99,8 +99,8 @@ module TK.SpaceTac.UI.Specs { result.need_fire = true; result.can_fire = true; result.parts = [ - { action: nn(engine.action), target: Target.newFromLocation(80, 20), ap: 1, possible: true }, - { action: nn(weapon.action), target: Target.newFromLocation(156, 65), ap: 5, possible: true } + { action: engine, target: Target.newFromLocation(80, 20), ap: 1, possible: true }, + { action: weapon, target: Target.newFromLocation(156, 65), ap: 5, possible: true } ] targetting.simulation = result; }); @@ -121,30 +121,30 @@ module TK.SpaceTac.UI.Specs { test.case("snaps on ships according to targetting mode", check => { let targetting = newTargetting(); let playing_ship = nn(testgame.view.battle.playing_ship); - let action = TestTools.addWeapon(playing_ship).action; + let action = TestTools.addWeapon(playing_ship); let ship1 = testgame.view.battle.play_order[1]; let ship2 = testgame.view.battle.play_order[2]; ship1.setArenaPosition(8000, 50); ship2.setArenaPosition(8000, 230); - targetting.setAction(action, ActionTargettingMode.SPACE); + targetting.setAction(playing_ship, action, ActionTargettingMode.SPACE); targetting.setTargetFromLocation({ x: 8000, y: 60 }); check.equals(targetting.target, Target.newFromLocation(8000, 60), "space"); - targetting.setAction(action, ActionTargettingMode.SHIP); + targetting.setAction(playing_ship, action, ActionTargettingMode.SHIP); targetting.setTargetFromLocation({ x: 8000, y: 60 }); check.equals(targetting.target, Target.newFromShip(ship1), "ship 1"); targetting.setTargetFromLocation({ x: 8100, y: 200 }); check.equals(targetting.target, Target.newFromShip(ship2), "ship 2"); - targetting.setAction(action, ActionTargettingMode.SURROUNDINGS); + targetting.setAction(playing_ship, action, ActionTargettingMode.SURROUNDINGS); targetting.setTargetFromLocation({ x: 8000, y: 60 }); check.equals(targetting.target, new Target(8000, 60, playing_ship), "surroundings 1"); targetting.setTargetFromLocation({ x: playing_ship.arena_x + 10, y: playing_ship.arena_y - 20 }); check.equals(targetting.target, Target.newFromShip(playing_ship), "surroundings 2"); - targetting.setAction(action, ActionTargettingMode.SELF); + targetting.setAction(playing_ship, action, ActionTargettingMode.SELF); targetting.setTargetFromLocation({ x: 8000, y: 60 }); check.equals(targetting.target, Target.newFromShip(playing_ship), "self 1"); targetting.setTargetFromLocation({ x: 0, y: 0 }); @@ -155,26 +155,25 @@ module TK.SpaceTac.UI.Specs { let targetting = newTargetting(); let ship = nn(testgame.view.battle.playing_ship); ship.setArenaPosition(0, 0); - ship.listEquipment(SlotType.Engine).forEach(engine => engine.detach()); - TestTools.setShipAP(ship, 8); - let move = TestTools.addEngine(ship, 100).action; - let fire = TestTools.addWeapon(ship, 50, 2, 300, 100).action; + TestTools.setShipModel(ship, 100, 0, 8); + let move = TestTools.addEngine(ship, 100); + let fire = TestTools.addWeapon(ship, 50, 2, 300, 100); let last_call: any = null; check.patch(targetting.range_hint, "clear", () => last_call = null); check.patch(targetting.range_hint, "update", (ship: Ship, action: BaseAction, radius: number) => last_call = [ship, action, radius]); // move action - targetting.setAction(move); + targetting.setAction(ship, move); targetting.setTargetFromLocation({ x: 200, y: 0 }); check.equals(last_call, [ship, move, 800]); // fire action - targetting.setAction(fire); + targetting.setAction(ship, fire); targetting.setTargetFromLocation({ x: 200, y: 0 }); check.equals(last_call, [ship, fire, undefined]); // move+fire - targetting.setAction(fire); + targetting.setAction(ship, fire); targetting.setTargetFromLocation({ x: 400, y: 0 }); check.equals(last_call, [ship, move, 600]); }); diff --git a/src/ui/battle/Targetting.ts b/src/ui/battle/Targetting.ts index 4a7bc02..124a267 100644 --- a/src/ui/battle/Targetting.ts +++ b/src/ui/battle/Targetting.ts @@ -258,8 +258,8 @@ module TK.SpaceTac.UI { } } else { let engine = new MoveFireSimulator(this.ship).findBestEngine(); - if (engine && engine.action) { - move_action = engine.action; + if (engine) { + move_action = engine; } } if (move_action) { @@ -295,9 +295,9 @@ module TK.SpaceTac.UI { /** * Set the current targetting action, or null to stop targetting */ - setAction(action: BaseAction | null, mode?: ActionTargettingMode): void { - if (action && action.equipment && action.equipment.attached_to && action.equipment.attached_to.ship) { - this.ship = action.equipment.attached_to.ship; + setAction(ship: Ship | null, action: BaseAction | null, mode?: ActionTargettingMode): void { + if (action && ship && ship.actions.getById(action.id)) { + this.ship = ship; this.action = action; this.mode = (typeof mode == "undefined") ? action.getTargettingMode(this.ship) : mode; diff --git a/src/ui/battle/WeaponEffect.spec.ts b/src/ui/battle/WeaponEffect.spec.ts index 9168a92..21994b0 100644 --- a/src/ui/battle/WeaponEffect.spec.ts +++ b/src/ui/battle/WeaponEffect.spec.ts @@ -17,7 +17,7 @@ module TK.SpaceTac.UI.Specs { let battleview = testgame.view; battleview.timer = new Timer(); - let effect = new WeaponEffect(battleview.arena, new Ship(), new Target(0, 0), new Equipment()); + let effect = new WeaponEffect(battleview.arena, new Ship(), new Target(0, 0), new TriggerAction("weapon")); effect.shieldImpactEffect({ x: 10, y: 10 }, { x: 20, y: 15 }, 1000, 3000, true); let layer = battleview.arena.layer_weapon_effects; @@ -35,7 +35,7 @@ module TK.SpaceTac.UI.Specs { battleview.timer = new Timer(); let ship = nn(battleview.battle.playing_ship); - let effect = new WeaponEffect(battleview.arena, new Ship(), Target.newFromShip(ship), new Equipment()); + let effect = new WeaponEffect(battleview.arena, new Ship(), Target.newFromShip(ship), new TriggerAction("weapon")); effect.gunEffect(); let layer = battleview.arena.layer_weapon_effects; @@ -50,9 +50,8 @@ module TK.SpaceTac.UI.Specs { let ship = nn(battleview.battle.playing_ship); ship.setArenaPosition(50, 30); - let weapon = new Equipment(); - weapon.action = new TriggerAction(weapon, [new DamageEffect()], 1, 500); - check.patch(weapon.action, "getImpactedShips", () => [ship]); + let weapon = new TriggerAction("weapon", { effects: [new DamageEffect()], range: 500 }); + check.patch(weapon, "getImpactedShips", () => [ship]); let dest = new Ship(); let effect = new WeaponEffect(battleview.arena, dest, Target.newFromShip(dest), weapon); @@ -80,7 +79,7 @@ module TK.SpaceTac.UI.Specs { let battleview = testgame.view; battleview.timer = new Timer(); - let effect = new WeaponEffect(battleview.arena, new Ship(), Target.newFromLocation(50, 50), new Equipment()); + let effect = new WeaponEffect(battleview.arena, new Ship(), Target.newFromLocation(50, 50), new TriggerAction("weapon")); effect.gunEffect(); checkEmitters("gun effect started", 1); @@ -97,7 +96,7 @@ module TK.SpaceTac.UI.Specs { let battleview = testgame.view; battleview.timer = new Timer(); - let effect = new WeaponEffect(battleview.arena, new Ship(), Target.newFromLocation(31, 49), new Equipment()); + let effect = new WeaponEffect(battleview.arena, new Ship(), Target.newFromLocation(31, 49), new TriggerAction("weapon")); let result = effect.angularLaser({ x: 20, y: 30 }, 300, Math.PI / 4, -Math.PI / 2, 5); check.equals(result, 200); diff --git a/src/ui/battle/WeaponEffect.ts b/src/ui/battle/WeaponEffect.ts index bf868df..29ed604 100644 --- a/src/ui/battle/WeaponEffect.ts +++ b/src/ui/battle/WeaponEffect.ts @@ -33,9 +33,9 @@ module TK.SpaceTac.UI { private destination: IArenaLocation // Weapon used - private weapon: Equipment + private action: TriggerAction - constructor(arena: Arena, ship: Ship, target: Target, weapon: Equipment) { + constructor(arena: Arena, ship: Ship, target: Target, action: TriggerAction) { this.ui = arena.game; this.arena = arena; this.view = arena.view; @@ -43,7 +43,7 @@ module TK.SpaceTac.UI { this.layer = arena.layer_weapon_effects; this.ship = ship; this.target = target; - this.weapon = weapon; + this.action = action; this.source = Target.newFromShip(this.ship); this.destination = this.target; @@ -56,15 +56,15 @@ module TK.SpaceTac.UI { */ start(): number { // Fire effect - let effect = this.getEffectForWeapon(this.weapon.code, this.weapon.action); + let effect = this.getEffectForWeapon(this.action.code, this.action); let duration = effect(); // Damage effect - let action = this.weapon.action; - if (action instanceof TriggerAction && any(action.effects, effect => effect instanceof DamageEffect)) { + let action = this.action; + if (any(action.effects, effect => effect instanceof DamageEffect)) { let ships = action.getImpactedShips(this.ship, this.target, this.source); let source = action.blast ? this.target : this.source; - let damage_duration = this.damageEffect(source, ships, duration * 0.4, this.weapon.code == "gatlinggun"); + let damage_duration = this.damageEffect(source, ships, duration * 0.4, this.action.code == "gatlinggun"); duration = Math.max(duration, damage_duration); } @@ -177,7 +177,7 @@ module TK.SpaceTac.UI { missile.rotation = arenaAngle(this.source, this.destination); this.layer.add(missile); - let blast_radius = (this.weapon.action instanceof TriggerAction) ? this.weapon.action.blast : 0; + let blast_radius = this.action.blast; let projectile_duration = arenaDistance(this.source, this.destination) * 1.5; let tween = this.ui.tweens.create(missile); diff --git a/src/ui/character/CharacterCargo.spec.ts b/src/ui/character/CharacterCargo.spec.ts deleted file mode 100644 index 5eb6841..0000000 --- a/src/ui/character/CharacterCargo.spec.ts +++ /dev/null @@ -1,29 +0,0 @@ -module TK.SpaceTac.UI.Specs { - testing("CharacterCargo", test => { - let testgame = setupEmptyView(test); - - test.case("checks conditions for adding/removing equipment", check => { - let view = testgame.view; - let sheet = new CharacterSheet(view); - let ship = new Ship(); - sheet.show(ship); - - let source = new CharacterCargo(sheet, 0, 0); - let equipment = new CharacterEquipment(sheet, new Equipment(), source); - - let destination = new CharacterCargo(sheet, 0, 0); - check.equals(destination.addEquipment(equipment, null, true), { success: false, info: 'put in cargo', error: 'not enough cargo space' }); - ship.setCargoSpace(1); - check.equals(destination.addEquipment(equipment, null, true), { success: true, info: 'put in cargo' }); - ship.critical = true; - check.equals(destination.addEquipment(equipment, null, true), { success: false, info: 'put in cargo', error: 'not a fleet member' }); - ship.critical = false; - - check.equals(source.removeEquipment(equipment, null, true), { success: false, info: 'remove from cargo', error: 'not in cargo!' }); - ship.addCargo(equipment.item); - check.equals(source.removeEquipment(equipment, null, true), { success: true, info: 'remove from cargo' }); - ship.critical = true; - check.equals(source.removeEquipment(equipment, null, true), { success: false, info: 'remove from cargo', error: 'not a fleet member' }); - }); - }); -} diff --git a/src/ui/character/CharacterCargo.ts b/src/ui/character/CharacterCargo.ts deleted file mode 100644 index 6b86481..0000000 --- a/src/ui/character/CharacterCargo.ts +++ /dev/null @@ -1,69 +0,0 @@ -/// - -module TK.SpaceTac.UI { - /** - * Display a ship cargo slot - */ - export class CharacterCargo extends Phaser.Image implements CharacterEquipmentContainer { - sheet: CharacterSheet; - - constructor(sheet: CharacterSheet, x: number, y: number) { - let info = sheet.view.getImageInfo("character-cargo-slot"); - super(sheet.game, x, y, info.key, info.frame); - - this.sheet = sheet; - } - - jasmineToString() { - return "CharacterCargo"; - } - - /** - * CharacterEquipmentContainer interface - */ - isInside(x: number, y: number): boolean { - return this.getBounds().contains(x, y); - } - getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number } { - return { - x: this.x + (this.parent ? this.parent.x : 0) + 98 * this.scale.x, - y: this.y + (this.parent ? this.parent.y : 0) + 98 * this.scale.y, - scale: this.scale.x * 1.25, - alpha: this.alpha, - } - } - getPriceOffset(): number { - return 66; - } - addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - let info = "put in cargo"; - if (this.sheet.ship.critical) { - return { success: false, info: info, error: "not a fleet member" }; - } if (this.sheet.ship.getFreeCargoSpace() > 0) { - if (test) { - return { success: true, info: info }; - } else { - let success = this.sheet.ship.addCargo(equipment.item); - return { success: success, info: info }; - } - } else { - return { success: false, info: info, error: "not enough cargo space" }; - } - } - removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - let info = "remove from cargo"; - if (this.sheet.ship.critical) { - return { success: false, info: info, error: "not a fleet member" }; - } else if (contains(this.sheet.ship.cargo, equipment.item)) { - if (test) { - return { success: true, info: info }; - } else { - let success = this.sheet.ship.removeCargo(equipment.item); - return { success: success, info: info }; - } - } else { - return { success: false, info: info, error: "not in cargo!" }; - } - } - } -} diff --git a/src/ui/character/CharacterEquipment.spec.ts b/src/ui/character/CharacterEquipment.spec.ts deleted file mode 100644 index 2a17b7d..0000000 --- a/src/ui/character/CharacterEquipment.spec.ts +++ /dev/null @@ -1,159 +0,0 @@ -module TK.SpaceTac.UI.Specs { - testing("CharacterEquipment", test => { - let testgame = setupEmptyView(test); - - class FakeContainer implements CharacterEquipmentContainer { - name: string; - x: number; - inside: CharacterEquipment | null; - constructor(name: string, x: number) { - this.name = name; - this.x = x; - this.inside = null; - } - jasmineToString() { - return this.name; - } - isInside(x: number, y: number): boolean { - return x == this.x; - } - getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number } { - return { x: this.x, y: 0, scale: 0.5, alpha: 1 }; - } - getPriceOffset(): number { - return 12; - } - addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - if (this.x < 150) { - if (!test) { - this.inside = equipment; - } - return { success: true, info: "" }; - } else { - return { success: false, info: "" }; - } - } - removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - if (this.inside === equipment) { - if (!test) { - this.inside = null; - } - return { success: true, info: "" }; - } else { - return { success: false, info: "" }; - } - } - } - - function createBasicCase(positions: number[]): [CharacterSheet, CharacterEquipment, FakeContainer[], Mock] { - let view = testgame.view; - let sheet = new CharacterSheet(view); - sheet.show(new Ship()); - let refresh = test.check.patch(sheet, "refresh", null); - - let containers = positions.map((x, idx) => new FakeContainer(`container${idx + 1}`, x)); - let equipment = new CharacterEquipment(sheet, new Equipment(), containers[0]); - containers[0].inside = equipment; - equipment.setupDragDrop(); - test.check.patch(sheet, "iEquipmentContainers", () => iarray(containers)); - - return [sheet, equipment, containers, refresh]; - } - - test.case("handles drag-and-drop to move equipment", check => { - let [sheet, equipment, [container1, container2, container3], refresh] = createBasicCase([0, 100, 200]); - - check.same(equipment.inputEnabled, true, "Input should be enabled"); - check.same(equipment.input.draggable, true, "Equipment should be draggable"); - check.same(equipment.container, container1); - check.equals(equipment.x, 0); - check.equals(equipment.scale.x, 0.25); - - // drop on nothing - check.equals(equipment.alpha, 1); - equipment.events.onDragStart.dispatch(); - check.equals(equipment.alpha, 0.8); - equipment.x = 812; - equipment.events.onDragStop.dispatch(); - check.same(equipment.container, container1); - check.equals(equipment.x, 0); - check.called(refresh, 0); - - // drop on accepting destination - equipment.events.onDragStart.dispatch(); - equipment.x = 100; - equipment.events.onDragStop.dispatch(); - check.same(equipment.container, container2); - check.equals(equipment.x, 100); - check.equals(container1.inside, null); - check.same(container2.inside, equipment); - check.called(refresh, 1); - - // drop on refusing destination - equipment.events.onDragStart.dispatch(); - equipment.x = 200; - equipment.events.onDragStop.dispatch(); - check.same(equipment.container, container2); - check.equals(equipment.x, 100); - check.same(container2.inside, equipment); - check.equals(container3.inside, null); - check.called(refresh, 0); - - // broken destination, should return to source - let log = check.patch(console, "error", null); - check.patch(container3, "addEquipment", (equ: any, src: any, test: boolean) => { return { success: test } }); - equipment.events.onDragStart.dispatch(); - equipment.x = 200; - equipment.events.onDragStop.dispatch(); - check.same(equipment.container, container2); - check.equals(equipment.x, 100); - check.called(refresh, 0); - check.called(log, [ - ['Destination container refused to accept equipment', equipment, container2, container3] - ]); - - // broken destination and source, item is lost ! - check.patch(container2, "addEquipment", (equ: any, src: any, test: boolean) => { return { success: test } }); - equipment.events.onDragStart.dispatch(); - equipment.x = 200; - equipment.events.onDragStop.dispatch(); - check.same(equipment.container, container3); - check.equals(equipment.x, 200); - check.called(refresh, 1); - check.called(log, [ - ['Destination container refused to accept equipment', equipment, container2, container3], - ['Equipment lost in bad exchange!', equipment, container2, container3] - ]); - }); - - test.case("defines the sheet's action message", check => { - let [sheet, equipment, [container1, container2], refresh] = createBasicCase([0, 1]); - - check.patch(container1, "removeEquipment", iterator([ - { success: true, info: "detach" }, - { success: false, info: "detach", error: "cannot detach" }, - { success: true, info: "detach" }, - { success: false, info: "detach", error: "cannot detach" } - ])) - check.patch(container2, "addEquipment", iterator([ - { success: true, info: "attach" }, - { success: true, info: "attach" }, - { success: false, info: "attach", error: "cannot attach" }, - { success: false, info: "attach", error: "cannot attach" } - ])) - - check.equals(sheet.action_message.text, ""); - equipment.events.onDragStart.dispatch(); - check.equals(sheet.action_message.text, ""); - equipment.x = 1; - equipment.events.onDragUpdate.dispatch(); - check.equals(sheet.action_message.text, "Detach, attach"); - equipment.events.onDragUpdate.dispatch(); - check.equals(sheet.action_message.text, "Detach, attach (cannot detach)"); - equipment.events.onDragUpdate.dispatch(); - check.equals(sheet.action_message.text, "Detach, attach (cannot attach)"); - equipment.events.onDragUpdate.dispatch(); - check.equals(sheet.action_message.text, "Detach, attach (cannot detach)"); - }); - }); -} diff --git a/src/ui/character/CharacterEquipment.ts b/src/ui/character/CharacterEquipment.ts deleted file mode 100644 index b66ce31..0000000 --- a/src/ui/character/CharacterEquipment.ts +++ /dev/null @@ -1,213 +0,0 @@ -module TK.SpaceTac.UI { - /** - * Interface for any graphical area that may contain or receive an equipment - */ - export interface CharacterEquipmentContainer { - /** - * Check if a point in the character sheet is inside the container - */ - isInside(x: number, y: number): boolean - /** - * Get a centric anchor point and scaling to snap the equipment - */ - getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number } - /** - * Get a vertical offset to position the price tag - */ - getPriceOffset(): number - /** - * Add an equipment to the container - */ - addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer - /** - * Remove an equipment from the container - */ - removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer - } - - /** - * Result of an equipment transfer operation - */ - export type CharacterEquipmentTransfer = { - success: boolean, - info: string, - error?: string - } - - function mergeTransfer(leave: CharacterEquipmentTransfer, enter: CharacterEquipmentTransfer): CharacterEquipmentTransfer { - return { - success: leave.success && enter.success, - info: [leave.info, enter.info].join(', '), - error: leave.error || enter.error - } - } - - /** - * Display a ship equipment, either attached to a slot, in cargo, or being dragged down - */ - export class CharacterEquipment extends Phaser.Button { - sheet: CharacterSheet - item: Equipment - container: CharacterEquipmentContainer - price: number - - constructor(sheet: CharacterSheet, equipment: Equipment, container: CharacterEquipmentContainer) { - let icon = sheet.view.getImageInfo(`equipment-${equipment.code}`); - super(sheet.game, 0, 0, icon.key, undefined, undefined, icon.frame, icon.frame); - - this.sheet = sheet; - this.item = equipment; - this.container = container; - this.price = 0; - - this.anchor.set(0.5, 0.5); - - if (sheet.isInteractive()) { - this.setupDragDrop(); - } - this.snapToContainer(); - - sheet.view.tooltip.bind(this, filler => this.fillTooltip(filler)); - } - - jasmineToString() { - return this.item.jasmineToString(); - } - - /** - * Find the container under a specific screen location - */ - findContainerAt(x: number, y: number): CharacterEquipmentContainer | null { - return ifirst(this.sheet.iEquipmentContainers(), container => container.isInside(x, y)); - } - - /** - * Display a price tag - */ - setPrice(price: number) { - if (!price || this.price) { - return; - } - this.price = price; - - let tag = this.sheet.view.newImage("character-price-tag"); - let yoffset = this.container.getPriceOffset(); - tag.position.set(0, -yoffset * 2 + tag.height); - tag.anchor.set(0.5, 0.5); - tag.scale.set(2, 2); - tag.alpha = 0.85; - this.addChild(tag); - - let text = this.sheet.view.newText(price.toString(), -8, 2, 18, "#ffffcc"); - tag.addChild(text); - } - - /** - * Snap in place to its current container - */ - snapToContainer() { - let info = this.container.getEquipmentAnchor(); - this.position.set(info.x, info.y); - this.scale.set(0.5 * info.scale, 0.5 * info.scale); - this.alpha = info.alpha; - } - - /** - * Enable dragging to another slot - */ - setupDragDrop() { - if (this.container.removeEquipment(this, null, true)) { - this.sheet.view.inputs.setDragDrop(this, () => { - // Drag - this.scale.set(0.5, 0.5); - this.alpha = 0.8; - }, () => { - // Drop - this.sheet.setActionMessage(); - let destination = this.findContainerAt(this.x, this.y); - if (destination && destination != this.container) { - if (this.applyDragDrop(this.container, destination, false).success) { - this.container = destination; - this.snapToContainer(); - this.setupDragDrop(); - this.sheet.refresh(); // TODO Only if required (destination is "virtual") - } else { - this.snapToContainer(); - } - } else { - this.snapToContainer(); - } - }, () => { - // Update - let destination = this.findContainerAt(this.x, this.y); - if (destination && destination != this.container) { - let simulation = this.applyDragDrop(this.container, destination, true); - let message = capitalize(simulation.info); - if (simulation.error) { - message += ` (${simulation.error})`; - } - this.sheet.setActionMessage(message, simulation.success ? "#ffffff" : "#f04240"); - } else { - this.sheet.setActionMessage(); - } - }); - } else { - this.sheet.view.inputs.setDragDrop(this); - } - } - - /** - * Apply drag and drop between two containers - * - * Return true if something changed (or would change, if test=true). - */ - applyDragDrop(source: CharacterEquipmentContainer, destination: CharacterEquipmentContainer, test: boolean): CharacterEquipmentTransfer { - let transfer_test = mergeTransfer(source.removeEquipment(this, destination, true), destination.addEquipment(this, source, true)); - - if (test) { - return transfer_test; - } else if (transfer_test.success) { - let transfer_out = source.removeEquipment(this, destination, false); - if (transfer_out.success) { - let transfer_in = destination.addEquipment(this, source, false); - let transfer = mergeTransfer(transfer_out, transfer_in); - if (transfer_in.success) { - return transfer; - } else { - console.error("Destination container refused to accept equipment", this, source, destination); - // Go back to source - let transfer_back = source.addEquipment(this, null, false); - if (transfer_back.success) { - return transfer; - } else { - console.error("Equipment lost in bad exchange!", this, source, destination); - return { - success: true, - info: transfer.info, - error: "Equipment was critically damaged in transfer!" - }; - } - } - } else { - console.error("Source container refused to give away equipment", this, source, destination); - return transfer_out; - } - } else { - return transfer_test; - } - } - - /** - * Fill a tooltip with equipment data - */ - fillTooltip(filler: TooltipBuilder): boolean { - let title = this.item.getFullName(); - if (this.item.slot_type !== null) { - title += ` (${SlotType[this.item.slot_type]})`; - } - filler.text(title, 0, 0, { color: "#cccccc", size: 20, bold: true }); - filler.text(this.item.getFullDescription(), 0, 40, { color: "#cccccc", size: 18, width: 700 }); - return true; - } - } -} diff --git a/src/ui/character/CharacterFleetMember.spec.ts b/src/ui/character/CharacterFleetMember.spec.ts deleted file mode 100644 index 8e6b5fa..0000000 --- a/src/ui/character/CharacterFleetMember.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -module TK.SpaceTac.UI.Specs { - testing("CharacterFleetMember", test => { - let testgame = setupEmptyView(test); - - test.case("transfers equipment to another ship", check => { - let view = testgame.view; - let sheet = new CharacterSheet(view); - - let fleet = new Fleet(); - let ship1 = fleet.addShip(); - ship1.setCargoSpace(3); - let equ1 = new Equipment(SlotType.Engine, "engine1"); - ship1.addCargo(equ1); - let equ2 = new Equipment(SlotType.Engine, "engine2"); - ship1.addCargo(equ2); - let equ3 = new Equipment(SlotType.Engine, "engine3"); - ship1.addCargo(equ3); - let ship2 = fleet.addShip(); - let ship2engine = ship2.addSlot(SlotType.Engine); - ship2.setCargoSpace(1); - - sheet.show(ship1); - check.equals(sheet.portraits.length, 2); - check.equals(sheet.layer_equipments.length, 3); - check.equals(sheet.ship_cargo.length, 3); - - // First item fits in the free slot - let source = sheet.ship_cargo.children[0]; - let dest = sheet.portraits.children[1]; - let equ = sheet.layer_equipments.children[0]; - check.same(dest.ship, ship2); - check.same(equ.item, equ1); - check.contains(ship1.cargo, equ1); - check.equals(ship2engine.attached, null); - equ.applyDragDrop(source, dest, false); - check.notcontains(ship1.cargo, equ1); - check.same(ship2engine.attached, equ1); - - // Second item goes to cargo - source = sheet.ship_cargo.children[0]; - dest = sheet.portraits.children[1]; - equ = sheet.layer_equipments.children[1]; - check.same(dest.ship, ship2); - check.same(equ.item, equ2); - check.contains(ship1.cargo, equ2); - check.notcontains(ship2.cargo, equ2); - equ.applyDragDrop(source, dest, false); - check.notcontains(ship1.cargo, equ2); - check.contains(ship2.cargo, equ2); - - // Third item has no more room - source = sheet.ship_cargo.children[0]; - dest = sheet.portraits.children[1]; - equ = sheet.layer_equipments.children[2]; - check.same(dest.ship, ship2); - check.same(equ.item, equ3); - check.contains(ship1.cargo, equ3); - equ.applyDragDrop(source, dest, false); - check.contains(ship1.cargo, equ3); - - // Cannot transfer to escorted ship - ship2.setCargoSpace(2); - check.equals(equ.applyDragDrop(source, dest, true), { success: true, info: 'remove from cargo, transfer to Player 2', error: undefined }); - ship2.critical = true; - check.equals(equ.applyDragDrop(source, dest, true), { success: false, info: 'remove from cargo, transfer to Player 2', error: 'not a fleet member' }); - }); - }); -} diff --git a/src/ui/character/CharacterFleetMember.ts b/src/ui/character/CharacterFleetMember.ts deleted file mode 100644 index ee32497..0000000 --- a/src/ui/character/CharacterFleetMember.ts +++ /dev/null @@ -1,90 +0,0 @@ -/// - -module TK.SpaceTac.UI { - /** - * Display a fleet member in the side of character sheet - */ - export class CharacterFleetMember extends Phaser.Button implements CharacterEquipmentContainer { - sheet: CharacterSheet; - ship: Ship; - levelup: Phaser.Image; - - constructor(sheet: CharacterSheet, x: number, y: number, ship: Ship) { - let info = sheet.view.getImageInfo("character-ship"); - super(sheet.game, x, y, info.key, () => sheet.show(ship), null, info.frame, info.frame); - this.anchor.set(0.5, 0.5); - - this.sheet = sheet; - this.ship = ship; - - let portrait_pic = sheet.view.newImage(`ship-${ship.model.code}-portrait`); - portrait_pic.anchor.set(0.5, 0.5); - this.addChild(portrait_pic); - - this.levelup = sheet.view.newImage("character-upgrade-available", this.width / 2 - 40, -this.height / 2 + 40); - this.levelup.anchor.set(1, 0); - this.levelup.visible = this.ship.getAvailableUpgradePoints() > 0; - this.addChild(this.levelup); - - sheet.view.tooltip.bindDynamicText(this, () => ship.getName()); - } - - /** - * Set the selected state of the ship - */ - setSelected(selected: boolean) { - this.sheet.view.changeImage(this, selected ? "character-ship-selected" : "character-ship"); - this.sheet.view.animations.setVisible(this.levelup, this.ship.getAvailableUpgradePoints() > 0, 200); - } - - /** - * CharacterEquipmentContainer interface - */ - isInside(x: number, y: number): boolean { - return this.getBounds().contains(x, y) && this.ship !== this.sheet.ship; - } - getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number } { - // not needed, equipment is never shown snapped in the slot - return { x: 0, y: 0, scale: 1, alpha: 1 }; - } - getPriceOffset(): number { - return 0; - } - addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - let info = `transfer to ${this.ship.name}`; - if (this.ship.critical) { - return { success: false, info: info, error: "not a fleet member" }; - } else if (this.ship != this.sheet.ship && equipment.item.slot_type !== null) { - // First, try to equip - let slot = this.ship.getFreeSlot(equipment.item.slot_type); - if (slot && equipment.item.canBeEquipped(this.ship.attributes, false)) { - info = `equip on ${this.ship.name}`; - if (test) { - return { success: true, info: info }; - } else { - let success = this.ship.equip(equipment.item, false); - return { success: true, info: info }; - } - } - - // If cannot be equipped, go to cargo - if (this.ship.getFreeCargoSpace() > 0) { - if (test) { - return { success: true, info: info }; - } else { - let success = this.ship.addCargo(equipment.item); - return { success: success, info: info }; - } - } else { - return { success: false, info: info, error: "not enough cargo space" }; - } - } else { - return { success: false, info: info, error: "drop on cargo or slots" }; - } - } - removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - // should never happen - return { success: false, info: "" }; - } - } -} diff --git a/src/ui/character/CharacterLootSlot.spec.ts b/src/ui/character/CharacterLootSlot.spec.ts deleted file mode 100644 index 1d26dd5..0000000 --- a/src/ui/character/CharacterLootSlot.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -module TK.SpaceTac.UI.Specs { - testing("CharacterLootSlot", test => { - let testgame = setupEmptyView(test); - - test.case("takes or discard loot", check => { - let view = testgame.view; - let sheet = new CharacterSheet(view); - - let fleet = new Fleet(); - let ship = fleet.addShip(); - ship.setCargoSpace(2); - let equ1 = new Equipment(SlotType.Shield, "equ1"); - ship.addCargo(equ1) - - let equ2 = new Equipment(SlotType.Weapon, "equ2"); - let loot = [equ2]; - sheet.setLoot(loot); - sheet.show(ship); - - check.equals(ship.cargo, [equ1]); - check.equals(loot, [equ2]); - - let cargo_slot = sheet.ship_cargo.children[0]; - check.equals(cargo_slot instanceof CharacterCargo, true); - let loot_slot = sheet.loot_slots.children[0]; - check.equals(loot_slot instanceof CharacterLootSlot, true); - - // loot to cargo - let equ2s = sheet.layer_equipments.children[1]; - check.same(equ2s.item, equ2); - equ2s.applyDragDrop(loot_slot, cargo_slot, false); - check.equals(ship.cargo, [equ1, equ2]); - check.equals(loot, []); - - // discard to cargo - let equ1s = sheet.layer_equipments.children[0]; - check.same(equ1s.item, equ1); - equ1s.applyDragDrop(cargo_slot, loot_slot, false); - check.equals(ship.cargo, [equ2]); - check.equals(loot, [equ1]); - }); - }); -} diff --git a/src/ui/character/CharacterLootSlot.ts b/src/ui/character/CharacterLootSlot.ts deleted file mode 100644 index 60ce21d..0000000 --- a/src/ui/character/CharacterLootSlot.ts +++ /dev/null @@ -1,29 +0,0 @@ -/// -/// - -module TK.SpaceTac.UI { - /** - * Display a loot slot - */ - export class CharacterLootSlot extends CharacterCargo { - addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - if (!test) { - add(this.sheet.loot_items, equipment.item); - } - return { success: true, info: "leave equipment" }; - } - removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - let info = "Loot equipment"; - if (contains(this.sheet.loot_items, equipment.item)) { - if (test) { - return { success: true, info: info }; - } else { - let success = remove(this.sheet.loot_items, equipment.item); - return { success: success, info: info }; - } - } else { - return { success: false, info: info, error: "not lootable!" }; - } - } - } -} diff --git a/src/ui/character/CharacterPortrait.ts b/src/ui/character/CharacterPortrait.ts new file mode 100644 index 0000000..2d71047 --- /dev/null +++ b/src/ui/character/CharacterPortrait.ts @@ -0,0 +1,25 @@ +module TK.SpaceTac.UI { + /** + * Display the portrait of a fleet member on a character sheet + */ + export class CharacterPortrait { + constructor(readonly ship: Ship) { + } + + /** + * Draw the portrait (anchored at the center) + */ + draw(builder: UIBuilder, x: number, y: number, onselect: () => void): UIButton { + let button = builder.button("character-portrait", x, y, onselect, this.ship.getName(), identity); + button.anchor.set(0.5); + + builder.in(button, builder => { + // FIXME Under hover/on + let portrait = builder.image(`ship-${this.ship.model.code}-portrait`, 0, 0, true); + portrait.scale.set(0.5); + }); + + return button; + } + } +} diff --git a/src/ui/character/CharacterSheet.spec.ts b/src/ui/character/CharacterSheet.spec.ts index 9cf3044..6fa6bb4 100644 --- a/src/ui/character/CharacterSheet.spec.ts +++ b/src/ui/character/CharacterSheet.spec.ts @@ -6,116 +6,28 @@ module TK.SpaceTac.UI.Specs { test.case("displays fleet and ship information", check => { let view = testgame.view; - let sheet = new CharacterSheet(view, -1000); + check.patch(view, "getWidth", () => 1240); + let sheet = new CharacterSheet(view); - check.equals(sheet.x, -1000); + check.equals(sheet.x, -1240); let fleet = new Fleet(); let ship1 = fleet.addShip(); - ship1.addSlot(SlotType.Hull); - ship1.addSlot(SlotType.Engine); - ship1.addSlot(SlotType.Shield); - ship1.addSlot(SlotType.Weapon); - ship1.setCargoSpace(3); ship1.name = "Ship 1"; let ship2 = fleet.addShip(); - ship2.addSlot(SlotType.Hull); ship2.name = "Ship 2"; - ship2.setCargoSpace(2); sheet.show(ship1, false); check.equals(sheet.x, 0); - check.equals(sheet.portraits.length, 2); + check.equals(sheet.group_portraits.length, 2); - check.equals(sheet.ship_name.text, "Ship 1"); - check.equals(sheet.ship_slots.length, 4); - check.equals(sheet.ship_cargo.length, 3); + check.equals(sheet.text_name.text, "Ship 1"); - let portrait = sheet.portraits.getChildAt(1); + let portrait = as(Phaser.Button, sheet.group_portraits.getChildAt(1)); portrait.onInputUp.dispatch(); - check.equals(sheet.ship_name.text, "Ship 2"); - check.equals(sheet.ship_slots.length, 1); - check.equals(sheet.ship_cargo.length, 2); - }); - - test.case("moves equipment around", check => { - let fleet = new Fleet(); - let ship = fleet.addShip(); - ship.setCargoSpace(2); - let equ1 = TestTools.addEngine(ship, 1); - let equ2 = new Equipment(SlotType.Weapon); - ship.addCargo(equ2); - let equ3 = new Equipment(SlotType.Hull); - let equ4 = new Equipment(SlotType.Power); - let loot = [equ3, equ4]; - ship.addSlot(SlotType.Weapon); - - let sheet = new CharacterSheet(testgame.view); - sheet.show(ship, false); - - check.equals(sheet.loot_slots.visible, false); - check.equals(sheet.layer_equipments.children.length, 2); - - sheet.setLoot(loot); - - check.equals(sheet.loot_slots.visible, true); - check.equals(sheet.layer_equipments.children.length, 4); - - let findsprite = (equ: Equipment) => nn(first(sheet.layer_equipments.children, sp => sp.item == equ)); - let draddrop = (sp: CharacterEquipment, dest: CharacterCargo | CharacterSlot) => { - sp.applyDragDrop(sp.container, dest, false); - } - - // Unequip - let sprite = findsprite(equ1); - check.notequals(equ1.attached_to, null); - check.equals(ship.cargo.length, 1); - draddrop(sprite, sheet.ship_cargo.children[0]); - check.equals(equ1.attached_to, null); - check.equals(ship.cargo.length, 2); - check.contains(ship.cargo, equ1); - - // Equip - sprite = findsprite(equ2); - check.equals(equ2.attached_to, null); - check.contains(ship.cargo, equ2); - draddrop(sprite, sheet.ship_slots.children[0]); - check.same(equ2.attached_to, ship.slots[1]); - check.notcontains(ship.cargo, equ2); - - // Loot - sprite = findsprite(equ3); - check.equals(equ3.attached_to, null); - check.notcontains(ship.cargo, equ3); - check.contains(loot, equ3); - draddrop(sprite, sheet.ship_cargo.children[0]); - check.equals(equ3.attached_to, null); - check.contains(ship.cargo, equ3); - check.notcontains(loot, equ3); - - // Can't loop - no cargo space available - sprite = findsprite(equ4); - check.notcontains(ship.cargo, equ4); - check.contains(loot, equ4); - draddrop(sprite, sheet.ship_cargo.children[0]); - check.notcontains(ship.cargo, equ4); - check.contains(loot, equ4); - - // Discard - sprite = findsprite(equ1); - check.contains(ship.cargo, equ1); - check.notcontains(loot, equ1); - draddrop(sprite, sheet.ship_cargo.children[0]); - check.equals(equ1.attached_to, null); - check.notcontains(loot, equ1); - - // Can't equip - no slot available - sprite = findsprite(equ3); - check.equals(equ3.attached_to, null); - draddrop(sprite, sheet.ship_slots.children[0]); - check.equals(equ3.attached_to, null); + check.equals(sheet.text_name.text, "Ship 2"); }); test.case("controls global interactivity state", check => { @@ -141,19 +53,5 @@ module TK.SpaceTac.UI.Specs { check.equals(sheet.isInteractive(), true, "interactivity reenabled"); }); }); - - test.case("fits slots in area", check => { - let result = CharacterSheet.getSlotPositions(6, 300, 200, 100, 100); - check.equals(result, { - positions: [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 200, y: 0 }, { x: 0, y: 100 }, { x: 100, y: 100 }, { x: 200, y: 100 }], - scaling: 1 - }); - - result = CharacterSheet.getSlotPositions(6, 299, 199, 100, 100); - check.equals(result, { - positions: [{ x: 0, y: 0 }, { x: 100, y: 0 }, { x: 200, y: 0 }, { x: 0, y: 100 }, { x: 100, y: 100 }, { x: 200, y: 100 }], - scaling: 0.99 - }); - }); }); } diff --git a/src/ui/character/CharacterSheet.ts b/src/ui/character/CharacterSheet.ts index 7a9fd05..bc5e92e 100644 --- a/src/ui/character/CharacterSheet.ts +++ b/src/ui/character/CharacterSheet.ts @@ -1,9 +1,4 @@ module TK.SpaceTac.UI { - export type CharacterEquipmentDrop = { - message: string - callback: (equipment: Equipment) => any - } - /** * Character sheet, displaying ship characteristics */ @@ -18,153 +13,236 @@ module TK.SpaceTac.UI { builder: UIBuilder // X positions - xshown: number - xhidden: number + xshown = 0 + xhidden = -2000 + + // Groups + group_portraits: Phaser.Group + group_attributes: Phaser.Image + group_actions: Phaser.Image + group_upgrades: Phaser.Group // Close button close_button: Phaser.Button // Currently displayed fleet - fleet!: Fleet + fleet?: Fleet // Currently displayed ship - ship!: Ship + ship?: Ship - // Ship name - ship_name: Phaser.Text + // Variable data + image_portrait: Phaser.Image + text_model: Phaser.Text + text_description: Phaser.Text + text_name: Phaser.Text + text_level: Phaser.Text + text_upgrade_points: Phaser.Text + valuebar_experience: ValueBar - // Ship level - ship_level: Phaser.Text - ship_experience: ValueBar - - // Ship skill upgrade - ship_upgrade_points: Phaser.Text - layer_upgrades: Phaser.Group - - // Ship slots - ship_slots: Phaser.Group - - // Ship cargo - ship_cargo: Phaser.Group - - // Dynamic texts - mode_title: UIText - action_message: UIText - - // Loot items - loot_slots: Phaser.Group - loot_items: Equipment[] = [] - loot_page = 0 - loot_next: Phaser.Button - loot_prev: Phaser.Button - - // Shop - shop: Shop | null = null - - // Fleet portraits - members: CharacterFleetMember[] = [] - portraits: Phaser.Group - - // Layers - layer_attibutes: Phaser.Group - layer_equipments: Phaser.Group - - // Credits - credits: Phaser.Text - - // Attributes and skills - attributes: { [key: string]: Phaser.Text } = {} - - constructor(view: BaseView, xhidden = -2000, xshown = 0, onclose?: Function) { + constructor(view: BaseView, onclose?: Function) { super(view.game, 0, 0, "character-sheet"); this.view = view; - this.builder = new UIBuilder(view, this); + this.builder = new UIBuilder(view, this).styled({ color: "#e7ebf0", size: 16, shadow: true }); - this.x = xhidden; - this.xshown = xshown; - this.xhidden = xhidden; + this.xhidden = -this.view.getWidth(); + this.x = this.xhidden; this.inputEnabled = true; if (!onclose) { onclose = () => this.hide(); } - this.close_button = this.builder.button("character-close", 1920, 0, onclose, "Close the character sheet"); + this.close_button = this.builder.button("character-close-button", 1920, 0, onclose, "Close the character sheet"); this.close_button.anchor.set(1, 0); - this.builder.text("Cargo", 1566, 36, { size: 24 }); - this.builder.text("Level", 420, 1052, { size: 24 }); - this.builder.text("Available points", 894, 1052, { size: 24 }); + this.image_portrait = this.builder.image("translucent", 435, 271, true); - this.ship_name = this.builder.text("", 758, 48, { size: 30 }); - this.ship_level = this.builder.text("", 554, 1052, { size: 30 }); - this.ship_upgrade_points = this.builder.text("", 1068, 1052, { size: 30 }); - this.ship_slots = this.builder.group("slots", 372, 120); - this.ship_cargo = this.builder.group("cargo", 1240, 86); - this.loot_slots = this.builder.group("loot", 1270, 670); - this.loot_slots.visible = false; - this.portraits = this.builder.group("portraits", 152, 0); - this.credits = this.builder.text("", 136, 38, { size: 30 }); - this.mode_title = this.builder.text("", 1566, 648, { size: 18 }); - this.action_message = this.builder.text("", 1566, 1056, { size: 18 }); - this.loot_next = this.builder.button("common-arrow-right", 1890, 850, () => this.paginate(1), "Show next items"); - this.loot_next.anchor.set(0.5); - this.loot_prev = this.builder.button("common-arrow-left", 1238, 850, () => this.paginate(-1), "Show previous items"); - this.loot_prev.anchor.set(0.5); + this.builder.image("character-entry", 28, 740); - this.ship_experience = new ValueBar(this.view, "character-experience", ValueBarOrientation.EAST, 516, 1067); - this.addChild(this.ship_experience.node); + this.group_portraits = this.builder.group("portraits", 90, 755); - this.layer_attibutes = this.builder.group("attributes"); - this.layer_upgrades = this.builder.group("upgrades"); - this.layer_equipments = this.builder.group("equipments"); + let model_bg = this.builder.image("character-ship-model", 434, 500, true); + this.text_model = this.builder.in(model_bg).text("", 0, 0, { size: 28 }); - let x1 = 402; - let x2 = 802; - let y = 640; - this.addAttribute("hull_capacity", x1, y); - this.addAttribute("shield_capacity", x1, y + 64); - this.addAttribute("power_capacity", x1, y + 128); - this.addAttribute("power_generation", x1, y + 192); - this.addAttribute("maneuvrability", x1, y + 256); - this.addAttribute("precision", x1, y + 320); - this.addAttribute("skill_materials", x2, y); - this.addAttribute("skill_photons", x2, y + 64); - this.addAttribute("skill_antimatter", x2, y + 128); - this.addAttribute("skill_quantum", x2, y + 192); - this.addAttribute("skill_gravity", x2, y + 256); - this.addAttribute("skill_time", x2, y + 320); + let description_bg = this.builder.image("character-ship-description", 434, 654, true); + this.text_description = this.builder.in(description_bg).text("", 0, 0, { color: "#a0afc3", width: 510 }); + + this.group_attributes = this.builder.image("character-ship-column", 30, 30); + this.group_actions = this.builder.image("character-ship-column", 698, 30); + + let name_bg = this.builder.image("character-name-display", 434, 940, true); + this.text_name = this.builder.in(name_bg).text("", 0, 0, { size: 28 }); + + this.builder.button("character-name-button", 656, 890, () => this.renamePersonality(), "Rename personality"); + + let points_bg = this.builder.image("character-level-upgrades", 582, 986); + this.builder.in(points_bg, builder => { + builder.text("Upgrade points", 46, 10, { center: false, vcenter: false }); + builder.image("character-upgrade-point", 147, 59, true); + }); + this.text_upgrade_points = this.builder.in(points_bg).text("", 106, 60, { size: 28 }); + + let level_bg = this.builder.image("character-level-display", 434, 1032, true); + this.text_level = this.builder.in(level_bg).text("", 0, 4, { size: 28 }); + this.valuebar_experience = this.builder.in(level_bg).valuebar("character-level-experience", -level_bg.width * 0.5, -level_bg.height * 0.5); + + this.group_upgrades = this.builder.group("upgrades"); + + this.refreshUpgrades(); + this.refreshAttributes(); + this.refreshActions(); } /** * Check if the sheet should be interactive */ isInteractive(): boolean { - return this.ship ? (!this.ship.critical && this.interactive) : false; + return this.ship ? (this.interactive && !this.ship.critical) : false; } /** - * Add an attribute display + * Open a dialog to rename the ship's personality */ - private addAttribute(attribute: keyof ShipAttributes, x: number, y: number) { + renamePersonality(): void { + // TODO + } + + /** + * Refresh the ship information display + */ + private refreshShipInfo(): void { + if (this.ship) { + let ship = this.ship; + this.builder.change(this.image_portrait, `ship-${ship.model.code}-portrait`); + this.text_name.setText(ship.name || ""); + this.text_model.setText(ship.model.name); + this.text_level.setText(`Level ${ship.level.get()}`); + this.text_description.setText(ship.model.getDescription()); + this.text_upgrade_points.setText(`${ship.getAvailableUpgradePoints()}`); + this.valuebar_experience.setValue(ship.level.getExperience(), ship.level.getNextGoal()); + } + } + + /** + * Refresh the upgrades display + */ + private refreshUpgrades(): void { + let builder = this.builder.in(this.group_upgrades); + builder.clear(); + + if (!this.ship) { + return; + } let ship = this.ship; - let builder = this.builder.in(this.layer_attibutes); + let initial = builder.image("character-initial", 970, 30); - let button = builder.button("character-attribute", x, y, undefined, () => ship.getAttributeDescription(attribute)); + // Base equipment (level 1) + builder.styled({ center: false, vcenter: false }).in(initial, builder => { + builder.text("Base equipment", 32, 8, { color: "#e2e9d1" }); - let attrname = capitalize(SHIP_VALUES_NAMES[attribute]); - builder.in(button).text(attrname, 120, 22, { size: 20, color: "#c9d8ef", stroke_width: 1, stroke_color: "#395665" }); + builder.in(builder.group("attributes"), builder => { + let effects = cfilter(ship.model.getEffects(1, []), AttributeEffect); + effects.forEach(effect => { + let button = builder.button(`attribute-${effect.attrcode}`, 0, 8, undefined, + `${capitalize(SHIP_VALUES_NAMES[effect.attrcode])} - ${SHIP_VALUES_DESCRIPTIONS[effect.attrcode]}`); - let value = builder.in(button).text("", 264, 24, { size: 18, bold: true }); + builder.in(button, builder => { + builder.text(`${effect.value}`, 56, 8, { size: 22 }); + }); + }); + builder.distribute("x", 236, 870); + }); - this.attributes[attribute] = value; + builder.in(builder.group("actions"), builder => { + let actions = ship.model.getActions(1, []); + actions.forEach(action => { + let button = builder.button("translucent", 0, 66, undefined, action.getEffectsDescription()); - if (SHIP_SKILLS.hasOwnProperty(attribute)) { - this.builder.in(this.layer_upgrades).button("character-skill-upgrade", x + 292, y, () => { - ship.upgradeSkill(attribute); - this.refresh(); - }, `Spend one point to upgrade ${attrname}`); + builder.in(button, builder => { + let icon = builder.image(`action-${action.code}`); + icon.scale.set(0.1875); + if (actions.length < 5) { + builder.text(`${action.name}`, 56, 12, { size: 16 }); + } + }); + }); + builder.distribute("x", 28, 888); + }); + }); + + // Level number + range(10).forEach(i => { + builder.text(`${i + 1}`, 920, i == 0 ? 92 : (110 + i * 100), { + center: true, + vcenter: true, + size: 28, + color: ship.level.get() >= (i + 1) ? "#e7ebf0" : "#808285" + }); + }); + + // Level upgrades + range(9).forEach(i => { + builder.image("character-level-separator", 844, 154 + i * 100); + + let level = i + 2; + let upgrades = ship.model.getLevelUpgrades(level); + upgrades.forEach((upgrade, j) => { + let onchange = (selected: boolean) => { + this.refreshShipInfo(); // TODO Only upgrade points + this.refreshActions(); + this.refreshAttributes(); + }; + new CharacterUpgrade(ship, upgrade, level).draw(builder, 970 + j * 315, 170 + i * 100, + this.isInteractive() ? onchange : undefined); + }); + }); + } + + /** + * Refresh the attributes display + */ + private refreshAttributes(): void { + let builder = this.builder.in(this.group_attributes); + builder.clear(); + + builder.text("Attributes", 74, 20, { color: "#a0afc3" }); + + if (this.ship) { + let ship = this.ship; + builder.in(builder.group("items"), builder => { + keys(SHIP_ATTRIBUTES).forEach(attribute => { + let button = builder.button(`attribute-${attribute}`, 24, 0, undefined, + ship.getAttributeDescription(attribute)); + + builder.in(button).text(`${ship.getAttribute(attribute)}`, 78, 27, { size: 22 }); + }); + builder.distribute("y", 40, 688); + }); + } + } + + /** + * Refresh the actions display + */ + private refreshActions(): void { + let builder = this.builder.in(this.group_actions); + builder.clear(); + + builder.text("Actions", 74, 20, { color: "#a0afc3" }); + + if (this.ship) { + let ship = this.ship; + builder.in(builder.group("items"), builder => { + let actions = ship.actions.listAll().filter(action => !(action instanceof EndTurnAction)); + actions.forEach(action => { + let button = builder.button(`action-${action.code}`, 24, 0, undefined, + action.getEffectsDescription()); + button.scale.set(0.375); + }); + builder.distribute("y", 40, 688); + }); } } @@ -172,29 +250,25 @@ module TK.SpaceTac.UI { * Update the fleet sidebar */ updateFleet(fleet: Fleet) { - if (fleet != this.fleet || fleet.ships.length != this.members.length) { - this.portraits.removeAll(true); - this.members = []; + if (fleet !== this.fleet || fleet.ships.length != this.group_portraits.length) { + destroyChildren(this.group_portraits); this.fleet = fleet; + + let builder = this.builder.in(this.group_portraits); + fleet.ships.forEach((ship, idx) => { + let button: UIButton + button = new CharacterPortrait(ship).draw(builder, 64 + idx * 140, 64, () => { + if (button) { + builder.select(button); + this.ship = ship; + this.refreshShipInfo(); + this.refreshActions(); + this.refreshAttributes(); + this.refreshUpgrades(); + } + }); + }); } - - fleet.ships.forEach((ship, idx) => { - let portrait = this.members[idx]; - if (!portrait) { - portrait = new CharacterFleetMember(this, 0, idx * 320, ship); - this.portraits.add(portrait); - this.members.push(portrait); - } - portrait.setSelected(ship == this.ship); - }); - - this.credits.setText(fleet.credits.toString()); - - this.portraits.scale.set(980 * this.portraits.scale.x / this.portraits.height, 980 * this.portraits.scale.y / this.portraits.height); - if (this.portraits.width > 308) { - this.portraits.scale.set(308 * this.portraits.scale.x / this.portraits.width, 308 * this.portraits.scale.y / this.portraits.width); - } - this.portraits.y = 80 + 160 * this.portraits.scale.x; } /** @@ -213,60 +287,13 @@ module TK.SpaceTac.UI { this.interactive = interactive; } - this.layer_equipments.removeAll(true); - this.setActionMessage(); - - let upgrade_points = ship.getAvailableUpgradePoints(); - - this.ship_name.setText(ship.getName(false)); - this.ship_level.setText(ship.level.get().toString()); - this.ship_experience.setValue(ship.level.getExperience(), ship.level.getNextGoal()); - this.ship_upgrade_points.setText(upgrade_points.toString()); - this.layer_upgrades.visible = this.isInteractive() && upgrade_points > 0; - - iteritems(ship.attributes, (key, value: ShipAttribute) => { - let text = this.attributes[key]; - if (text) { - text.setText(value.get().toString()); - } - }); - - let slotsinfo = CharacterSheet.getSlotPositions(ship.slots.length, 800, 454, 200, 200); - this.ship_slots.removeAll(true); - ship.slots.forEach((slot, idx) => { - let slot_display = new CharacterSlot(this, slotsinfo.positions[idx].x, slotsinfo.positions[idx].y, slot.type); - slot_display.scale.set(slotsinfo.scaling, slotsinfo.scaling); - slot_display.alpha = this.isInteractive() ? 1 : 0.5; - this.ship_slots.add(slot_display); - - if (slot.attached) { - let equipment = new CharacterEquipment(this, slot.attached, slot_display); - this.layer_equipments.add(equipment); - } - }); - - slotsinfo = CharacterSheet.getSlotPositions(ship.cargo_space, 638, 496, 200, 200); - this.ship_cargo.removeAll(true); - range(ship.cargo_space).forEach(idx => { - let cargo_slot = new CharacterCargo(this, slotsinfo.positions[idx].x, slotsinfo.positions[idx].y); - cargo_slot.scale.set(slotsinfo.scaling, slotsinfo.scaling); - cargo_slot.alpha = this.isInteractive() ? 1 : 0.5; - this.ship_cargo.add(cargo_slot); - - if (idx < ship.cargo.length) { - let equipment = new CharacterEquipment(this, ship.cargo[idx], cargo_slot); - this.layer_equipments.add(equipment); - } - }); - - this.updateLoot(); + this.refreshShipInfo(); + this.refreshUpgrades(); + this.refreshAttributes(); + this.refreshActions(); this.updateFleet(ship.fleet); - if (this.shop) { - this.updatePrices(this.shop); - } - if (sound) { this.view.audio.playOnce("ui-dialog-open"); } @@ -282,14 +309,6 @@ module TK.SpaceTac.UI { * Hide the sheet */ hide(animate = true) { - this.loot_page = 0; - this.loot_items = []; - this.shop = null; - this.loot_slots.visible = false; - this.mode_title.visible = false; - - this.members.forEach(member => member.setSelected(false)); - this.view.audio.playOnce("ui-dialog-close"); if (animate) { @@ -299,113 +318,6 @@ module TK.SpaceTac.UI { } } - /** - * Set the action message (mainly used while dragging equipment to explain what is happening) - */ - setActionMessage(message = "", color = "#ffffff"): void { - if (message != this.action_message.text) { - this.action_message.setText(message); - this.action_message.fill = color; - } - } - - /** - * Set the list of lootable equipment - * - * The list of equipments may be altered if items are taken from it - * - * This list will be shown until sheet is closed - */ - setLoot(loot: Equipment[]) { - this.loot_page = 0; - - this.loot_items = loot; - this.updateLoot(); - this.loot_slots.visible = true; - - this.mode_title.setText("Lootable items"); - this.mode_title.visible = true; - } - - /** - * Set the displayed shop - * - * This shop will be shown until sheet is closed - */ - setShop(shop: Shop, title = "Dockyard's equipment") { - this.loot_page = 0; - - this.shop = shop; - this.updateLoot(); - this.loot_slots.visible = true; - - this.mode_title.setText(title); - this.mode_title.visible = true; - } - - /** - * Update the price tags on each equipment, for a specific shop - */ - updatePrices(shop: Shop) { - this.layer_equipments.children.forEach(equipement => { - if (equipement instanceof CharacterEquipment) { - equipement.setPrice(shop.getPrice(equipement.item)); - } - }); - } - - /** - * Change the page displayed in loot/shop section - */ - paginate(offset: number) { - let items = this.shop ? this.shop.getStock() : this.loot_items; - this.loot_page = clamp(this.loot_page + offset, 0, 1 + Math.floor(items.length / 12)); - this.refresh(); - } - - /** - * Update the loot slots - */ - private updateLoot() { - let per_page = 12; - this.loot_slots.removeAll(true); - - let info = CharacterSheet.getSlotPositions(12, 588, 354, 196, 196); - let items = this.shop ? this.shop.getStock() : this.loot_items; - range(per_page).forEach(idx => { - let loot_slot = this.shop ? new CharacterShopSlot(this, info.positions[idx].x, info.positions[idx].y) : new CharacterLootSlot(this, info.positions[idx].x, info.positions[idx].y); - loot_slot.scale.set(info.scaling, info.scaling); - this.loot_slots.add(loot_slot); - - idx += per_page * this.loot_page; - - if (idx < items.length) { - let equipment = new CharacterEquipment(this, items[idx], loot_slot); - this.layer_equipments.add(equipment); - } - }); - - this.view.animations.setVisible(this.loot_prev, this.loot_page > 0, 200); - this.view.animations.setVisible(this.loot_next, (this.loot_page + 1) * per_page < items.length, 200); - } - - /** - * Get an iterator over equipment containers - */ - iEquipmentContainers(): Iterator { - let candidates = ichain( - iarray(this.portraits.children), - iarray(this.ship_slots.children), - iarray(this.ship_cargo.children), - ); - - if (this.loot_slots.visible) { - candidates = ichain(candidates, iarray(this.loot_slots.children)); - } - - return candidates; - } - /** * Refresh the sheet display */ @@ -414,32 +326,5 @@ module TK.SpaceTac.UI { this.show(this.ship, false, false); } } - - /** - * Get the positions and scaling for slots, to fit in a rectangle group. - */ - static getSlotPositions(count: number, areawidth: number, areaheight: number, slotwidth: number, slotheight: number): { positions: { x: number, y: number }[], scaling: number } { - // Find grid size - let rows = 2; - let columns = 3; - while (count > rows * columns) { - rows += 1; - columns += 1; - } - - // Find scaling - let scaling = 1; - while (slotwidth * scaling * columns > areawidth || slotheight * scaling * rows > areaheight) { - scaling *= 0.99; - } - - // Position - let positions = range(count).map(i => { - let row = Math.floor(i / columns); - let column = i % columns; - return { x: column * (areawidth - slotwidth * scaling) / (columns - 1), y: row * (areaheight - slotheight * scaling) / (rows - 1) }; - }); - return { positions: positions, scaling: scaling }; - } } } diff --git a/src/ui/character/CharacterShopSlot.spec.ts b/src/ui/character/CharacterShopSlot.spec.ts deleted file mode 100644 index 74d537f..0000000 --- a/src/ui/character/CharacterShopSlot.spec.ts +++ /dev/null @@ -1,56 +0,0 @@ -module TK.SpaceTac.UI.Specs { - testing("CharacterShopSlot", test => { - let testgame = setupEmptyView(test); - - test.case("buys and sell if bound to a shop", check => { - let view = testgame.view; - let sheet = new CharacterSheet(view); - - let fleet = new Fleet(); - fleet.credits = 100; - let ship = fleet.addShip(); - ship.setCargoSpace(2); - let equ1 = new Equipment(SlotType.Shield, "equ1"); - ship.addCargo(equ1); - - let equ2 = new Equipment(SlotType.Weapon, "equ2"); - let shop = new Shop(1, [equ2], 0); - check.patch(shop, "getPrice", () => 120); - sheet.setShop(shop); - sheet.show(ship); - - check.equals(ship.cargo, [equ1]); - check.equals(shop.stock, [equ2]); - check.equals(fleet.credits, 100); - - let cargo_slot = sheet.ship_cargo.children[0]; - check.equals(cargo_slot instanceof CharacterCargo, true); - let shop_slot = sheet.loot_slots.children[0]; - check.equals(shop_slot instanceof CharacterShopSlot, true); - - // sell - let equ1s = sheet.layer_equipments.children[0]; - check.same(equ1s.item, equ1); - equ1s.applyDragDrop(cargo_slot, shop_slot, false); - check.equals(ship.cargo, []); - check.equals(shop.stock, [equ2, equ1]); - check.equals(fleet.credits, 220); - - // buy - let equ2s = sheet.layer_equipments.children[1]; - check.same(equ2s.item, equ2); - equ2s.applyDragDrop(shop_slot, cargo_slot, false); - check.equals(ship.cargo, [equ2]); - check.equals(shop.stock, [equ1]); - check.equals(fleet.credits, 100); - - // not enough money - equ1s = sheet.layer_equipments.children[0]; - check.same(equ1s.item, equ1); - equ1s.applyDragDrop(shop_slot, cargo_slot, false); - check.equals(ship.cargo, [equ2]); - check.equals(shop.stock, [equ1]); - check.equals(fleet.credits, 100); - }); - }); -} diff --git a/src/ui/character/CharacterShopSlot.ts b/src/ui/character/CharacterShopSlot.ts deleted file mode 100644 index 69bc0ea..0000000 --- a/src/ui/character/CharacterShopSlot.ts +++ /dev/null @@ -1,46 +0,0 @@ -/// - -module TK.SpaceTac.UI { - /** - * Display a shop slot - */ - export class CharacterShopSlot extends CharacterLootSlot { - addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - let shop = this.sheet.shop; - if (shop && !contains(shop.getStock(), equipment.item)) { - let price = shop.getPrice(equipment.item); - let info = `sell for ${price} zotys`; - if (test) { - return { success: true, info: info }; - } else { - let success = shop.buyFromFleet(equipment.item, this.sheet.fleet); - return { success: success, info: info }; - } - } else { - return { success: false, info: "sell equipment", error: "it's already mine!" }; - } - } - - removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - let shop = this.sheet.shop; - if (shop && contains(shop.getStock(), equipment.item)) { - let price = shop.getPrice(equipment.item); - let info = `buy for ${price} zotys`; - if (destination) { - if (price > this.sheet.fleet.credits) { - return { success: false, info: info, error: "not enough zotys" }; - } else if (test) { - return { success: true, info: info }; - } else { - let success = shop.sellToFleet(equipment.item, this.sheet.fleet); - return { success: success, info: info }; - } - } else { - return { success: test, info: info }; - } - } else { - return { success: false, info: "buy equipment", error: "it's not mine to sell!" }; - } - } - } -} diff --git a/src/ui/character/CharacterSlot.spec.ts b/src/ui/character/CharacterSlot.spec.ts deleted file mode 100644 index ab1a0e4..0000000 --- a/src/ui/character/CharacterSlot.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -module TK.SpaceTac.UI.Specs { - testing("CharacterSlot", test => { - let testgame = setupEmptyView(test); - - test.case("allows dragging equipment", check => { - let view = testgame.view; - let ship = new Ship(); - ship.addSlot(SlotType.Hull); - let sheet = new CharacterSheet(view); - sheet.show(ship); - let source = new CharacterLootSlot(sheet, 0, 0); - sheet.addChild(source); - let equipment = new CharacterEquipment(sheet, new Equipment(SlotType.Engine), source); - - let slot = new CharacterSlot(sheet, 0, 0, SlotType.Engine); - check.equals(slot.addEquipment(equipment, source, true), { success: false, info: 'equip in engine slot', error: 'no free slot' }); - check.equals(slot.removeEquipment(equipment, source, true), { success: false, info: 'unequip from engine slot', error: 'not equipped!' }); - - ship.addSlot(SlotType.Engine); - check.equals(slot.addEquipment(equipment, source, true), { success: true, info: 'equip in engine slot' }); - - equipment.item.requirements["skill_time"] = 1; - check.equals(slot.addEquipment(equipment, source, true), { success: false, info: 'equip in engine slot', error: 'missing skills' }); - - ship.upgradeSkill("skill_time"); - check.equals(slot.addEquipment(equipment, source, true), { success: true, info: 'equip in engine slot' }); - - ship.critical = true; - check.equals(slot.addEquipment(equipment, source, true), { success: false, info: 'equip in engine slot', error: 'not a fleet member' }); - ship.critical = false; - - check.equals(ship.listEquipment(SlotType.Engine), []); - let result = slot.addEquipment(equipment, source, false); - check.equals(result, { success: true, info: 'equip in engine slot' }); - check.equals(ship.listEquipment(SlotType.Engine), [equipment.item]); - - check.equals(slot.removeEquipment(equipment, source, true), { success: true, info: 'unequip from engine slot' }); - ship.critical = true; - check.equals(slot.removeEquipment(equipment, source, true), { success: false, info: 'unequip from engine slot', error: 'not a fleet member' }); - ship.critical = false; - - result = slot.removeEquipment(equipment, source, false); - check.equals(result, { success: true, info: 'unequip from engine slot' }); - check.equals(ship.listEquipment(SlotType.Engine), []); - - }); - }); -} diff --git a/src/ui/character/CharacterSlot.ts b/src/ui/character/CharacterSlot.ts deleted file mode 100644 index 1712395..0000000 --- a/src/ui/character/CharacterSlot.ts +++ /dev/null @@ -1,73 +0,0 @@ -/// - -module TK.SpaceTac.UI { - /** - * Display a ship slot, with equipment attached to it - */ - export class CharacterSlot extends Phaser.Image implements CharacterEquipmentContainer { - sheet: CharacterSheet; - - constructor(sheet: CharacterSheet, x: number, y: number, slot: SlotType) { - let info = sheet.view.getImageInfo("character-equipment-slot"); - super(sheet.game, x, y, info.key, info.frame); - - this.sheet = sheet; - - let sloticon = sheet.view.newButton(`character-slot-${SlotType[slot].toLowerCase()}`, 150, 150); - sloticon.anchor.set(0.5); - this.addChild(sloticon); - sheet.view.tooltip.bindStaticText(sloticon, `${SlotType[slot]} slot`); - } - - - /** - * CharacterEquipmentContainer interface - */ - isInside(x: number, y: number): boolean { - return this.getBounds().contains(x, y); - } - getEquipmentAnchor(): { x: number, y: number, scale: number, alpha: number } { - return { - x: this.x + this.parent.x + 84 * this.scale.x, - y: this.y + this.parent.y + 83 * this.scale.y, - scale: this.scale.x, - alpha: this.alpha, - } - } - getPriceOffset(): number { - return 66; - } - addEquipment(equipment: CharacterEquipment, source: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - let info = equipment.item.slot_type ? `equip in ${SlotType[equipment.item.slot_type].toLowerCase()} slot` : "equip"; - if (this.sheet.ship.critical) { - return { success: false, info: info, error: "not a fleet member" }; - } else if (!equipment.item.canBeEquipped(this.sheet.ship.attributes, false)) { - return { success: false, info: info, error: "missing skills" }; - } else if (equipment.item.slot_type && !this.sheet.ship.getFreeSlot(equipment.item.slot_type)) { - return { success: false, info: info, error: "no free slot" }; - } else { - if (test) { - return { success: true, info: info }; - } else { - let success = this.sheet.ship.equip(equipment.item, false); - return { success: success, info: info }; - } - } - } - removeEquipment(equipment: CharacterEquipment, destination: CharacterEquipmentContainer | null, test: boolean): CharacterEquipmentTransfer { - let info = equipment.item.slot_type ? `unequip from ${SlotType[equipment.item.slot_type].toLowerCase()} slot` : "unequip"; - if (this.sheet.ship.critical) { - return { success: false, info: info, error: "not a fleet member" }; - } if (!contains(this.sheet.ship.listEquipment(equipment.item.slot_type), equipment.item)) { - return { success: false, info: info, error: "not equipped!" }; - } else { - if (test) { - return { success: true, info: info }; - } else { - let success = this.sheet.ship.unequip(equipment.item, false); - return { success: success, info: info }; - } - } - } - } -} diff --git a/src/ui/character/CharacterUpgrade.ts b/src/ui/character/CharacterUpgrade.ts new file mode 100644 index 0000000..f221c16 --- /dev/null +++ b/src/ui/character/CharacterUpgrade.ts @@ -0,0 +1,104 @@ +module TK.SpaceTac.UI { + /** + * Display a single upgrade options + */ + export class CharacterUpgrade { + constructor( + readonly ship: Ship, + readonly upgrade: ModelUpgrade, + readonly level: number + ) { + } + + /** + * Draw the upgrade button + */ + draw(builder: UIBuilder, x: number, y: number, onchange?: (selected: boolean) => void): void { + let active = this.ship.level.hasUpgrade(this.upgrade); + let enabled = onchange ? (this.ship.level.get() >= this.level) : active; + let tooltip = enabled ? ((filler: TooltipBuilder) => this.fillTooltip(filler)) : undefined; + let selector = (enabled && onchange) ? ((on: boolean) => this.activate(on, onchange)) : undefined; + let button = builder.button("character-upgrade", x, y, undefined, tooltip, selector); + + if (active) { + builder.switch(button, true); + } + + builder.in(button, builder => { + if (enabled) { + builder.text(this.upgrade.code, 166, 40, { size: 16, color: "#e7ebf0", width: 210 }); + + let icon = builder.image(this.getIcon(this.upgrade), 40, 40, true); + if (icon.width && icon.width > 64) { + icon.scale.set(64 / icon.width); + } + + range(this.upgrade.cost || 0).forEach(i => { + builder.image("character-upgrade-point", 275, 64 - i * 24, true); + }); + } else { + builder.image("character-upgrade-locked"); + } + }); + } + + /** + * Activate or deactivate the upgrade + */ + private activate(on: boolean, onchange: (selected: boolean) => void): boolean { + let oldval = this.ship.level.hasUpgrade(this.upgrade); + this.ship.activateUpgrade(this.upgrade, on); + let newval = this.ship.level.hasUpgrade(this.upgrade); + + if (newval != oldval) { + onchange(newval); + } + + return newval; + } + + /** + * Fill the tooltip for this upgrade + */ + private fillTooltip(builder: TooltipBuilder): boolean { + builder.text(this.upgrade.code, 0, 0, { size: 20 }); + + let y = 30; + + if (this.upgrade.effects) { + this.upgrade.effects.forEach(effect => { + builder.text(effect.getDescription(), 0, y); + y += 30; + }); + } + + if (this.upgrade.actions) { + this.upgrade.actions.forEach(action => { + builder.text(action.getEffectsDescription(), 0, y); + y += 60; + }); + } + + return true; + } + + /** + * Get an icon code for an upgrade + */ + private getIcon(upgrade: ModelUpgrade): string { + if (upgrade.actions && upgrade.actions.length) { + return `action-${upgrade.actions[0].code}`; + } else if (upgrade.effects && upgrade.effects.length) { + let effects = upgrade.effects; + let attr = first(effects, effect => effect instanceof AttributeEffect || effect instanceof AttributeMultiplyEffect); + if (attr && (attr instanceof AttributeEffect || attr instanceof AttributeMultiplyEffect)) { + return `attribute-${attr.attrcode}`; + } else { + return "translucent"; + } + } else { + return "translucent"; + } + } + } +} diff --git a/src/ui/character/FleetCreationView.spec.ts b/src/ui/character/FleetCreationView.spec.ts index 339a274..392faed 100644 --- a/src/ui/character/FleetCreationView.spec.ts +++ b/src/ui/character/FleetCreationView.spec.ts @@ -4,23 +4,6 @@ module TK.SpaceTac.UI.Specs { testing("FleetCreationView", test => { let testgame = setupSingleView(test, () => [new FleetCreationView, []]); - test.case("has a basic equipment shop with infinite stock", check => { - let shop = testgame.view.infinite_shop; - let itemcount = shop.getStock().length; - check.equals(unique(shop.getStock().map(equ => equ.code)).length, itemcount); - - let fleet = new Fleet(); - fleet.credits = 100000; - let item = shop.getStock()[0]; - shop.sellToFleet(item, fleet); - check.same(fleet.credits, 100000 - item.getPrice()); - check.same(shop.getStock().length, itemcount); - - shop.buyFromFleet(item, fleet); - check.equals(fleet.credits, 100000); - check.same(shop.getStock().length, itemcount); - }) - test.acase("validates the fleet creation", async check => { check.same(testgame.ui.session.isFleetCreated(), false, "no fleet created"); check.same(testgame.ui.session.player.fleet.ships.length, 0, "empty session fleet"); diff --git a/src/ui/character/FleetCreationView.ts b/src/ui/character/FleetCreationView.ts index 438f14d..7133823 100644 --- a/src/ui/character/FleetCreationView.ts +++ b/src/ui/character/FleetCreationView.ts @@ -12,22 +12,14 @@ module TK.SpaceTac.UI { create() { super.create(); - let models = ShipModel.getRandomModels(2); + let models = BaseModel.getRandomModels(2); this.built_fleet = new Fleet(); this.built_fleet.addShip(new Ship(null, MissionGenerator.generateCharacterName(), models[0])); this.built_fleet.addShip(new Ship(null, MissionGenerator.generateCharacterName(), models[1])); this.built_fleet.credits = this.built_fleet.ships.length * 1000; - let basic_equipments = () => { - let generator = new LootGenerator(); - let equipments = generator.templates.map(template => template.generate(1)); - return sortedBy(equipments, equipment => equipment.slot_type); - } - this.infinite_shop = new Shop(1, basic_equipments(), 0, basic_equipments); - - this.character_sheet = new CharacterSheet(this, undefined, undefined, () => this.validateFleet()); - this.character_sheet.setShop(this.infinite_shop, "Available stock (from Master Merchant Guild)"); + this.character_sheet = new CharacterSheet(this, () => this.validateFleet()); this.character_sheet.show(this.built_fleet.ships[0], false); this.getLayer("characters").add(this.character_sheet); } diff --git a/src/ui/common/Tooltip.ts b/src/ui/common/Tooltip.ts index 8469f05..df46847 100644 --- a/src/ui/common/Tooltip.ts +++ b/src/ui/common/Tooltip.ts @@ -2,6 +2,8 @@ module TK.SpaceTac.UI { + export type TooltipFiller = string | ((filler: TooltipBuilder) => string) | ((filler: TooltipBuilder) => boolean); + class TooltipContainer extends Phaser.Group { view: BaseView background: Phaser.Graphics @@ -169,6 +171,23 @@ module TK.SpaceTac.UI { this.bindDynamicText(obj, () => text); } + /** + * Show a tooltip for a component + */ + show(obj: Phaser.Button, content: TooltipFiller): void { + let builder = this.getBuilder(); + let scontent = (typeof content == "string") ? content : content(builder); + if (typeof scontent == "string") { + builder.text(scontent, 0, 0, { color: "#cccccc", size: 20 }); + } + + if (scontent) { + this.container.show(obj.getBounds()); + } else { + this.hide(); + } + } + /** * Hide the current tooltip */ diff --git a/src/ui/common/UIBuilder.spec.ts b/src/ui/common/UIBuilder.spec.ts index 50f0bd3..10b7d5a 100644 --- a/src/ui/common/UIBuilder.spec.ts +++ b/src/ui/common/UIBuilder.spec.ts @@ -109,7 +109,7 @@ module TK.SpaceTac.UI.Specs { builder.text("", 0, 0, {}); builder.text("", 0, 0, { shadow: true }); checkcomp(["View layers", "base", 0], Phaser.Text, "", { shadowColor: "rgba(0,0,0,0)" }); - checkcomp(["View layers", "base", 1], Phaser.Text, "", { shadowColor: "rgba(0,0,0,0.6)", shadowFill: true, shadowOffsetX: 3, shadowOffsetY: 4, shadowBlur: 6, shadowStroke: true }); + checkcomp(["View layers", "base", 1], Phaser.Text, "", { shadowColor: "rgba(0,0,0,0.6)", shadowFill: true, shadowOffsetX: 3, shadowOffsetY: 4, shadowBlur: 3, shadowStroke: true }); builder.clear(); builder.text("", 0, 0, {}); @@ -169,6 +169,42 @@ module TK.SpaceTac.UI.Specs { check.equals(a, 3); }) + test.case("can create toggle buttons", check => { + let builder = new UIBuilder(testgame.view); + + let mock = check.mockfunc("identity", (x: any) => x); + let button1 = builder.button("test-image1", 0, 0, undefined, undefined, mock.func); + let button2 = builder.button("test-image2"); + + let result = builder.switch(button2, true); + check.equals(result, false, "button2"); + check.called(mock, 0); + testClick(button2); + check.called(mock, 0); + + check.in("button1 on", check => { + result = builder.switch(button1, true); + check.equals(result, true); + check.called(mock, [[true]]); + }); + + check.in("button1 off", check => { + result = builder.switch(button1, false); + check.equals(result, false); + check.called(mock, [[false]]); + }); + + check.in("button1 first click", check => { + testClick(button1); + check.called(mock, [[true]]); + }); + + check.in("button1 second click", check => { + testClick(button1); + check.called(mock, [[false]]); + }); + }); + test.case("can create shaders", check => { let builder = new UIBuilder(testgame.view); @@ -241,5 +277,51 @@ module TK.SpaceTac.UI.Specs { checkcomp(["View layers", "base", 1], Phaser.Image, "test-mod-image"); checkcomp(["View layers", "base", 2], Phaser.Button, "test-mod-button"); }) + + test.case("distributes children along an axis", check => { + let builder = new UIBuilder(testgame.view); + builder = builder.in(builder.group("test")); + + let c1 = builder.text(""); + let c2 = builder.button("test"); + let c3 = builder.group("test"); + + check.equals(c1.x, 0); + check.equals(c1.y, 0); + check.equals(c2.x, 0); + check.equals(c2.y, 0); + check.equals(c3.x, 0); + check.equals(c3.y, 0); + + check.patch(UITools, "getScreenBounds", (obj: any) => { + if (obj === c1) { + return { width: 100, height: 51 }; + } else if (obj === c2) { + return { width: 20, height: 7 }; + } else if (obj === c3) { + return { width: 60, height: 11 }; + } else { + return { width: 0, height: 0 }; + } + }); + + builder.distribute("x", 100, 400); + + check.equals(c1.x, 130); + check.equals(c1.y, 0); + check.equals(c2.x, 260); + check.equals(c2.y, 0); + check.equals(c3.x, 310); + check.equals(c3.y, 0); + + builder.distribute("y", 60, 180); + + check.equals(c1.x, 130); + check.equals(c1.y, 73); + check.equals(c2.x, 260); + check.equals(c2.y, 137); + check.equals(c3.x, 310); + check.equals(c3.y, 156); + }) }) } diff --git a/src/ui/common/UIBuilder.ts b/src/ui/common/UIBuilder.ts index 63ebcc7..201ca3c 100644 --- a/src/ui/common/UIBuilder.ts +++ b/src/ui/common/UIBuilder.ts @@ -9,6 +9,7 @@ module TK.SpaceTac.UI { export type UIContainer = Phaser.Group | Phaser.Image export type ShaderValue = number | { x: number, y: number } + export type UIOnOffCallback = (on: boolean) => boolean /** * Text style interface @@ -53,6 +54,17 @@ module TK.SpaceTac.UI { width = 0 } + /** + * Button options + */ + export type UIButtonOptions = { + // Name of the hover picture (by default, the button name, with "-hover" appended) + hover_name?: string + + // Name of the "on" picture (by default, the button name, with "-on" appended) + on_name?: string + } + /** * Main UI builder tool */ @@ -101,11 +113,7 @@ module TK.SpaceTac.UI { * Clear the current container of all component */ clear(): void { - if (this.parent instanceof Phaser.Group) { - this.parent.removeAll(true); - } else { - this.parent.children.forEach(child => (child).destroy()); - } + destroyChildren(this.parent); } /** @@ -147,7 +155,7 @@ module TK.SpaceTac.UI { result.wordWrapWidth = style.width; } if (style.shadow) { - result.setShadow(3, 4, "rgba(0,0,0,0.6)", 6); + result.setShadow(3, 4, "rgba(0,0,0,0.6)", 3); } if (style.stroke_width) { result.stroke = style.stroke_color; @@ -176,24 +184,81 @@ module TK.SpaceTac.UI { } /** - * Add a clickable button + * Add a hoverable and/or clickable button + * + * If an image with "-hover" suffix is found in atlases, it will be used as hover mask (added as button child) */ - button(name: string, x = 0, y = 0, onclick?: Function, tooltip?: string | (() => string)): UIButton { + button(name: string, x = 0, y = 0, onclick?: Function, tooltip?: TooltipFiller, onoffcallback?: UIOnOffCallback, options: UIButtonOptions = {}): UIButton { let info = this.view.getImageInfo(name); - let result = new Phaser.Button(this.game, x, y, info.key, onclick || nop, null, info.frame, info.frame); + let result = new Phaser.Button(this.game, x, y, info.key, undefined, null, info.frame, info.frame); result.name = name; + let clickable = bool(onclick); result.input.useHandCursor = clickable; if (clickable) { UIComponent.setButtonSound(result); } - if (tooltip) { - if (typeof tooltip == "string") { - this.view.tooltip.bindStaticText(result, tooltip); - } else { - this.view.tooltip.bindDynamicText(result, tooltip); + + let onstatus = false; + + if (clickable || tooltip || onoffcallback) { + // On mask + let on_mask: Phaser.Image | null = null; + if (onoffcallback) { + let on_info = this.view.getImageInfo(options.on_name || (name + "-on")); + if (on_info.exists) { + on_mask = new Phaser.Image(this.game, 0, 0, on_info.key, on_info.frame); + on_mask.visible = false; + result.addChild(on_mask); + } + // TODO Find a better way to handle this (extend Button ?) + result.data.onoffcallback = (on: boolean): boolean => { + onstatus = onoffcallback(on); + if (on_mask) { + on_mask.anchor.set(result.anchor.x, result.anchor.y); + this.view.animations.setVisible(on_mask, onstatus, 100); + } + return onstatus; + } } + + // Hover mask + let hover_info = this.view.getImageInfo(options.hover_name || (name + "-hover")); + let hover_mask: Phaser.Image | null = null; + if (hover_info.exists) { + hover_mask = new Phaser.Image(this.game, 0, 0, hover_info.key, hover_info.frame); + hover_mask.visible = false; + result.addChild(hover_mask); + } + + this.view.inputs.setHoverClick(result, + () => { + if (tooltip) { + this.view.tooltip.show(result, tooltip); + } + if (hover_mask) { + hover_mask.anchor.set(result.anchor.x, result.anchor.y); + this.view.animations.show(hover_mask, 100); + } + }, + () => { + if (tooltip) { + this.view.tooltip.hide(); + } + if (hover_mask) { + this.view.animations.hide(hover_mask, 100) + } + }, + () => { + if (onclick) { + onclick(); + } + if (onoffcallback) { + this.switch(result, !onstatus); + } + }, 100); } + this.add(result); return result; } @@ -259,5 +324,52 @@ module TK.SpaceTac.UI { } } } + + /** + * Change the status on/off on a button + * + * Return the final effective status + */ + switch(button: UIButton, on: boolean): boolean { + if (button.data.onoffcallback) { + return button.data.onoffcallback(on); + } else { + return false; + } + } + + /** + * Select a single button inside the container, toggle its "on" status, and toggle all other button to "off" + * + * This is the equivalent of radio buttons + */ + select(button: UIButton): void { + this.parent.children.forEach(child => { + if (child instanceof Phaser.Button && child.data.onoffcallback && child !== button) { + child.data.onoffcallback(false); + } + }); + this.switch(button, true); + } + + /** + * Evenly distribute the children of this builder along an axis + */ + distribute(along: "x" | "y", start: number, end: number): void { + let sizes = this.parent.children.map(child => { + if (child instanceof Phaser.Image || child instanceof Phaser.Sprite || child instanceof Phaser.Group) { + return UITools.getScreenBounds(child)[along == "x" ? "width" : "height"]; + } else { + return 0; + } + }); + let spacing = ((end - start) - sum(sizes)) / (sizes.length + 1); + let offset = start; + this.parent.children.forEach((child, idx) => { + offset += spacing; + child[along] = Math.round(offset); + offset += sizes[idx]; + }); + } } } diff --git a/src/ui/common/UITools.spec.ts b/src/ui/common/UITools.spec.ts index d905309..42f0134 100644 --- a/src/ui/common/UITools.spec.ts +++ b/src/ui/common/UITools.spec.ts @@ -18,6 +18,70 @@ module TK.SpaceTac.UI.Specs { check.equals(parent.children.length, 0); }); + test.case("gets the screen boundaries of an object", check => { + let parent = testgame.view.add.group(); + + check.in("empty", check => { + check.containing(UITools.getScreenBounds(parent), { x: 0, y: 0, width: 0, height: 0 }, "parent"); + }); + + let child1 = testgame.view.add.graphics(10, 20, parent); + + check.in("empty child", check => { + check.containing(UITools.getScreenBounds(parent), { x: 0, y: 0, width: 0, height: 0 }, "parent"); + check.containing(UITools.getScreenBounds(child1), { x: 0, y: 0, width: 0, height: 0 }, "child1"); + }); + + child1.drawRect(20, 30, 40, 45); + + check.in("rectangle child", check => { + check.containing(UITools.getScreenBounds(parent), { x: 30, y: 50, width: 40, height: 45 }, "parent"); + check.containing(UITools.getScreenBounds(child1), { x: 30, y: 50, width: 40, height: 45 }, "child1"); + }); + + child1.scale.set(0.5, 0.2); + + check.in("scaled child", check => { + check.containing(UITools.getScreenBounds(parent), { x: 20, y: 26, width: 20, height: 9 }, "parent"); + check.containing(UITools.getScreenBounds(child1), { x: 20, y: 26, width: 20, height: 9 }, "child1"); + }); + + let child2 = testgame.view.add.graphics(-4, -15); + child1.addChild(child2); + + check.in("sub child empty", check => { + check.containing(UITools.getScreenBounds(parent), { x: 20, y: 26, width: 20, height: 9 }, "parent"); + check.containing(UITools.getScreenBounds(child1), { x: 20, y: 26, width: 20, height: 9 }, "child1"); + check.containing(UITools.getScreenBounds(child2), { x: 0, y: 0, width: 0, height: 0 }, "child2"); + }); + + child2.drawRect(0, 0, 10, 5); + + check.in("sub child rectangle", check => { + check.containing(UITools.getScreenBounds(parent), { x: 8, y: 17, width: 32, height: 18 }, "parent"); + check.containing(UITools.getScreenBounds(child1), { x: 8, y: 17, width: 32, height: 18 }, "child1"); + check.containing(UITools.getScreenBounds(child2), { x: 8, y: 17, width: 5, height: 1 }, "child2"); + }); + + let child3 = testgame.view.add.graphics(50, 51, parent); + + check.in("second child empty", check => { + check.containing(UITools.getScreenBounds(parent), { x: 8, y: 17, width: 42, height: 34 }, "parent"); + check.containing(UITools.getScreenBounds(child1), { x: 8, y: 17, width: 32, height: 18 }, "child1"); + check.containing(UITools.getScreenBounds(child2), { x: 8, y: 17, width: 5, height: 1 }, "child2"); + check.containing(UITools.getScreenBounds(child3), { x: 0, y: 0, width: 0, height: 0 }, "child3"); + }); + + child3.drawRect(1, 1, 1, 1); + + check.in("second child pixel", check => { + check.containing(UITools.getScreenBounds(parent), { x: 8, y: 17, width: 44, height: 36 }, "parent"); + check.containing(UITools.getScreenBounds(child1), { x: 8, y: 17, width: 32, height: 18 }, "child1"); + check.containing(UITools.getScreenBounds(child2), { x: 8, y: 17, width: 5, height: 1 }, "child2"); + check.containing(UITools.getScreenBounds(child3), { x: 51, y: 52, width: 1, height: 1 }, "child3"); + }); + }); + test.case("keeps objects inside bounds", check => { let image = testgame.view.add.graphics(150, 100); image.beginFill(0xff0000); @@ -29,6 +93,22 @@ module TK.SpaceTac.UI.Specs { check.equals(image.x, 100); check.equals(image.y, 100); }); + + test.case("draws a rectangle background around content", check => { + let group = testgame.view.add.group(); + + let content = testgame.view.add.graphics(0, 0, group); + content.drawRect(120, 90, 30, 20); + + let background = testgame.view.add.graphics(0, 0); + + let result = UITools.drawBackground(group, background, 3); + check.equals(result, [36, 26]); + + content.drawCircle(0, 0, 50); + result = UITools.drawBackground(group, background, 3); + check.equals(result, [181, 141]); + }); }); test.case("normalizes angles", check => { diff --git a/src/ui/common/UITools.ts b/src/ui/common/UITools.ts index 3735cf0..2dbf1bd 100644 --- a/src/ui/common/UITools.ts +++ b/src/ui/common/UITools.ts @@ -17,6 +17,24 @@ module TK.SpaceTac.UI { // Common UI tools functions export class UITools { + /** + * Get the screen bounding rectanle of a displayed object + * + * This is a workaround for bugs in getLocalBounds and getBounds + */ + static getScreenBounds(obj: Phaser.Image | Phaser.Sprite | Phaser.Group | Phaser.Graphics): IBounded { + obj.updateTransform(); + + let rects: IBounded[] = [obj.getBounds()]; + obj.children.forEach(child => { + if (child instanceof Phaser.Image || child instanceof Phaser.Sprite || child instanceof Phaser.Group || child instanceof Phaser.Graphics) { + rects.push(UITools.getScreenBounds(child)); + } + }); + + return rects.reduce(UITools.unionRects, { x: 0, y: 0, width: 0, height: 0 }); + } + /** * Get the position of an object, adjusted to remain inside a container */ @@ -52,7 +70,41 @@ module TK.SpaceTac.UI { } } - // Constraint an angle in radians the ]-pi;pi] range. + /** + * Compare two rectangles + */ + static compareRects(rct1: IBounded, rct2: IBounded) { + return rct1.x == rct2.x && rct1.y == rct2.y && rct1.width == rct2.width && rct1.height == rct2.height; + } + + /** + * Returns the bounding rectangle containing two other rectangles + */ + static unionRects(rct1: IBounded, rct2: IBounded): IBounded { + let result: IBounded; + if (rct1.width == 0 || rct1.height == 0) { + result = rct2; + } else if (rct2.width == 0 || rct2.height == 0) { + result = rct1; + } else { + let xmin = Math.min(rct1.x, rct2.x); + let xmax = Math.max(rct1.x + rct1.width, rct2.x + rct2.width); + let ymin = Math.min(rct1.y, rct2.y); + let ymax = Math.max(rct1.y + rct1.height, rct2.y + rct2.height); + + result = { x: xmin, y: ymin, width: xmax - xmin, height: ymax - ymin }; + } + + if (result.width == 0 || result.height == 0) { + return { x: 0, y: 0, width: 0, height: 0 }; + } else { + return result; + } + } + + /** + * Constraint an angle in radians the ]-pi;pi] range. + */ static normalizeAngle(angle: number): number { angle = angle % (2 * Math.PI); if (angle <= -Math.PI) { @@ -81,24 +133,32 @@ module TK.SpaceTac.UI { } /** - * Draw a background around a container - * - * Content's top-left corner is supposed to be at (0,0) + * Draw a background around a content */ static drawBackground(content: Phaser.Group | Phaser.Text, background: Phaser.Graphics, border = 6): [number, number] { - let bounds = content.getBounds(); - let width = bounds.width + 2 * border; - let height = bounds.height + 2 * border; + if (content.parent === background.parent) { + let bounds = content.getLocalBounds(); - if (background.width != width || background.height != height) { - background.clear(); - background.lineStyle(2, 0x404450); - background.beginFill(0x202225, 0.9); - background.drawRect(-border, -border, width, height); - background.endFill(); + let x = bounds.x - border; + let y = bounds.y - border; + let width = bounds.width + 2 * border; + let height = bounds.height + 2 * border; + + if (!(background.width && background.data.bg_bounds && UITools.compareRects(background.data.bg_bounds, bounds))) { + background.clear(); + background.lineStyle(2, 0x404450); + background.beginFill(0x202225, 0.9); + background.drawRect(x, y, width, height); + background.endFill(); + + background.data.bg_bounds = copy(bounds); + } + + return [width, height]; + } else { + console.error("Cannot draw background with different parents", content, background); + return [0, 0]; } - - return [width, height]; } } } diff --git a/src/ui/map/MissionsDialog.spec.ts b/src/ui/map/MissionsDialog.spec.ts index 7362f5e..9f8695f 100644 --- a/src/ui/map/MissionsDialog.spec.ts +++ b/src/ui/map/MissionsDialog.spec.ts @@ -34,11 +34,10 @@ module TK.SpaceTac.UI.Specs { mission = new Mission(universe); mission.title = "Do not do evil"; mission.setDifficulty(MissionDifficulty.easy, 1); - mission.reward = new Equipment(); - mission.reward.name = "Boy Scout Cap"; + mission.reward = 3500; shop_missions.push(mission); missions.refresh(); - checkTexts(missions, ["Proposed jobs", "Save the universe!", "Hard - Reward: 15000 zotys", "Do not do evil", "Easy - Reward: Boy Scout Cap Mk1"]); + checkTexts(missions, ["Proposed jobs", "Save the universe!", "Hard - Reward: 15000 zotys", "Do not do evil", "Easy - Reward: 3500 zotys"]); mission = new Mission(universe); mission.title = "Collect some money"; @@ -46,7 +45,7 @@ module TK.SpaceTac.UI.Specs { player.missions.addSecondary(mission, player.fleet); missions.refresh(); checkTexts(missions, ["Active jobs", "Collect some money", "Normal - Reward: -", - "Proposed jobs", "Save the universe!", "Hard - Reward: 15000 zotys", "Do not do evil", "Easy - Reward: Boy Scout Cap Mk1"]); + "Proposed jobs", "Save the universe!", "Hard - Reward: 15000 zotys", "Do not do evil", "Easy - Reward: 3500 zotys"]); mission = new Mission(universe, undefined, true); mission.title = "Kill the villain"; @@ -54,7 +53,7 @@ module TK.SpaceTac.UI.Specs { player.missions.main = mission; missions.refresh(); checkTexts(missions, ["Active jobs", "Collect some money", "Normal - Reward: -", - "Proposed jobs", "Save the universe!", "Hard - Reward: 15000 zotys", "Do not do evil", "Easy - Reward: Boy Scout Cap Mk1"]); + "Proposed jobs", "Save the universe!", "Hard - Reward: 15000 zotys", "Do not do evil", "Easy - Reward: 3500 zotys"]); }); }); } diff --git a/src/ui/map/StarSystemDisplay.ts b/src/ui/map/StarSystemDisplay.ts index af1f1a3..283bb5c 100644 --- a/src/ui/map/StarSystemDisplay.ts +++ b/src/ui/map/StarSystemDisplay.ts @@ -147,7 +147,7 @@ module TK.SpaceTac.UI { let factor = (zoom == 2) ? 1 : (zoom == 1 ? 5 : 15); this.view.tweens.create(this.label.scale).to({ x: factor, y: factor }, 500, Phaser.Easing.Cubic.InOut).start(); - let position = (zoom == 2) ? { x: -560, y: 440 } : { x: 0, y: (zoom == 1 ? 180 : 100) * factor }; + let position = (zoom == 2) ? { x: -680, y: 440 } : { x: 0, y: (zoom == 1 ? 180 : 100) * factor }; this.view.tweens.create(this.label.position).to(position, 500, Phaser.Easing.Cubic.InOut).start(); } } diff --git a/src/ui/map/UniverseMapView.ts b/src/ui/map/UniverseMapView.ts index 3abd824..4405bba 100644 --- a/src/ui/map/UniverseMapView.ts +++ b/src/ui/map/UniverseMapView.ts @@ -107,26 +107,13 @@ module TK.SpaceTac.UI { this.missions.setPosition(20, 720); this.missions.moveToLayer(this.layer_overlay); - this.zoom_in = new Phaser.Button(this.game, 1540, 172, "map-buttons", () => this.setZoom(this.zoom + 1), undefined, 3, 0); - this.zoom_in.anchor.set(0.5, 0.5); - UIComponent.setButtonSound(this.zoom_in); - this.layer_overlay.add(this.zoom_in); - this.tooltip.bindStaticText(this.zoom_in, "Zoom in"); - this.zoom_out = new Phaser.Button(this.game, 1540, 958, "map-buttons", () => this.setZoom(this.zoom - 1), undefined, 4, 1); - this.zoom_out.anchor.set(0.5, 0.5); - UIComponent.setButtonSound(this.zoom_out); - this.layer_overlay.add(this.zoom_out); - this.tooltip.bindStaticText(this.zoom_out, "Zoom out"); - this.button_options = new Phaser.Button(this.game, 1436, 69, "map-buttons", () => this.showOptions(), undefined, 5, 2); - this.button_options.angle = -90; - this.button_options.anchor.set(0.5, 0.5); - UIComponent.setButtonSound(this.button_options); - this.layer_overlay.add(this.button_options); - this.tooltip.bindStaticText(this.button_options, "Game options"); + builder.in(this.layer_overlay, builder => { + this.zoom_in = builder.button("map-zoom-in", 1787, 54, () => this.setZoom(this.zoom + 1), "Zoom in"); + this.zoom_out = builder.button("map-zoom-out", 1787, 840, () => this.setZoom(this.zoom - 1), "Zoom out"); + this.button_options = builder.button("map-options", 1628, 0, () => this.showOptions(), "Game options"); + }); - this.character_sheet = new CharacterSheet(this, this.getWidth() - 307); - this.character_sheet.show(this.player.fleet.ships[0], false); - this.character_sheet.hide(false); + this.character_sheet = new CharacterSheet(this); this.layer_overlay.add(this.character_sheet); this.conversation = new MissionConversationDisplay(this); @@ -286,7 +273,7 @@ module TK.SpaceTac.UI { this.setLinksAlpha(0.6, duration); this.zoom = 1; } else { - this.setCamera(current_star.x, current_star.y, current_star.radius * 2, duration); + this.setCamera(current_star.x - current_star.radius * 0.3, current_star.y, current_star.radius * 2, duration); this.setLinksAlpha(0.2, duration); this.zoom = 2; } @@ -323,7 +310,6 @@ module TK.SpaceTac.UI { openShop(): void { let location = this.session.getLocation(); if (this.interactive && location && location.shop) { - this.character_sheet.setShop(location.shop); this.character_sheet.show(this.player.fleet.ships[0]); } }