diff --git a/TODO.md b/TODO.md index 299dd80..826ff41 100644 --- a/TODO.md +++ b/TODO.md @@ -64,7 +64,6 @@ Battle Ships models and equipments --------------------------- -* Smooth the price depreciation in battles, it's too high when first using equipments * 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) @@ -86,6 +85,7 @@ Artificial Intelligence * Abandon fight if the AI judges there is no hope of victory * Add combination of random small move and actual maneuver, as producer * New duel page with producers/evaluators tweaking +* Prototype of evolving AI Common UI --------- @@ -121,6 +121,7 @@ Postponed * Secondary story arcs * Replays * Multiplayer/co-op +* Puzzle mode * Formation or deployment phase * Add ship personality (with icons to identify?), with reaction dialogs * Hide enemy information (shield, hull, weapons), until they are in play, or until a "spy" effect is used diff --git a/spacetac b/spacetac index d27948a..d2fd1ec 100755 --- a/spacetac +++ b/spacetac @@ -1,5 +1,5 @@ #!/bin/bash -# Main build/run tool for SpaceTac +# Main build/run tool # REQUIRES yarn # If yarn is not found, python3 may be used to create a local node.js environment with yarn in it, and use it @@ -13,7 +13,7 @@ else dir=$(dirname $0) test -x "${dir}/.env/bin/nodeenv" || ( virtualenv -p python3 "${dir}/.env" && "${dir}/.env/bin/pip" install --upgrade nodeenv ) - test -e "${dir}/.env/node/bin/activate" || "${dir}/.env/bin/nodeenv" --node=6.11.1 --force "${dir}/.env/node" - test -e "${dir}/.env/node/bin/yarn" || "${dir}/.env/node/bin/shim" "${dir}/.env/node/bin/npm" install -g yarn@1.1.0 + test -e "${dir}/.env/node/bin/activate" || "${dir}/.env/bin/nodeenv" --node=9.3.0 --force "${dir}/.env/node" + test -e "${dir}/.env/node/bin/yarn" || "${dir}/.env/node/bin/shim" "${dir}/.env/node/bin/npm" install -g yarn@1.3.2 PATH="${dir}/.env/node/bin:${PATH}" yarn "$@" fi diff --git a/src/core/Battle.ts b/src/core/Battle.ts index 7b7f8c8..322f8a2 100644 --- a/src/core/Battle.ts +++ b/src/core/Battle.ts @@ -275,7 +275,7 @@ module TK.SpaceTac { this.outcome = null; this.cycle = 1; this.placeShips(); - this.stats.onBattleStart(this.fleets[0], this.fleets[1]); + this.stats.addFleetsValue(this.fleets[0], this.fleets[1]); this.throwInitiative(); iforeach(this.iships(), ship => ship.restoreInitialState()); this.setPlayingShip(this.play_order[0]); diff --git a/src/core/BattleStats.spec.ts b/src/core/BattleStats.spec.ts index 89447ae..0aa6398 100644 --- a/src/core/BattleStats.spec.ts +++ b/src/core/BattleStats.spec.ts @@ -83,13 +83,13 @@ module TK.SpaceTac.Specs { let equ2 = TestTools.addEngine(defender, 50); equ2.price = 1100; - stats.onBattleStart(attacker.fleet, defender.fleet); + stats.addFleetsValue(attacker.fleet, defender.fleet); check.equals(stats.stats, { "Equipment wear (zotys)": [1000, 1100] }); equ1.price = 500; equ2.price = 800; - stats.onBattleEnd(attacker.fleet, defender.fleet); + 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 5c7f584..6713dd3 100644 --- a/src/core/BattleStats.ts +++ b/src/core/BattleStats.ts @@ -69,19 +69,12 @@ module TK.SpaceTac { } /** - * Prepare some stats at the start of battle + * Store the fleets' value, for equipment wear display */ - onBattleStart(attacker: Fleet, defender: Fleet): void { - this.addStat("Equipment wear (zotys)", this.getFleetValue(attacker), true); - this.addStat("Equipment wear (zotys)", this.getFleetValue(defender), false); - } - - /** - * Finalize some stats at the start of battle - */ - onBattleEnd(attacker: Fleet, defender: Fleet): void { - this.addStat("Equipment wear (zotys)", -this.getFleetValue(attacker), true); - this.addStat("Equipment wear (zotys)", -this.getFleetValue(defender), false); + 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/Equipment.spec.ts b/src/core/Equipment.spec.ts index 7c17aeb..20f0120 100644 --- a/src/core/Equipment.spec.ts +++ b/src/core/Equipment.spec.ts @@ -87,13 +87,16 @@ module TK.SpaceTac.Specs { check.equals(equipment.getPrice(), 99); equipment.addWear(10); - check.equals(equipment.getPrice(), 90); + check.equals(equipment.getPrice(), 97); equipment.addWear(89); - check.equals(equipment.getPrice(), 50); + check.equals(equipment.getPrice(), 83); equipment.addWear(400); - check.equals(equipment.getPrice(), 16); + check.equals(equipment.getPrice(), 50); + + equipment.addWear(12500); + check.equals(equipment.getPrice(), 3); }); test.case("builds a full textual description", check => { diff --git a/src/core/Equipment.ts b/src/core/Equipment.ts index 5d39a61..5e85629 100644 --- a/src/core/Equipment.ts +++ b/src/core/Equipment.ts @@ -116,7 +116,7 @@ module TK.SpaceTac { * Get the equipment price value. */ getPrice(): number { - return Math.floor(this.price * 100 / (100 + this.wear)); + return Math.floor(this.price * 500 / (500 + this.wear)); } /** diff --git a/src/core/diffs/EndBattleDiff.spec.ts b/src/core/diffs/EndBattleDiff.spec.ts index 77afe97..5c18bbe 100644 --- a/src/core/diffs/EndBattleDiff.spec.ts +++ b/src/core/diffs/EndBattleDiff.spec.ts @@ -1,18 +1,40 @@ module TK.SpaceTac.Specs { - testing("EndBattle", test => { + testing("EndBattleDiff", test => { test.case("applies and reverts", check => { let battle = new Battle(); + 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, [ new EndBattleDiff(battle.fleets[1], 4) ], [ 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 231f2cb..9483d85 100644 --- a/src/core/diffs/EndBattleDiff.ts +++ b/src/core/diffs/EndBattleDiff.ts @@ -28,14 +28,18 @@ module TK.SpaceTac { 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); + equipment.addWear(-this.cycles); }); }); }