Created
January 4, 2016 17:25
-
-
Save kylehill/a6e169b49c3704bbbe6a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict" | |
const _bossHealth = 71 | |
const _bossDamage = 10 | |
const _playerHealth = 50 | |
const _playerMana = 500 | |
let msgs = {} | |
const log = (msg) => { | |
msgs[msg] = msgs[msg] || 0 | |
msgs[msg] += 1 | |
//console.log(msg) | |
} | |
const spellNames = ["mmis", "drain", "shield", "poison", "recharge"] | |
const spells = { | |
"mmis": { | |
name: "mmis", | |
mana: 53, | |
immediate: (stats) => { | |
stats.boss.health -= 4 | |
return stats | |
} | |
}, | |
"drain": { | |
name: "drain", | |
mana: 73, | |
immediate: (stats) => { | |
stats.boss.health -= 2 | |
stats.player.health += 2 | |
return stats | |
} | |
}, | |
"shield": { | |
name: "shield", | |
mana: 113, | |
immediate: (stats) => { | |
if (stats.timers.shield) { | |
return false | |
} | |
stats.timers.shield = 6 | |
stats.player.armor = 7 | |
return stats | |
}, | |
effect: (stats) => { | |
stats.timers.shield -= 1 | |
if (stats.timers.shield === 0) { | |
stats.player.armor = 0 | |
} | |
return stats | |
} | |
}, | |
"poison": { | |
name: "poison", | |
mana: 173, | |
immediate: (stats) => { | |
if (stats.timers.poison) { | |
return false | |
} | |
stats.timers.poison = 6 | |
return stats | |
}, | |
effect: (stats) => { | |
stats.timers.poison -= 1 | |
stats.boss.health -= 3 | |
return stats | |
} | |
}, | |
"recharge": { | |
name: "recharge", | |
mana: 229, | |
immediate: (stats) => { | |
if (stats.timers.recharge) { | |
return false | |
} | |
stats.timers.recharge = 5 | |
return stats | |
}, | |
effect: (stats) => { | |
stats.timers.recharge -= 1 | |
stats.player.mana += 101 | |
return stats | |
} | |
} | |
} | |
const effectTimers = (stats) => { | |
if (stats.timers.shield) { | |
stats = spells.shield.effect(stats) | |
} | |
if (stats.timers.poison) { | |
stats = spells.poison.effect(stats) | |
} | |
if (stats.timers.recharge) { | |
stats = spells.recharge.effect(stats) | |
} | |
return stats | |
} | |
const castSpell = (stats, spell) => { | |
if (spell.mana > stats.player.mana) { | |
log("not enough mana for " + spell.name) | |
return false | |
} | |
let result = spell.immediate(stats) | |
if (result === false) { | |
log("already has " + spell.name) | |
return false | |
} | |
result.player.mana -= spell.mana | |
result.cost += spell.mana | |
return result | |
} | |
const playerTurn = (stats, spell) => { | |
stats = effectTimers(stats) | |
if (stats.boss.health <= 0) { | |
log("player kills boss w/ effect") | |
return stats.cost | |
} | |
stats.order = stats.order + " > " + spell.name | |
stats = castSpell(stats, spell) | |
if (stats === false) { | |
return false | |
} | |
if (stats.boss.health <= 0) { | |
log("player kills boss") | |
return stats.cost | |
} | |
return stats | |
} | |
const bossTurn = (stats) => { | |
if (typeof stats === "number" || stats === false) { | |
return stats | |
} | |
stats = effectTimers(stats) | |
if (stats.boss.health <= 0) { | |
log("player kills boss w/ effect") | |
return stats.cost | |
} | |
stats.player.health -= (stats.boss.damage - stats.player.armor) | |
if (stats.player.health <= 0) { | |
log("boss kills player") | |
return false | |
} | |
return stats | |
} | |
const fullTurn = (stats, spell) => { | |
return bossTurn( playerTurn( clone(stats), spell ) ) | |
} | |
const refreshStats = () => { | |
return { | |
boss: { | |
health: _bossHealth, | |
damage: _bossDamage | |
}, | |
player: { | |
health: _playerHealth, | |
mana: _playerMana, | |
armor: 0 | |
}, | |
timers: { | |
shield: 0, | |
poison: 0, | |
recharge: 0 | |
}, | |
cost: 0, | |
order: "" | |
} | |
} | |
const clone = (s) => { | |
return JSON.parse(JSON.stringify(s)) | |
} | |
let best = Infinity | |
const traverse = (stats) => { | |
return spellNames.forEach((name) => { | |
runs += 1 | |
const spell = spells[name] | |
const outcome = fullTurn(stats, spell) | |
if (outcome === false) { | |
return | |
} | |
if (typeof outcome === "number") { | |
console.log("win!", stats.order + " > " + spell.name, outcome) | |
best = Math.min(best, outcome) | |
return | |
} | |
if (outcome.cost > best) { | |
return | |
} | |
return traverse(outcome) | |
}) | |
} | |
traverse(refreshStats()) | |
console.log( best, runs ) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment