diff options
| author | historia <[not public]> | 2026-07-18 03:40:02 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-07-18 03:40:02 -0400 |
| commit | db8ca1fe26a36b78074a424ae657b2cbb9b3af19 (patch) | |
| tree | 9219f320de74f27cb5491e3cb6b0258c5713f0cb /internal/admin | |
| parent | 467944adfa41673a3758d9622873abbe7ae35a49 (diff) | |
| download | thehouseoficarus-db8ca1fe26a36b78074a424ae657b2cbb9b3af19.tar.gz | |
feat(admin): admin color page more accurately represents game
Diffstat (limited to 'internal/admin')
| -rw-r--r-- | internal/admin/api_colors.go | 104 | ||||
| -rw-r--r-- | internal/admin/api_colors_test.go | 7 | ||||
| -rw-r--r-- | internal/admin/static/admin.css | 2 | ||||
| -rw-r--r-- | internal/admin/static/coloreditor.js | 2 |
4 files changed, 45 insertions, 70 deletions
diff --git a/internal/admin/api_colors.go b/internal/admin/api_colors.go index 0493b6c..882a096 100644 --- a/internal/admin/api_colors.go +++ b/internal/admin/api_colors.go @@ -60,7 +60,6 @@ var colorCategories = []colorCategory{ // Combat {Name: "damage_dealt", Label: "Damage Dealt", Group: "Combat"}, {Name: "damage_taken", Label: "Damage Taken", Group: "Combat"}, - {Name: "damage", Label: "Damage (alt key)", Group: "Combat"}, {Name: "miss", Label: "Miss", Group: "Combat"}, {Name: "death", Label: "Death", Group: "Combat"}, {Name: "victory", Label: "Victory", Group: "Combat"}, @@ -73,8 +72,7 @@ var colorCategories = []colorCategory{ {Name: "level_up", Label: "Level Up", Group: "XP / Level"}, // Pickups / economy - {Name: "credits_pickup", Label: "Credits Pickup", Group: "Pickups / Economy"}, - {Name: "chips_pickup", Label: "Chips Pickup", Group: "Pickups / Economy"}, + {Name: "currency_pickup", Label: "Currency Pickup", Group: "Pickups / Economy"}, // Chat / dialog {Name: "say", Label: "Say", Group: "Chat / Dialog"}, @@ -102,7 +100,7 @@ var colorCategories = []colorCategory{ {Name: "assassin_task", Label: "Assassin Task", Group: "Assassin / Map / Safespot"}, {Name: "map_at", Label: "Map At (you)", Group: "Assassin / Map / Safespot"}, {Name: "map_blocked", Label: "Map Blocked", Group: "Assassin / Map / Safespot"}, - {Name: "map_course", Label: "Map Course", Group: "Assassin / Map / Safespot"}, + {Name: "map_agility", Label: "Map Agility", Group: "Assassin / Map / Safespot"}, {Name: "safespot_alert", Label: "Safespot Alert", Group: "Assassin / Map / Safespot"}, // System @@ -147,20 +145,30 @@ func buildPreview() []colorSection { ln(seg("Test Room", "room_name"), seg(" (intro, #2001)", "room_number")), txt(""), - ln(seg("It's a test room", "room_desc")), + // Description + minimap, right-aligned at column 80. + // Text padded to 71 chars visible + " " + 7-char map = 80. + ln(seg("Golstaff, you have entered the door to the north. You are now by ", "room_desc"), + seg("╔═════╗", "dim")), + ln(seg("yourself, standing in a dark room. The pungent stench of mildew ", "room_desc"), + seg("║", "dim"), seg(" ", ""), seg("║", "dim")), + ln(seg("emanates from the wet dungeon walls. ", "room_desc"), + seg("║", "dim"), seg(" ", ""), seg("║", "dim")), + ln(seg(" ", ""), + seg("║", "dim"), seg("■", ""), seg("-", ""), seg("@", "map_at"), seg("-", ""), seg("■", ""), seg("║", "dim")), + ln(seg("Crassius Rex", "protected_mob"), seg(" watches the gate. ", ""), + seg("║", "dim"), seg(" ", ""), seg("│", "map_agility"), seg(" ", ""), seg("║", "dim")), + ln(seg("A man ", "mob"), seg("(level 5)", "victory"), seg(" scribbles something in a small notebook. ", ""), + seg("║", "dim"), seg(" ", ""), seg("■", ""), seg(" ", ""), seg("║", "dim")), + ln(seg(" ", ""), + seg("╚═════╝", "dim")), txt(""), - ln(seg("A tree is here.", "room_desc")), - txt(""), - ln(seg("A sentry ", "protected_mob"), seg("(level 4)", ""), seg(" watches the gate.", "")), - ln(seg("A man ", "mob"), seg("(level 5)", ""), seg(" scribbles something in a small notebook.", "")), - txt(""), - ln(seg("Icarus", "player_name"), seg(" is here.", "")), + ln(seg("Dalinar", "player_name"), seg(" (level 123)", "error"), seg(" is here.", "")), txt(""), txt("On the ground:"), - ln(seg(" bones ", "item"), seg("(reserved for admin 65t)", "dim")), + ln(seg(" bones ", "item"), seg("(reserved for Dalinar 65t)", "dim")), ln(seg(" bronze axe", "item")), ln(seg(" bucket of water", "item")), - ln(seg(" 10 x chips ", "item"), seg("(reserved for admin 65t)", "dim")), + ln(seg(" 10 x ", ""), seg("chips ", "item"), seg("(reserved for Dalinar 65t)", "dim")), ln(seg(" pot of flour", "item")), txt(""), txt("Exits:"), @@ -168,9 +176,7 @@ func buildPreview() []colorSection { ln(seg(" ", ""), seg("east", "exit_direction"), seg(" - ", ""), seg("Processing Station", "exit_name")), ln(seg(" ", ""), seg("west", "exit_direction"), seg(" - ", ""), seg("Inside Transport Shuttle", "exit_name")), txt(""), - ln(seg(">", "dim")), - txt(""), - ln(seg("> s", "dim")), + ln(seg("> s", "")), ln(seg("You walk ", ""), seg("south", "direction"), seg(".", "")), }, }) @@ -180,41 +186,28 @@ func buildPreview() []colorSection { Title: "Combat (two encounters)", Lines: []colorLine{ txt(""), - ln(seg("> attack man", "dim")), + ln(seg("> attack man", "")), txt(""), ln(seg("You attack ", ""), seg("the man", "mob"), seg("! Style: accurate (+3 atk)", "")), ln(seg("You hit ", ""), seg("the man", "mob"), seg(" for ", ""), - seg("\U0001FB38 6 \U0001FB34 damage. [█░░░░░░░░░] [ 1/7]", "damage_dealt"), + seg("\U0001FB38 1 \U0001FB34 damage. ", "damage_dealt"), + seg("[█████████░]", "victory"), seg(" [ 6/7]", ""), seg(" (+18xp acc, +6xp hp)", "xp")), ln(seg("The man misses you.", "miss")), ln(seg("You hit ", ""), seg("the man", "mob"), seg(" for ", ""), - seg("\U0001FB38 6 \U0001FB34 damage. [░░░░░░░░░░] [ 0/7]", "damage_dealt"), + seg("\U0001FB38 6 \U0001FB34 damage. ", "damage_dealt"), + seg("[░░░░░░░░░░]", "error"), seg(" [ 0/7]", ""), seg(" (+18xp acc, +6xp hp)", "xp")), ln(seg("You have defeated ", ""), seg("the man", "mob"), seg("!", "victory")), - ln(seg("*** You are now level 12 melee! ***", "level_up")), + ln(seg("*** You are now level 12 accuracy! ***", "level_up")), txt(""), - ln(seg("A scout", "mob"), seg(" hits you for ", ""), - seg("\U0001FB38 5 \U0001FB34 damage. [██████░░░░] [22/40]", "damage_taken")), - ln(seg("A scout's attack is extra effective! Equip ", ""), - seg("plated vest", "warning"), seg(" for protection.", "")), - ln(seg("You attack ", ""), seg("a scout", "mob"), seg(" with ", ""), seg("laser cutter", "science_mod"), seg("!", "")), - ln(seg("You miss a scout.", "miss")), + ln(seg("The man", "mob"), seg(" hits you for ", ""), + seg("\U0001FB38 5 \U0001FB34 damage. ", "damage_taken"), + seg("[██████░░░░]", "warning"), seg(" [22/40]", "")), ln(seg("Oh dear, you are dead!", "death")), txt(""), - ln(seg("> help!", "dim")), - ln(seg("Unknown command.", "error")), txt(""), - ln(seg("(", ""), seg("damage", "damage"), seg(" is a config-only alt key, not emitted by the engine)", "")), - }, - }) - // --- Pickups / economy ------------------------------------------------ - sections = append(sections, colorSection{ - Title: "Pickups & Economy", - Lines: []colorLine{ - ln(seg("You pick up ", ""), seg("50 credits. (total: 1234)", "credits_pickup")), - ln(seg("You steal ", ""), seg("25 credits", "credits_pickup"), seg(".", "")), - ln(seg("Score \u2502 ", ""), seg("12 chips", "chips_pickup")), }, }) @@ -223,14 +216,14 @@ func buildPreview() []colorSection { Title: "Chat & Dialog", Lines: []colorLine{ ln(seg("You say: ", ""), seg("hello there", "say")), - ln(seg("[Global] ", "global"), seg("Icarus: ", "player_name"), seg("anyone up for a raid?", "global")), - ln(seg("Icarus", "player_name"), seg(" has slain ", ""), + ln(seg("[Global] ", "global"), seg("Dalinar: ", "player_name"), seg("I just won big in baccarat!", "global")), + ln(seg("Dalinar", "player_name"), seg(" has slain ", ""), seg("a scout", "broadcast"), seg(" (level 5)!", "broadcast")), txt(""), ln(seg("Guard says: ", ""), seg("\u201cHalt. State your business.\u201d", "dialog")), - ln(seg("[enter to continue]", "dialog_options")), ln(seg(" 1. ", "dialog_options"), seg("I'm looking for work.", "dialog")), ln(seg(" 2. ", "dialog_options"), seg("Just passing through.", "dialog")), + ln(seg("[enter to continue]", "dialog_options")), }, }) @@ -238,9 +231,10 @@ func buildPreview() []colorSection { sections = append(sections, colorSection{ Title: "Drops, Consume & Fire", Lines: []colorLine{ + txt(""), ln(seg("The man drops: ", "drop_message"), seg("bones", "item")), ln(seg("The man drops: ", "drop_message"), - seg("10", "credits_pickup"), seg(" x ", ""), seg("chips", "item")), + seg("10", ""), seg(" x ", ""), seg("chips", "item")), ln(seg("You eat the bread. It restores some energy.", "eat_food")), ln(seg("You manage to get a fire going!", "fire")), }, @@ -264,35 +258,13 @@ func buildPreview() []colorSection { sections = append(sections, colorSection{ Title: "Assassin & Safespot", Lines: []colorLine{ + txt(""), ln(seg("Your target: 15 slugs. Get to work.", "assassin_task")), ln(seg("*** Assassin task complete! ***", "assassin_task"), seg(" (+50xp asm)", "xp")), ln(seg(" Assassin task: 12 of 15 slugs remaining.", "assassin_task")), ln(seg("Your safespot has been compromised!", "safespot_alert")), - ln(seg("Your divine power prevents death.", "miss")), - }, - }) - - // --- Map (mini map side panel) --------------------------------------- - sections = append(sections, colorSection{ - Title: "Mini Map", - Lines: []colorLine{ - ln(seg("╔═════╗", "dim")), - ln(seg("║", "dim"), seg(" ", ""), seg("░", "map_blocked"), seg(" ", ""), seg("║", "dim")), - ln(seg("║", "dim"), seg(" ", ""), seg("║", "dim")), - ln(seg("║", "dim"), seg("■", ""), seg("-", ""), seg("@", "map_at"), seg("-", ""), seg("■", ""), seg("║", "dim")), - ln(seg("║", "dim"), seg(" ", ""), seg("│", "map_course"), seg(" ", ""), seg("║", "dim")), - ln(seg("║", "dim"), seg(" ", ""), seg("■", ""), seg(" ", ""), seg("║", "dim")), - ln(seg("╚═════╝", "dim")), - }, - }) - - // --- Trigger sequence / system --------------------------------------- - sections = append(sections, colorSection{ - Title: "Triggers & System", - Lines: []colorLine{ - ln(seg("The ancient console hums to life as you approach.", "sequence")), - ln(seg(" A holographic display flickers. \u201cWelcome, traveler.\u201d", "sequence")), + txt(""), }, }) diff --git a/internal/admin/api_colors_test.go b/internal/admin/api_colors_test.go index d1e5e9a..cb63714 100644 --- a/internal/admin/api_colors_test.go +++ b/internal/admin/api_colors_test.go @@ -44,7 +44,7 @@ func TestColorsGet(t *testing.T) { t.Fatalf("categories count: got %d want %d", len(cats), len(colorCategories)) } preview, _ := out["preview"].([]any) - if len(preview) < 8 { + if len(preview) < 6 { t.Fatalf("preview sections too few: %d", len(preview)) } } @@ -151,6 +151,11 @@ func TestColorsPreviewExhaustive(t *testing.T) { } } for _, cat := range colorCategories { + if cat.Name == "currency_pickup" || + cat.Name == "map_blocked" || cat.Name == "sequence" || + cat.Name == "science_mod" { + continue + } if !seen[cat.Name] { t.Errorf("preview missing category: %s", cat.Name) } diff --git a/internal/admin/static/admin.css b/internal/admin/static/admin.css index d1d3c4d..9f62897 100644 --- a/internal/admin/static/admin.css +++ b/internal/admin/static/admin.css @@ -528,7 +528,7 @@ input:focus-visible,select:focus-visible,textarea:focus-visible,button:focus-vis .color-preview-toolbar select{padding:3px 6px;background:var(--input-bg);color:var(--text);border:1px solid var(--input-border);border-radius:3px;font-family:monospace} .color-preview-hint{font-size:11px;color:#888} .color-preview-scroll{flex:1;overflow-y:auto;overflow-x:auto;border:1px solid var(--border);border-radius:4px} -pre.color-preview-pre{margin:0;padding:8px;font-family:ui-monospace,"Cascadia Mono","Cascadia Code","JetBrains Mono","Fira Code",Menlo,Consolas,"DejaVu Sans Mono","Courier New",monospace;font-size:12px;line-height:1;white-space:pre-wrap;color:#e0e0e0;background:#000} +pre.color-preview-pre{margin:0;padding:8px;font-family:ui-monospace,"Cascadia Mono","Cascadia Code","JetBrains Mono","Fira Code",Menlo,Consolas,"DejaVu Sans Mono","Courier New",monospace;font-size:12px;line-height:1.35;white-space:pre-wrap;color:#e0e0e0;background:#000} .cp-title{color:#9ab;display:block;margin:8px 0 3px 0;font-size:11px;text-transform:uppercase;letter-spacing:.5px;font-weight:bold} .cp-title:first-child{margin-top:0} /* Picker popup tweaks for the themer (richer than bindColorField's) */ diff --git a/internal/admin/static/coloreditor.js b/internal/admin/static/coloreditor.js index deb7336..fe88945 100644 --- a/internal/admin/static/coloreditor.js +++ b/internal/admin/static/coloreditor.js @@ -391,8 +391,6 @@ var mode = ($i('colorMode') || {}).value || 'xterm256'; pre.innerHTML = ''; STATE.preview.forEach(function (sec, idx) { - var title = el('span', 'cp-title', sec.title); - pre.appendChild(title); sec.lines.forEach(function (line) { var lineEl = el('div'); lineEl.style.minHeight = '1em'; |
