Skip to content

Instantly share code, notes, and snippets.

@kylehill
Created January 4, 2016 17:25
Show Gist options
  • Save kylehill/a6e169b49c3704bbbe6a to your computer and use it in GitHub Desktop.
Save kylehill/a6e169b49c3704bbbe6a to your computer and use it in GitHub Desktop.
"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