From d5b37ff850003e875eab333858ba7c888ec141bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Wed, 19 Apr 2017 00:55:59 +0200 Subject: [PATCH] character sheet: Added equipment description --- README.md | 4 +- TODO | 1 - .../{basicforcefield.png => forcefield.png} | Bin ...{basicpowercore.png => nuclearreactor.png} | Bin ...onventionalengine.png => rocketengine.png} | Bin src/core/Battle.spec.ts | 1 + src/core/Equipment.spec.ts | 19 ++++- src/core/Equipment.ts | 76 ++++++++++++++---- src/core/LootTemplate.ts | 23 +++--- src/core/Ship.ts | 2 - src/core/TestTools.ts | 6 +- src/core/actions/BaseAction.ts | 6 +- src/core/actions/DeployDroneAction.ts | 13 ++- src/core/actions/FireWeaponAction.ts | 12 ++- src/core/actions/MoveAction.ts | 4 + src/core/ai/BullyAI.spec.ts | 1 + src/core/effects/AttributeEffect.spec.ts | 24 ++++++ src/core/effects/AttributeEffect.ts | 5 ++ src/core/effects/DamageEffect.ts | 2 +- ...cForceField.spec.ts => ForceField.spec.ts} | 4 +- .../{BasicForceField.ts => ForceField.ts} | 4 +- src/core/equipments/GatlingGun.ts | 2 +- src/core/equipments/IronHull.ts | 2 +- ...werCore.spec.ts => NuclearReactor.spec.ts} | 4 +- .../{BasicPowerCore.ts => NuclearReactor.ts} | 4 +- src/core/equipments/PowerDepleter.ts | 2 +- src/core/equipments/RepairDrone.ts | 2 +- ...nalEngine.spec.ts => RocketEngine.spec.ts} | 4 +- ...{ConventionalEngine.ts => RocketEngine.ts} | 5 +- src/core/equipments/SubMunitionMissile.ts | 2 +- src/ui/Preload.ts | 6 +- src/ui/battle/ActionTooltip.ts | 2 +- src/ui/character/CharacterEquipment.ts | 14 +++- src/ui/common/Tooltip.ts | 2 +- 34 files changed, 179 insertions(+), 79 deletions(-) rename out/assets/images/equipment/{basicforcefield.png => forcefield.png} (100%) rename out/assets/images/equipment/{basicpowercore.png => nuclearreactor.png} (100%) rename out/assets/images/equipment/{conventionalengine.png => rocketengine.png} (100%) rename src/core/equipments/{BasicForceField.spec.ts => ForceField.spec.ts} (91%) rename src/core/equipments/{BasicForceField.ts => ForceField.ts} (59%) rename src/core/equipments/{BasicPowerCore.spec.ts => NuclearReactor.spec.ts} (94%) rename src/core/equipments/{BasicPowerCore.ts => NuclearReactor.ts} (71%) rename src/core/equipments/{ConventionalEngine.spec.ts => RocketEngine.spec.ts} (92%) rename src/core/equipments/{ConventionalEngine.ts => RocketEngine.ts} (59%) diff --git a/README.md b/README.md index 8f5de6b..eab3390 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,8 @@ After making changes to sources, you need to recompile: ## Credits -* **[Lemaire Michael](https://thunderk.net/)** - Code and graphics -* **Forgo Nicolas** - Ship models +* **[Michaƫl Lemaire](https://thunderk.net/)** - Code and graphics +* **Nicolas Forgo** - Ship models * **[Phaser](http://phaser.io)** - Game engine * **[Kevin MacLeod](http://www.incompetech.com/)** - Musics diff --git a/TODO b/TODO index 93f2502..ec050f1 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,4 @@ * UI: Use a common component class, and a layer abstraction -* Character sheet: add tooltips (on values, slots and equipments) * Character sheet: add initial character creation * Character sheet: disable interaction during battle (except for loot screen) * Character sheet: paginate loot and shop items diff --git a/out/assets/images/equipment/basicforcefield.png b/out/assets/images/equipment/forcefield.png similarity index 100% rename from out/assets/images/equipment/basicforcefield.png rename to out/assets/images/equipment/forcefield.png diff --git a/out/assets/images/equipment/basicpowercore.png b/out/assets/images/equipment/nuclearreactor.png similarity index 100% rename from out/assets/images/equipment/basicpowercore.png rename to out/assets/images/equipment/nuclearreactor.png diff --git a/out/assets/images/equipment/conventionalengine.png b/out/assets/images/equipment/rocketengine.png similarity index 100% rename from out/assets/images/equipment/conventionalengine.png rename to out/assets/images/equipment/rocketengine.png diff --git a/src/core/Battle.spec.ts b/src/core/Battle.spec.ts index 3cc438d..663b623 100644 --- a/src/core/Battle.spec.ts +++ b/src/core/Battle.spec.ts @@ -77,6 +77,7 @@ module TS.SpaceTac { expect(battle.playing_ship_index).toBeNull(); // Force play order + iforeach(battle.iships(), ship => ship.setAttribute("initiative", 1)); var gen = new SkewedRandomGenerator([0.1, 0.2, 0.0]); battle.throwInitiative(gen); diff --git a/src/core/Equipment.spec.ts b/src/core/Equipment.spec.ts index a230307..fba4865 100644 --- a/src/core/Equipment.spec.ts +++ b/src/core/Equipment.spec.ts @@ -1,5 +1,16 @@ module TS.SpaceTac.Specs { describe("Equipment", () => { + it("generates a full name", function () { + let equipment = new Equipment(SlotType.Weapon, "rayofdeath"); + expect(equipment.getFullName()).toEqual("Level 1 rayofdeath"); + + equipment.name = "Ray of Death"; + expect(equipment.getFullName()).toEqual("Level 1 Ray of Death"); + + equipment.quality = EquipmentQuality.LEGENDARY; + expect(equipment.getFullName()).toEqual("Level 1 Legendary Ray of Death"); + }); + it("checks capabilities requirements", function () { var equipment = new Equipment(); var ship = new Ship(); @@ -34,20 +45,20 @@ module TS.SpaceTac.Specs { it("generates a description of the effects", function () { let equipment = new Equipment(); - expect(equipment.getActionDescription()).toEqual("does nothing"); + expect(equipment.getEffectsDescription()).toEqual("does nothing"); let action = new FireWeaponAction(equipment, 1, 200, 0, [ new DamageEffect(50) ]); equipment.action = action; - expect(equipment.getActionDescription()).toEqual("- Fire: 50 damage on target"); + expect(equipment.getEffectsDescription()).toEqual("Fire (power usage 1, max range 200km):\n- do 50 damage on target"); action.blast = 20; - expect(equipment.getActionDescription()).toEqual("- Fire: 50 damage in 20km radius"); + expect(equipment.getEffectsDescription()).toEqual("Fire (power usage 1, max range 200km):\n- do 50 damage in 20km radius"); action.blast = 0; action.effects.push(new StickyEffect(new AttributeLimitEffect("shield_capacity", 200), 3)); - expect(equipment.getActionDescription()).toEqual("- Fire: 50 damage on target\n- Fire: limit shield capacity to 200 for 3 turns on target"); + expect(equipment.getEffectsDescription()).toEqual("Fire (power usage 1, max range 200km):\n- do 50 damage on target\n- limit shield capacity to 200 for 3 turns on target"); }); it("gets a minimal level, based on skills requirements", function () { diff --git a/src/core/Equipment.ts b/src/core/Equipment.ts index 6d62f44..c8b9e66 100644 --- a/src/core/Equipment.ts +++ b/src/core/Equipment.ts @@ -1,35 +1,56 @@ module TS.SpaceTac { + /** + * Quality of loot. + */ + export enum EquipmentQuality { + WEAK, + COMMON, + FINE, + PREMIUM, + LEGENDARY + } + // Piece of equipment to attach in slots export class Equipment { // Type of slot this equipment can fit in - slot_type: SlotType | null; + slot_type: SlotType | null // Actual slot this equipment is attached to - attached_to: Slot | null = null; + attached_to: Slot | null = null // Identifiable equipment code (may be used by UI to customize visual effects) - code: string; + code: string // Equipment name - name: string; + name: string + + // Equipment generic description + description: string + + // Indicative equipment level + level = 1 + + // Indicative equipment quality + quality = EquipmentQuality.COMMON // Minimum skills to be able to equip this - requirements: { [key: string]: number }; + requirements: { [key: string]: number } // Permanent effects on the ship that equips this - effects: BaseEffect[]; + effects: BaseEffect[] // Action available when equipped - action: BaseAction; + action: BaseAction // Usage made of this equipment (will lower the sell price) - usage: number; + usage: number // Basic constructor constructor(slot: SlotType | null = null, code = "equipment") { this.slot_type = slot; this.code = code; this.name = code; + this.description = ""; this.requirements = {}; this.effects = []; this.action = new BaseAction("nothing", "Do nothing", false); @@ -39,6 +60,28 @@ module TS.SpaceTac { return this.attached_to ? `${this.attached_to.ship.name} - ${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 `Level ${this.level} ${name}`; + } + + /** + * Get the full textual description for this equipment (without the full name). + */ + getFullDescription(): string { + let description = this.getEffectsDescription(); + if (this.description) { + description += "\n\n" + this.description; + } + return description; + } + /** * Get the minimum level at which the requirements in skill may be fulfilled. * @@ -83,18 +126,19 @@ module TS.SpaceTac { /** * Get a human readable description of the effects of this equipment */ - getActionDescription(): string { + getEffectsDescription(): string { let parts: string[] = []; - this.effects.forEach(effect => { - parts.push(`- Equip: ${effect.getDescription()}`); - }); + if (this.effects.length > 0) { + parts.push(["When equipped:"].concat(this.effects.map(effect => "- " + effect.getDescription())).join("\n")); + } - this.action.getEffectsDescription().forEach(desc => { - parts.push(`- ${this.action.name}: ${desc}`); - }); + let action_desc = this.action.getEffectsDescription(); + if (action_desc != "") { + parts.push(action_desc); + } - return parts.length > 0 ? parts.join("\n") : "does nothing"; + return parts.length > 0 ? parts.join("\n\n") : "does nothing"; } } } diff --git a/src/core/LootTemplate.ts b/src/core/LootTemplate.ts index 5db94db..d3e9cd5 100644 --- a/src/core/LootTemplate.ts +++ b/src/core/LootTemplate.ts @@ -1,14 +1,4 @@ module TS.SpaceTac { - /** - * Quality of loot. - */ - export enum LootQuality { - WEAK, - COMMON, - FINE, - PREMIUM - } - /** * A leveled value is either a number multiplied by the level, or a custom iterator */ @@ -90,29 +80,34 @@ module TS.SpaceTac { */ export class LootTemplate { // Type of slot this equipment will fit in - slot: SlotType; + slot: SlotType // Base name that will be given to generated equipment - name: string; + name: string + + // Generic description of the equipment + description: string // Modifiers applied to obtain the "common" equipment, based on level protected base_modifiers: ((equipment: Equipment, level: number) => void)[]; - constructor(slot: SlotType, name: string) { + constructor(slot: SlotType, name: string, description = "") { this.slot = slot; this.name = name; + this.description = description; this.base_modifiers = []; } /** * Generate a new equipment of a given level and quality */ - generate(level: number, quality: LootQuality = LootQuality.COMMON, random = RandomGenerator.global): Equipment { + generate(level: number, quality = EquipmentQuality.COMMON, random = RandomGenerator.global): Equipment { let result = new Equipment(); result.slot_type = this.slot; result.code = (this.name || "").toLowerCase().replace(/ /g, ""); result.name = this.name; + result.description = this.description; this.base_modifiers.forEach(modifier => modifier(result, level)); diff --git a/src/core/Ship.ts b/src/core/Ship.ts index 0a3a071..899f040 100644 --- a/src/core/Ship.ts +++ b/src/core/Ship.ts @@ -108,8 +108,6 @@ module TS.SpaceTac { this.sticky_effects = []; this.slots = []; - this.attributes.initiative.set(1); // TODO Should not be needed - this.arena_x = 0; this.arena_y = 0; this.arena_angle = 0; diff --git a/src/core/TestTools.ts b/src/core/TestTools.ts index 207cd94..ce37f7b 100644 --- a/src/core/TestTools.ts +++ b/src/core/TestTools.ts @@ -37,7 +37,7 @@ module TS.SpaceTac { // Add an engine, allowing a ship to move *distance*, for each action points static addEngine(ship: Ship, distance: number): Equipment { - var equipment = this.getOrGenEquipment(ship, SlotType.Engine, new Equipments.ConventionalEngine(), true); + var equipment = this.getOrGenEquipment(ship, SlotType.Engine, new Equipments.RocketEngine(), true); (equipment.action).distance_per_power = distance; return equipment; } @@ -53,7 +53,7 @@ module TS.SpaceTac { // Set a ship action points, adding/updating an equipment if needed static setShipAP(ship: Ship, points: number, recovery: number = 0): void { - var equipment = this.getOrGenEquipment(ship, SlotType.Power, new Equipments.BasicPowerCore()); + var equipment = this.getOrGenEquipment(ship, SlotType.Power, new Equipments.NuclearReactor()); equipment.effects.forEach(effect => { if (effect instanceof AttributeEffect) { @@ -74,7 +74,7 @@ module TS.SpaceTac { // Set a ship hull and shield points, adding/updating an equipment if needed static setShipHP(ship: Ship, hull_points: number, shield_points: number): void { var armor = TestTools.getOrGenEquipment(ship, SlotType.Hull, new Equipments.IronHull()); - var shield = TestTools.getOrGenEquipment(ship, SlotType.Shield, new Equipments.BasicForceField()); + var shield = TestTools.getOrGenEquipment(ship, SlotType.Shield, new Equipments.ForceField()); armor.effects.forEach(effect => { if (effect instanceof AttributeEffect) { diff --git a/src/core/actions/BaseAction.ts b/src/core/actions/BaseAction.ts index bf0a891..24f33a4 100644 --- a/src/core/actions/BaseAction.ts +++ b/src/core/actions/BaseAction.ts @@ -119,10 +119,10 @@ module TS.SpaceTac { } /** - * Get description of effects (one line per effect) + * Get textual description of effects */ - getEffectsDescription(): string[] { - return []; + getEffectsDescription(): string { + return ""; } } } diff --git a/src/core/actions/DeployDroneAction.ts b/src/core/actions/DeployDroneAction.ts index c5b4bf9..70b5212 100644 --- a/src/core/actions/DeployDroneAction.ts +++ b/src/core/actions/DeployDroneAction.ts @@ -65,9 +65,16 @@ module TS.SpaceTac { } } - getEffectsDescription(): string[] { - let desc = `drone for ${this.lifetime} turn${this.lifetime > 1 ? "s" : ""}, in ${this.deploy_distance}km range, with ${this.effect_radius}km radius effects`; - return [desc].concat(this.effects.map(effect => effect.getDescription())); + getEffectsDescription(): string { + let desc = `Deploy drone for ${this.lifetime} turn${this.lifetime > 1 ? "s" : ""} (power usage ${this.power}, max range ${this.deploy_distance}km)`; + let effects = this.effects.map(effect => { + let suffix = `for ships in ${this.effect_radius}km radius`; + if (effect instanceof StickyEffect) { + suffix = `for ${effect.duration} turn${effect.duration > 1 ? "s" : ""} ${suffix}`; + } + return "- " + effect.getDescription() + " " + suffix; + }); + return `${desc}:\n${effects.join("\n")}`; } } } diff --git a/src/core/actions/FireWeaponAction.ts b/src/core/actions/FireWeaponAction.ts index 3f97ca4..23b6b1a 100644 --- a/src/core/actions/FireWeaponAction.ts +++ b/src/core/actions/FireWeaponAction.ts @@ -92,14 +92,20 @@ module TS.SpaceTac { effects.forEach(([ship, effect]) => effect.applyOnShip(ship)); } - getEffectsDescription(): string[] { - return this.effects.map(effect => { + getEffectsDescription(): string { + if (this.effects.length == 0) { + return ""; + } + + let desc = `${this.name} (power usage ${this.power}, max range ${this.range}km)`; + let effects = this.effects.map(effect => { let suffix = this.blast ? `in ${this.blast}km radius` : "on target"; if (effect instanceof StickyEffect) { suffix = `for ${effect.duration} turn${effect.duration > 1 ? "s" : ""} ${suffix}`; } - return effect.getDescription() + " " + suffix; + return "- " + effect.getDescription() + " " + suffix; }); + return `${desc}:\n${effects.join("\n")}`; } } } diff --git a/src/core/actions/MoveAction.ts b/src/core/actions/MoveAction.ts index c4c95da..335558a 100644 --- a/src/core/actions/MoveAction.ts +++ b/src/core/actions/MoveAction.ts @@ -76,5 +76,9 @@ module TS.SpaceTac { protected customApply(ship: Ship, target: Target) { ship.moveTo(target.x, target.y); } + + getEffectsDescription(): string { + return `Move: ${this.distance_per_power}km per power point`; + } } } diff --git a/src/core/ai/BullyAI.spec.ts b/src/core/ai/BullyAI.spec.ts index 43346e9..ab273bc 100644 --- a/src/core/ai/BullyAI.spec.ts +++ b/src/core/ai/BullyAI.spec.ts @@ -5,6 +5,7 @@ module TS.SpaceTac.Specs { battle.fleets[0].addShip(new Ship(null, "0-0")); battle.fleets[1].addShip(new Ship(null, "1-0")); battle.fleets[1].addShip(new Ship(null, "1-1")); + iforeach(battle.iships(), ship => ship.setAttribute("initiative", 1)); var random = new SkewedRandomGenerator([0, 0.5, 1]); battle.throwInitiative(random); diff --git a/src/core/effects/AttributeEffect.spec.ts b/src/core/effects/AttributeEffect.spec.ts index e69de29..c347289 100644 --- a/src/core/effects/AttributeEffect.spec.ts +++ b/src/core/effects/AttributeEffect.spec.ts @@ -0,0 +1,24 @@ +module TS.SpaceTac { + describe("AttributeEffect", function () { + it("is not applied directly", function () { + let ship = new Ship(); + expect(ship.getAttribute("initiative")).toBe(0); + + let effect = new AttributeEffect("initiative", 20); + effect.applyOnShip(ship); + expect(ship.getAttribute("initiative")).toBe(0); + + ship.sticky_effects.push(new StickyEffect(effect, 2)); + ship.updateAttributes(); + expect(ship.getAttribute("initiative")).toBe(20); + }); + + it("has a description", function () { + let effect = new AttributeEffect("initiative", 12); + expect(effect.getDescription()).toEqual("initiative +12"); + + effect = new AttributeEffect("shield_capacity", -4); + expect(effect.getDescription()).toEqual("shield capacity -4"); + }); + }); +} diff --git a/src/core/effects/AttributeEffect.ts b/src/core/effects/AttributeEffect.ts index 58e9339..2a65918 100644 --- a/src/core/effects/AttributeEffect.ts +++ b/src/core/effects/AttributeEffect.ts @@ -32,5 +32,10 @@ module TS.SpaceTac { getFullCode(): string { return this.code + "-" + this.attrcode; } + + getDescription(): string { + let attrname = SHIP_ATTRIBUTES[this.attrcode].name; + return `${attrname} ${this.value > 0 ? "+" : "-"}${Math.abs(this.value)}`; + } } } diff --git a/src/core/effects/DamageEffect.ts b/src/core/effects/DamageEffect.ts index 9525e56..18cfe72 100644 --- a/src/core/effects/DamageEffect.ts +++ b/src/core/effects/DamageEffect.ts @@ -50,7 +50,7 @@ module TS.SpaceTac { } getDescription(): string { - return `${this.value} damage`; + return `do ${this.value} damage`; } } } diff --git a/src/core/equipments/BasicForceField.spec.ts b/src/core/equipments/ForceField.spec.ts similarity index 91% rename from src/core/equipments/BasicForceField.spec.ts rename to src/core/equipments/ForceField.spec.ts index b52dd34..34fd06d 100644 --- a/src/core/equipments/BasicForceField.spec.ts +++ b/src/core/equipments/ForceField.spec.ts @@ -1,7 +1,7 @@ module TS.SpaceTac.Equipments { - describe("BasicForceField", function () { + describe("ForceField", function () { it("generates equipment based on level", function () { - let template = new BasicForceField(); + let template = new ForceField(); let equipment = template.generate(1); expect(equipment.requirements).toEqual({ "skill_energy": 1 }); diff --git a/src/core/equipments/BasicForceField.ts b/src/core/equipments/ForceField.ts similarity index 59% rename from src/core/equipments/BasicForceField.ts rename to src/core/equipments/ForceField.ts index 12d88ca..e403365 100644 --- a/src/core/equipments/BasicForceField.ts +++ b/src/core/equipments/ForceField.ts @@ -1,9 +1,9 @@ /// module TS.SpaceTac.Equipments { - export class BasicForceField extends LootTemplate { + export class ForceField extends LootTemplate { constructor() { - super(SlotType.Shield, "Basic Force Field"); + super(SlotType.Shield, "Force Field", "A basic force field, generated by radiating waves of compressed energy"); this.setSkillsRequirements({ "skill_energy": 1 }); this.addAttributeEffect("shield_capacity", istep(100, irepeat(50))); diff --git a/src/core/equipments/GatlingGun.ts b/src/core/equipments/GatlingGun.ts index 0424513..eb315bb 100644 --- a/src/core/equipments/GatlingGun.ts +++ b/src/core/equipments/GatlingGun.ts @@ -3,7 +3,7 @@ module TS.SpaceTac.Equipments { export class GatlingGun extends LootTemplate { constructor() { - super(SlotType.Weapon, "Gatling Gun"); + super(SlotType.Weapon, "Gatling Gun", "Mechanical weapon using loads of metal bullets propelled by guided explosions"); this.setSkillsRequirements({ "skill_material": 1 }); this.addFireAction(irepeat(3), irepeat(600), 0, [ diff --git a/src/core/equipments/IronHull.ts b/src/core/equipments/IronHull.ts index 69e78bd..2ba3042 100644 --- a/src/core/equipments/IronHull.ts +++ b/src/core/equipments/IronHull.ts @@ -3,7 +3,7 @@ module TS.SpaceTac.Equipments { export class IronHull extends LootTemplate { constructor() { - super(SlotType.Hull, "Iron Hull"); + super(SlotType.Hull, "Iron Hull", "Protective hull, based on layered iron alloys"); this.setSkillsRequirements({ "skill_material": 1 }); this.addAttributeEffect("hull_capacity", istep(200, irepeat(50))); diff --git a/src/core/equipments/BasicPowerCore.spec.ts b/src/core/equipments/NuclearReactor.spec.ts similarity index 94% rename from src/core/equipments/BasicPowerCore.spec.ts rename to src/core/equipments/NuclearReactor.spec.ts index 80ec32b..098c8aa 100644 --- a/src/core/equipments/BasicPowerCore.spec.ts +++ b/src/core/equipments/NuclearReactor.spec.ts @@ -1,7 +1,7 @@ module TS.SpaceTac.Equipments { - describe("BasicPowerCore", function () { + describe("NuclearReactor", function () { it("generates equipment based on level", function () { - let template = new BasicPowerCore(); + let template = new NuclearReactor(); let equipment = template.generate(1); expect(equipment.requirements).toEqual({ "skill_energy": 1 }); diff --git a/src/core/equipments/BasicPowerCore.ts b/src/core/equipments/NuclearReactor.ts similarity index 71% rename from src/core/equipments/BasicPowerCore.ts rename to src/core/equipments/NuclearReactor.ts index c31c9e3..c48578b 100644 --- a/src/core/equipments/BasicPowerCore.ts +++ b/src/core/equipments/NuclearReactor.ts @@ -1,9 +1,9 @@ /// module TS.SpaceTac.Equipments { - export class BasicPowerCore extends LootTemplate { + export class NuclearReactor extends LootTemplate { constructor() { - super(SlotType.Power, "Basic Power Core"); + super(SlotType.Power, "Nuclear Reactor", "A standard nuclear power core, drawing power from atom fusion cycles"); this.setSkillsRequirements({ "skill_energy": 1 }); this.addAttributeEffect("initiative", istep(1)); diff --git a/src/core/equipments/PowerDepleter.ts b/src/core/equipments/PowerDepleter.ts index 7413150..55f9bac 100644 --- a/src/core/equipments/PowerDepleter.ts +++ b/src/core/equipments/PowerDepleter.ts @@ -3,7 +3,7 @@ module TS.SpaceTac.Equipments { export class PowerDepleter extends LootTemplate { constructor() { - super(SlotType.Weapon, "Power Depleter"); + super(SlotType.Weapon, "Power Depleter", "Direct-hit weapon that creates an energy well near the target, sucking its power surplus"); this.setSkillsRequirements({ "skill_energy": 1 }); this.addFireAction(irepeat(4), istep(500, irepeat(20)), 0, [ diff --git a/src/core/equipments/RepairDrone.ts b/src/core/equipments/RepairDrone.ts index d0a8bfb..a75ba6f 100644 --- a/src/core/equipments/RepairDrone.ts +++ b/src/core/equipments/RepairDrone.ts @@ -6,7 +6,7 @@ module TS.SpaceTac.Equipments { */ export class RepairDrone extends LootTemplate { constructor() { - super(SlotType.Weapon, "Repair Drone"); + super(SlotType.Weapon, "Repair Drone", "Drone able to repair small hull breaches, remotely controlled by human pilots"); this.setSkillsRequirements({ "skill_human": 1 }); this.addDroneAction(irepeat(4), istep(300, irepeat(10)), istep(1, irepeat(0.2)), istep(100, irepeat(10)), [ diff --git a/src/core/equipments/ConventionalEngine.spec.ts b/src/core/equipments/RocketEngine.spec.ts similarity index 92% rename from src/core/equipments/ConventionalEngine.spec.ts rename to src/core/equipments/RocketEngine.spec.ts index 7cb9317..86b1ee9 100644 --- a/src/core/equipments/ConventionalEngine.spec.ts +++ b/src/core/equipments/RocketEngine.spec.ts @@ -1,7 +1,7 @@ module TS.SpaceTac.Equipments { - describe("ConventionalEngine", function () { + describe("Rocket Engine", function () { it("generates equipment based on level", function () { - let template = new ConventionalEngine(); + let template = new RocketEngine(); let equipment = template.generate(1); expect(equipment.requirements).toEqual({ "skill_energy": 1 }); diff --git a/src/core/equipments/ConventionalEngine.ts b/src/core/equipments/RocketEngine.ts similarity index 59% rename from src/core/equipments/ConventionalEngine.ts rename to src/core/equipments/RocketEngine.ts index 52e63a8..f25449c 100644 --- a/src/core/equipments/ConventionalEngine.ts +++ b/src/core/equipments/RocketEngine.ts @@ -1,10 +1,9 @@ /// module TS.SpaceTac.Equipments { - // Equipment: Conventional Engine - export class ConventionalEngine extends LootTemplate { + export class RocketEngine extends LootTemplate { constructor() { - super(SlotType.Engine, "Conventional Engine"); + super(SlotType.Engine, "Rocket Engine", "First-era conventional deep-space engine, based on gas exhausts pushed through a nozzle"); this.setSkillsRequirements({ "skill_energy": 1 }); this.addAttributeEffect("initiative", 1); diff --git a/src/core/equipments/SubMunitionMissile.ts b/src/core/equipments/SubMunitionMissile.ts index 1b3d7fa..477f4c7 100644 --- a/src/core/equipments/SubMunitionMissile.ts +++ b/src/core/equipments/SubMunitionMissile.ts @@ -3,7 +3,7 @@ module TS.SpaceTac.Equipments { export class SubMunitionMissile extends LootTemplate { constructor() { - super(SlotType.Weapon, "SubMunition Missile"); + super(SlotType.Weapon, "SubMunition Missile", "Explosive missile releasing small shelled payloads, that will in turn explode on impact"); this.setSkillsRequirements({ "skill_material": 1 }); this.addFireAction(irepeat(4), istep(500, irepeat(20)), istep(150, irepeat(5)), [ diff --git a/src/ui/Preload.ts b/src/ui/Preload.ts index 0497841..2ba42eb 100644 --- a/src/ui/Preload.ts +++ b/src/ui/Preload.ts @@ -106,9 +106,9 @@ module TS.SpaceTac.UI { this.loadImage("character/price-tag.png"); this.loadImage("character/scroll.png"); this.loadImage("equipment/ironhull.png"); - this.loadImage("equipment/basicforcefield.png"); - this.loadImage("equipment/basicpowercore.png"); - this.loadImage("equipment/conventionalengine.png"); + this.loadImage("equipment/forcefield.png"); + this.loadImage("equipment/nuclearreactor.png"); + this.loadImage("equipment/rocketengine.png"); // Load ships this.loadShip("scout"); diff --git a/src/ui/battle/ActionTooltip.ts b/src/ui/battle/ActionTooltip.ts index 559a3f2..7f5cbde 100644 --- a/src/ui/battle/ActionTooltip.ts +++ b/src/ui/battle/ActionTooltip.ts @@ -58,7 +58,7 @@ module TS.SpaceTac.UI { let cost = action.action.getActionPointsUsage(action.ship, null); this.cost.setText(cost == 0 ? "" : `Cost: ${cost} power`); } - this.description.setText(action.action.equipment ? action.action.equipment.getActionDescription() : ""); + this.description.setText(action.action.equipment ? action.action.equipment.getEffectsDescription() : ""); let position = this.bar.action_icons.indexOf(action); if (action.action instanceof EndTurnAction) { diff --git a/src/ui/character/CharacterEquipment.ts b/src/ui/character/CharacterEquipment.ts index 14b6a4a..ac1c6b8 100644 --- a/src/ui/character/CharacterEquipment.ts +++ b/src/ui/character/CharacterEquipment.ts @@ -32,7 +32,6 @@ module TS.SpaceTac.UI { sheet: CharacterSheet item: Equipment container: CharacterEquipmentContainer - tooltip: string price: number constructor(sheet: CharacterSheet, equipment: Equipment, container: CharacterEquipmentContainer) { @@ -42,7 +41,6 @@ module TS.SpaceTac.UI { this.sheet = sheet; this.item = equipment; this.container = container; - this.tooltip = equipment.name; this.price = 0; this.container.addEquipment(this, null, false); @@ -52,8 +50,7 @@ module TS.SpaceTac.UI { this.setupDragDrop(sheet); this.snapToContainer(); - // TODO better tooltip (with equipment characteristics) - sheet.view.tooltip.bindDynamicText(this, () => this.tooltip); + sheet.view.tooltip.bind(this, container => this.fillTooltip(container)); } /** @@ -143,5 +140,14 @@ module TS.SpaceTac.UI { } } } + + /** + * Fill a tooltip with equipment data + */ + fillTooltip(container: Phaser.Group): boolean { + container.add(new Phaser.Text(container.game, 0, 0, this.item.getFullName(), { font: "bold 20pt Arial", fill: "#cccccc" })); + container.add(new Phaser.Text(container.game, 0, 40, this.item.getFullDescription(), { font: "18pt Arial", fill: "#cccccc" })); + return true; + } } } diff --git a/src/ui/common/Tooltip.ts b/src/ui/common/Tooltip.ts index 74d95c7..9ce5acc 100644 --- a/src/ui/common/Tooltip.ts +++ b/src/ui/common/Tooltip.ts @@ -30,7 +30,7 @@ module TS.SpaceTac.UI { let ttbounds = this.container.getBounds(); let background = new Phaser.Graphics(this.container.game, 0, 0); this.container.add(background); - background.beginFill(0x202225, 0.8); + background.beginFill(0x202225, 0.9); background.drawRect(-10, -10, ttbounds.width + 20, ttbounds.height + 20); background.endFill(); this.container.sendToBack(background);