|
|
|
@ -49,57 +49,57 @@ export const CARDS = { |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
refactor: { |
|
|
|
segfault: { |
|
|
|
id: "refactor", name: "Segfault", cost: 2, type: "attack", text: "Deal 7. Draw 1.", |
|
|
|
id: "segfault", name: "Segfault", cost: 2, type: "attack", text: "Deal 7. Draw 1.", |
|
|
|
effect: (ctx) => { ctx.deal(ctx.enemy, ctx.scalarFromWeak(7)); ctx.draw(1); } |
|
|
|
effect: (ctx) => { ctx.deal(ctx.enemy, ctx.scalarFromWeak(7)); ctx.draw(1); } |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
type_safety: { |
|
|
|
skill_issue: { |
|
|
|
id: "type_safety", name: "Skill Issue", cost: 1, type: "skill", text: "Gain 6 Block. If enemy intends attack → apply Weak(1).", |
|
|
|
id: "skill_issue", name: "Skill Issue", cost: 1, type: "skill", text: "Gain 6 Block. If enemy intends attack → apply Weak(1).", |
|
|
|
effect: (ctx) => { ctx.player.block += 6; if (ctx.intentIsAttack()) ctx.applyWeak(ctx.enemy, 1); } |
|
|
|
effect: (ctx) => { ctx.player.block += 6; if (ctx.intentIsAttack()) ctx.applyWeak(ctx.enemy, 1); } |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
chat_ban: { |
|
|
|
"404": { |
|
|
|
id: "chat_ban", name: "404", cost: 1, type: "skill", text: "Apply Weak(2).", |
|
|
|
id: "404", name: "404", cost: 1, type: "skill", text: "Apply Weak(2).", |
|
|
|
effect: (ctx) => ctx.applyWeak(ctx.enemy, 2) |
|
|
|
effect: (ctx) => ctx.applyWeak(ctx.enemy, 2) |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
segfault: { |
|
|
|
dark_mode: { |
|
|
|
id: "segfault", name: "Dark Mode", cost: 2, type: "attack", text: "Deal 20. End your turn.", |
|
|
|
id: "dark_mode", name: "Dark Mode", cost: 2, type: "attack", text: "Deal 20. End your turn.", |
|
|
|
effect: (ctx) => { ctx.deal(ctx.enemy, ctx.scalarFromWeak(20)); ctx.forceEndTurn() } |
|
|
|
effect: (ctx) => { ctx.deal(ctx.enemy, ctx.scalarFromWeak(20)); ctx.forceEndTurn() } |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
gc: { |
|
|
|
object_object: { |
|
|
|
id: "gc", name: "[object Object]", cost: 1, type: "skill", text: "Exhaust 1 card, draw 2.", |
|
|
|
id: "object_object", name: "[object Object]", cost: 1, type: "skill", text: "Exhaust 1 card, draw 2.", |
|
|
|
effect: (ctx) => { |
|
|
|
effect: (ctx) => { |
|
|
|
ctx.promptExhaust(1); |
|
|
|
ctx.promptExhaust(1); |
|
|
|
ctx.draw(2); |
|
|
|
ctx.draw(2); |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
async_await: { |
|
|
|
just_one_game: { |
|
|
|
id: "async_await", name: "Just One Game", cost: 1, type: "power", text: "Skip this turn. Next turn +2 Energy.", |
|
|
|
id: "just_one_game", name: "Just One Game", cost: 1, type: "power", text: "Skip this turn. Next turn +2 Energy.", |
|
|
|
effect: (ctx) => { ctx.flags.skipThisTurn = true; ctx.flags.nextTurnEnergyBonus = (ctx.flags.nextTurnEnergyBonus || 0) + 2; } |
|
|
|
effect: (ctx) => { ctx.flags.skipThisTurn = true; ctx.flags.nextTurnEnergyBonus = (ctx.flags.nextTurnEnergyBonus || 0) + 2; } |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
stack_overflow: { |
|
|
|
colon_q: { |
|
|
|
id: "stack_overflow", name: "Colon Q", cost: 2, type: "attack", text: "Deal 1 per card in discard.", |
|
|
|
id: "colon_q", name: "Colon Q", cost: 2, type: "attack", text: "Deal 1 per card in discard.", |
|
|
|
effect: (ctx) => ctx.deal(ctx.enemy, ctx.scalarFromWeak(Math.max(0, ctx.discard.length))) |
|
|
|
effect: (ctx) => ctx.deal(ctx.enemy, ctx.scalarFromWeak(Math.max(0, ctx.discard.length))) |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
infinite_vim: { |
|
|
|
vibe_code: { |
|
|
|
id: "infinite_vim", name: "Vibe Code", cost: 1, type: "skill", text: "Next card costs 0.", |
|
|
|
id: "vibe_code", name: "Vibe Code", cost: 1, type: "skill", text: "Next card costs 0.", |
|
|
|
effect: (ctx) => ctx.flags.nextCardFree = true |
|
|
|
effect: (ctx) => ctx.flags.nextCardFree = true |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
debug_print: { |
|
|
|
raw_dog: { |
|
|
|
id: "debug_print", name: "Raw Dog", cost: 0, type: "skill", text: "Draw 2. Exhaust.", |
|
|
|
id: "raw_dog", name: "Raw Dog", cost: 0, type: "skill", text: "Draw 2. Exhaust.", |
|
|
|
exhaust: true, |
|
|
|
exhaust: true, |
|
|
|
effect: (ctx) => ctx.draw(2) |
|
|
|
effect: (ctx) => ctx.draw(2) |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
null_pointer: { |
|
|
|
task_failed_successfully: { |
|
|
|
id: "null_pointer", name: "Task failed successfully", cost: 2, type: "attack", text: "Deal 8. If enemy has no Block, deal 4 more.", |
|
|
|
id: "task_failed_successfully", name: "Task failed successfully", cost: 2, type: "attack", text: "Deal 8. If enemy has no Block, deal 4 more.", |
|
|
|
effect: (ctx) => { |
|
|
|
effect: (ctx) => { |
|
|
|
let dmg = ctx.scalarFromWeak(8); |
|
|
|
let dmg = ctx.scalarFromWeak(8); |
|
|
|
if (ctx.enemy.block === 0) dmg += ctx.scalarFromWeak(4); |
|
|
|
if (ctx.enemy.block === 0) dmg += ctx.scalarFromWeak(4); |
|
|
|
@ -159,8 +159,8 @@ export const CARDS = { |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
rubber_duck: { |
|
|
|
ligma: { |
|
|
|
id: "rubber_duck", name: "Ligma", cost: 0, type: "skill", text: "Unalive yourself with -69 hit points. Courtesy of Defysall.", |
|
|
|
id: "ligma", name: "Ligma", cost: 0, type: "skill", text: "Unalive yourself with -69 hit points. Courtesy of Defysall.", |
|
|
|
effect: (ctx) => { |
|
|
|
effect: (ctx) => { |
|
|
|
ctx.player.hp = Math.max(0, ctx.player.hp - 69); |
|
|
|
ctx.player.hp = Math.max(0, ctx.player.hp - 69); |
|
|
|
ctx.draw(1); |
|
|
|
ctx.draw(1); |
|
|
|
@ -176,8 +176,8 @@ export const CARDS = { |
|
|
|
} |
|
|
|
} |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
unit_test: { |
|
|
|
virgin: { |
|
|
|
id: "unit_test", name: "Virgin", cost: 1, type: "skill", text: "If enemy intends to attack, gain 8 Block.", |
|
|
|
id: "virgin", name: "Virgin", cost: 1, type: "skill", text: "If enemy intends to attack, gain 8 Block.", |
|
|
|
effect: (ctx) => { |
|
|
|
effect: (ctx) => { |
|
|
|
if (ctx.intentIsAttack()) { |
|
|
|
if (ctx.intentIsAttack()) { |
|
|
|
ctx.player.block += 8; |
|
|
|
ctx.player.block += 8; |
|
|
|
@ -207,15 +207,15 @@ export const CARDS = { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const STARTER_DECK = [ |
|
|
|
export const STARTER_DECK = [ |
|
|
|
"refactor", "debug_print", "coffee_rush", |
|
|
|
"segfault", "raw_dog", "coffee_rush", |
|
|
|
"type_safety", "infinite_vim", "chat_ban", |
|
|
|
"skill_issue", "vibe_code", "404", |
|
|
|
"git_commit", "rubber_duck", "null_pointer", "unit_test" |
|
|
|
"git_commit", "ligma", "task_failed_successfully", "virgin" |
|
|
|
]; |
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
export const CARD_POOL = [ |
|
|
|
export const CARD_POOL = [ |
|
|
|
"coffee_rush", "macro", "refactor", "type_safety", "chat_ban", |
|
|
|
"coffee_rush", "macro", "segfault", "skill_issue", "404", |
|
|
|
"segfault", "gc", "async_await", "stack_overflow", "infinite_vim", |
|
|
|
"dark_mode", "object_object", "just_one_game", "colon_q", "vibe_code", |
|
|
|
"debug_print", "null_pointer", "recursion", "git_commit", "memory_leak", |
|
|
|
"raw_dog", "task_failed_successfully", "recursion", "git_commit", "memory_leak", |
|
|
|
"code_review", "pair_programming", "hotfix", "rubber_duck", "merge_conflict", |
|
|
|
"code_review", "pair_programming", "hotfix", "ligma", "merge_conflict", |
|
|
|
"unit_test", "production_deploy" |
|
|
|
"virgin", "production_deploy" |
|
|
|
]; |
|
|
|
]; |
|
|
|
|