diff --git a/assets/avatars/adam.jpg b/assets/avatars/adam.jpg new file mode 100644 index 0000000..6076afd Binary files /dev/null and b/assets/avatars/adam.jpg differ diff --git a/assets/avatars/begin.jpg b/assets/avatars/begin.jpg new file mode 100644 index 0000000..bbf44e9 Binary files /dev/null and b/assets/avatars/begin.jpg differ diff --git a/assets/avatars/david.jpg b/assets/avatars/david.jpg new file mode 100644 index 0000000..0f87a60 Binary files /dev/null and b/assets/avatars/david.jpg differ diff --git a/assets/avatars/dax.jpg b/assets/avatars/dax.jpg new file mode 100644 index 0000000..eb705a3 Binary files /dev/null and b/assets/avatars/dax.jpg differ diff --git a/assets/avatars/dhh.jpg b/assets/avatars/dhh.jpg new file mode 100644 index 0000000..d8cc8eb Binary files /dev/null and b/assets/avatars/dhh.jpg differ diff --git a/assets/avatars/taylor.jpg b/assets/avatars/taylor.jpg new file mode 100644 index 0000000..a813fcd Binary files /dev/null and b/assets/avatars/taylor.jpg differ diff --git a/assets/avatars/teej.jpg b/assets/avatars/teej.jpg new file mode 100644 index 0000000..1e3676d Binary files /dev/null and b/assets/avatars/teej.jpg differ diff --git a/src/data/enemies.js b/src/data/enemies.js index a7e11f0..f6fc030 100644 --- a/src/data/enemies.js +++ b/src/data/enemies.js @@ -66,27 +66,36 @@ export const ENEMIES = { // ACT 2 ENEMIES - Harder versions teej: { id: "teej", name: "Teej", maxHp: 65, - avatar: "assets/avatars/elite_ts_demon.png", + avatar: "assets/avatars/teej.jpg", background: "assets/backgrounds/castle.png", ai: (turn) => turn % 3 === 0 ? { type: "debuff", value: 2 } : { type: "attack", value: turn % 2 === 0 ? 12 : 14 }, onDebuff: (ctx) => ctx.applyWeak(ctx.player, 2) }, begin: { id: "begin", name: "Begin", maxHp: 80, - avatar: "assets/avatars/infinite_loop.png", + avatar: "assets/avatars/begin.jpg", background: "assets/backgrounds/dead forest.png", ai: (turn) => (turn % 2 === 0) ? { type: "attack", value: 16 } : { type: "block", value: 12 } }, adam: { - id: "adam", name: "Adam", maxHp: 70, - avatar: "assets/avatars/chat_gremlin.png", + id: "adam", name: "Adam Elmore", maxHp: 70, + avatar: "assets/avatars/adam.jpg", background: "assets/backgrounds/terrace.png", ai: (turn) => turn % 4 === 0 ? { type: "debuff", value: 1 } : { type: "attack", value: 13 }, - onDebuff: (ctx) => { ctx.applyVulnerable(ctx.player, 1); ctx.log("Adam finds bugs in your logic!"); } + onDebuff: (ctx) => { + ctx.applyVulnerable(ctx.player, 1); + const debuffLines = [ + "Adam: 'Okay, so here's the thing - your architecture is gonna cost you a fortune.'", + "Adam: 'Let me show you why serverless is the way to go here...'", + "Adam: 'This is exactly why you need to think about cold starts.'", + "Adam: 'I'm gonna walk you through why this approach won't scale.'" + ]; + ctx.log(debuffLines[Math.floor(Math.random() * debuffLines.length)]); + } }, david: { id: "david", name: "David", maxHp: 90, - avatar: "assets/avatars/js_blob.png", + avatar: "assets/avatars/david.jpg", background: "assets/backgrounds/castle.png", ai: (turn) => { const cyc = turn % 3; @@ -98,7 +107,7 @@ export const ENEMIES = { }, dax: { id: "dax", name: "Dax", maxHp: 150, - avatar: "assets/avatars/bug_404.png", + avatar: "assets/avatars/dax.jpg", background: "assets/backgrounds/throne room.png", ai: (turn) => { const cyc = turn % 5; @@ -108,23 +117,87 @@ export const ENEMIES = { if (cyc === 4) return { type: "attack", value: 30 }; return { type: "attack", value: 20 }; }, - onDebuff: (ctx) => { ctx.applyWeak(ctx.player, 2); ctx.applyVulnerable(ctx.player, 1); ctx.log("Dax redesigns your entire approach!"); }, - onBlock: (ctx) => { ctx.enemy.hp = Math.min(ctx.enemy.maxHp, ctx.enemy.hp + 12); ctx.log("Dax refactors and optimizes, healing 12 HP!"); } + onDebuff: (ctx) => { + ctx.applyWeak(ctx.player, 2); + ctx.applyVulnerable(ctx.player, 1); + const debuffLines = [ + "Dax: 'This is actually insane. Like, why would you even do this?'", + "Dax: 'Bro, this code is literally unhinged. I'm rewriting everything.'", + "Dax: 'I'm not even joking, this is the worst thing I've ever seen.'", + "Dax: 'This is so cursed. I can't even look at this anymore.'" + ]; + ctx.log(debuffLines[Math.floor(Math.random() * debuffLines.length)]); + }, + onBlock: (ctx) => { + ctx.enemy.hp = Math.min(ctx.enemy.maxHp, ctx.enemy.hp + 12); + const healLines = [ + "Dax: 'Actually, let me just rebuild this from scratch in 5 minutes.'", + "Dax: 'Hold on, I'm gonna ship a fix real quick.' *heals 12 HP*", + "Dax: 'This is actually trivial to fix. Watch this.' *optimizes everything*", + "Dax: 'I literally just rewrote your entire stack while you weren't looking.'" + ]; + ctx.log(healLines[Math.floor(Math.random() * healLines.length)]); + } }, taylor: { - id: "taylor", name: "Taylor Otwell", maxHp: 150, - avatar: "assets/avatars/bug_404.png", + id: "taylor", name: "Taylor Otwell", maxHp: 200, + avatar: "assets/avatars/taylor.jpg", background: "assets/backgrounds/throne room.png", ai: (turn) => { - const cyc = turn % 5; - if (cyc === 1) return { type: "debuff", value: 2 }; - if (cyc === 2) return { type: "attack", value: 25 }; - if (cyc === 3) return { type: "block", value: 15 }; - if (cyc === 4) return { type: "attack", value: 30 }; - return { type: "attack", value: 20 }; + const cyc = turn % 6; + if (cyc === 0) return { type: "attack", value: 22 }; // Eloquent attack + if (cyc === 1) return { type: "debuff", value: 2 }; // Artisan command + if (cyc === 2) return { type: "attack", value: 28 }; // Forge deployment + if (cyc === 3) return { type: "block", value: 25 }; // Laravel shield + if (cyc === 4) return { type: "debuff", value: 3 }; // Composer update + return { type: "attack", value: 35 }; // Nova dashboard strike }, - onDebuff: (ctx) => { ctx.applyWeak(ctx.player, 2); ctx.applyVulnerable(ctx.player, 1); ctx.log("Taylor redesigns your entire approach!"); }, - onBlock: (ctx) => { ctx.enemy.hp = Math.min(ctx.enemy.maxHp, ctx.enemy.hp + 12); ctx.log("Taylor refactors and optimizes, healing 12 HP!"); } + onDebuff: (ctx) => { + if (ctx.enemy.hp < ctx.enemy.maxHp / 2) { + ctx.applyWeak(ctx.player, 3); + ctx.applyVulnerable(ctx.player, 2); + ctx.log("Taylor unleashes a devastating Laravel package!"); + } else { + ctx.applyWeak(ctx.player, 2); + ctx.applyVulnerable(ctx.player, 2); + ctx.log("Taylor rewrites your code with elegant Laravel solutions!"); + } + }, + onBlock: (ctx) => { + const heal = 20; + ctx.enemy.hp = Math.min(ctx.enemy.maxHp, ctx.enemy.hp + heal); + ctx.log("Taylor optimizes with Laravel Octane, healing " + heal + " HP!"); + } + }, + dhh: { + id: "dhh", name: "DHH", maxHp: 300, + avatar: "assets/avatars/dhh.jpg", + background: "assets/backgrounds/throne room.png", + ai: (turn) => { + const cyc = turn % 6; + if (cyc === 0) return { type: "attack", value: 15 }; // Baseline attack + if (cyc === 1) return { type: "debuff", value: 2 }; // Debuff turn + if (cyc === 2) return { type: "attack", value: 20 }; // Heavy hitting attack + if (cyc === 3) return { type: "block", value: 20 }; // Defense + heal + if (cyc === 4) return { type: "debuff", value: 1 }; // Follow-up debuff + return { type: "attack", value: 30 }; // Another strong attack + }, + onDebuff: (ctx) => { + if (ctx.enemy.hp < ctx.enemy.maxHp / 2) { + ctx.applyWeak(ctx.player, 3); + ctx.applyVulnerable(ctx.player, 2); + ctx.log("DHH unleashes a Twitter rant about your code quality!"); + } else { + ctx.applyWeak(ctx.player, 2); + ctx.applyVulnerable(ctx.player, 2); + ctx.log("DHH criticizes your architecture decisions!"); + } + }, + onBlock: (ctx) => { + const heal = ctx.enemy.hp < ctx.enemy.maxHp / 3 ? 20 : 15; + ctx.enemy.hp = Math.min(ctx.enemy.maxHp, ctx.enemy.hp + heal); + ctx.log(`DHH refactors the codebase with Ruby on Rails, healing ${heal} HP!`); + } } }; diff --git a/src/data/maps.js b/src/data/maps.js index 9b772c4..c5540db 100644 --- a/src/data/maps.js +++ b/src/data/maps.js @@ -23,18 +23,19 @@ export const MAPS = { id: "act2", name: "Birthday Spire — Act II: The Corporate Ladder", nodes: [ { id: "a2n1", kind: "start", next: ["a2n2", "a2n3"], x: 500, y: 760 }, - { id: "a2n2", kind: "battle", enemy: "teej", next: ["a2n5"], x: 300, y: 695 }, + { id: "a2n2", kind: "battle", enemy: "teej", next: ["a2n5"], x: 350, y: 695 }, { id: "a2n3", kind: "event", next: ["a2n5"], x: 650, y: 695 }, { id: "a2n5", kind: "battle", enemy: "begin", next: ["a2n4", "a2n7"], x: 500, y: 600 }, { id: "a2n4", kind: "shop", next: ["a2n6"], x: 350, y: 525 }, { id: "a2n7", kind: "rest", next: ["a2n6"], x: 650, y: 525 }, { id: "a2n6", kind: "battle", enemy: "adam", next: ["a2n8"], x: 500, y: 460 }, - { id: "a2n8", kind: "battle", enemy: "david", next: ["a2n9", "a2n10"], x: 500, y: 360 }, - { id: "a2n9", kind: "rest", next: ["a2n11"], x: 350, y: 320 }, - { id: "a2n10", kind: "shop", next: ["a2n11"], x: 650, y: 320 }, - { id: "a2n11", kind: "elite", enemy: "dax", next: ["a2n12"], x: 500, y: 250 }, - { id: "a2n12", kind: "rest", next: ["a2n13"], x: 500, y: 140 }, - { id: "a2n13", kind: "boss", enemy: "taylor", next: [], x: 500, y: 40 }, + { id: "a2n8", kind: "battle", enemy: "david", next: ["a2n9", "a2n10"], x: 500, y: 375 }, + { id: "a2n9", kind: "rest", next: ["a2n11"], x: 350, y: 330 }, + { id: "a2n10", kind: "shop", next: ["a2n11"], x: 650, y: 330 }, + { id: "a2n11", kind: "elite", enemy: "dax", next: ["a2n12"], x: 500, y: 280 }, + { id: "a2n12", kind: "rest", next: ["a2n13"], x: 500, y: 195 }, + { id: "a2n13", kind: "elite", enemy: "taylor", next: ["a2n14"], x: 500, y: 115 }, + { id: "a2n14", kind: "boss", enemy: "dhh", next: [], x: 500, y: 40 } ] } };