-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhud.js
More file actions
109 lines (93 loc) · 3 KB
/
hud.js
File metadata and controls
109 lines (93 loc) · 3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env node
// CodeDungeon HUD - StatusLine renderer
// Reads state.json and outputs one line of game HUD
const fs = require('fs');
const path = require('path');
const STATE_FILE = path.join(__dirname, 'state.json');
function main() {
let state;
try {
state = JSON.parse(fs.readFileSync(STATE_FILE, 'utf8'));
} catch {
// No state yet or error - output nothing, let fallback handle it
process.exit(0);
}
if (!state.enabled) {
// Game disabled - output empty so claude-hud fallback can work
// Or output a minimal indicator
process.stdout.write('');
return;
}
if (!state.alive) {
process.stdout.write(
`\u{1F480} B${state.dungeon.floor}\u00B7${state.dungeon.floorName} | ` +
`\u2620\uFE0F \u51FB\u6740${state.stats.kills} | ` +
`restart / legacy`
);
return;
}
const c = state.character;
const d = state.dungeon;
// Combat state
if (state.combat) {
const mon = state.combat.monster;
const prefix = mon.isBoss ? '\u{1F479}' : '\u2694\uFE0F';
const monInfo = `${mon.name}(\u2665${mon.currentHp})`;
process.stdout.write(
`${prefix} B${d.floor} | ` +
`\u2764\uFE0F${c.hp} \u26A1${c.mp} | ` +
`${monInfo} | ` +
`fight\u00B7flee\u00B7spell\u00B7item`
);
return;
}
// Event state
if (state.event) {
const evtEmoji = '\u2753';
process.stdout.write(
`${evtEmoji} B${d.floor} | ` +
`\u2764\uFE0F${c.hp} | ` +
`\u4E8B\u4EF6\u5F85\u5904\u7406(${state.event.stepsLeft}\u6B65)`
);
return;
}
// Check if at floor end (stairs available)
const atEnd = d.roomIndex >= d.rooms.length - 1 && d.rooms[d.roomIndex] && d.rooms[d.roomIndex].explored;
// Normal exploration
const room = d.rooms[d.roomIndex];
let roomDesc = '';
if (room) {
const descs = {
entrance: '\u5165\u53E3',
empty: '\u5E7D\u6697\u8D70\u5ECA',
monster: '\u602A\u7269\u623F',
chest: '\u5B9D\u7BB1\u623F',
trap: '\u9677\u9631',
shop: '\u{1F3EA}\u5546\u5E97',
rest: '\u{1F525}\u7BC0\u706B',
event: '\u795E\u79D8\u4E8B\u4EF6',
boss: '\u{1F479}Boss'
};
roomDesc = descs[room.type] || '';
}
const invCount = state.inventory.length;
const bagInfo = `\u{1F392}${invCount}/${state.bagSize}`;
const floorInfo = `\u{1F3F0} B${d.floor}\u00B7${d.floorName}`;
const statsInfo = `\u2764\uFE0F${c.hp} \u2694\uFE0F${c.atk} \u{1F6E1}${getEffDef(state)}`;
const goldInfo = `\u{1FA99}${c.gold}`;
const levelInfo = `Lv.${c.level}`;
let line = `${floorInfo} | ${statsInfo} | ${goldInfo} ${bagInfo} | ${levelInfo}`;
if (atEnd) {
line += ' | \u{1FA9C}\u697C\u68AF\u2192descend';
} else if (roomDesc) {
line += ` | ${roomDesc}`;
}
process.stdout.write(line);
}
function getEffDef(state) {
let def = state.character.def;
if (state.equipment.armor) def += state.equipment.armor.stats.def || 0;
if (state.equipment.accessory && state.equipment.accessory.stats.def) def += state.equipment.accessory.stats.def;
return Math.max(0, def);
}
main();