Something went wrong. Try again.
HEXWORK - A Lantern in the Deep: 3D ASCII terminal roguelike RPG in Rust.
Entirely designed and built by Muse Spark 1.3 to evaluate if I like the model.
Something went wrong. Try again.
5.1 kB · 129 lines
Rust
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130//! Real 80x24 binary/grid essentials and durable identity, not transcript matching.#![cfg(any(target_os = "linux", target_os = "macos"))]
#[allow(dead_code, unused_imports)]mod support;
use std::fs;use std::path::Path;use std::process::Command;use support::Harness;
#[test]fn real_80x24_default_and_remapped_quit_preserve_essentials_and_save_identity() { for label in ["Esc", "0"] { let harness = Harness::new(&format!("hud-essentials-{label}")); fs::create_dir_all(&harness.data).unwrap(); if label == "0" { let map = hexwork_term::remap::DEFAULT_KEYMAP_TOML .replace("quit = [\"Esc\", \"q\"]", "quit = [\"0\"]") .replace("look_reset = [\"0\"]\n", ""); fs::write(harness.data.join("keymap.toml"), map).unwrap(); } let output = Harness::run({ let mut command = Command::new("python3"); command .current_dir(&harness.cwd) .env("HOME", &harness.home) .env("XDG_DATA_HOME", harness.home.join("xdg")) .env("TERM", "xterm-256color") .arg(Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/pty/hud_essentials.py")) .arg(env!("CARGO_BIN_EXE_hexwork")) .arg(&harness.data) .arg(&harness.content) .arg(label); command }); assert!( output.status.success(), "stdout={} stderr={}", String::from_utf8_lossy(&output.stdout), String::from_utf8_lossy(&output.stderr) ); let evidence: serde_json::Value = serde_json::from_slice(&output.stdout).unwrap(); assert_eq!(evidence["size"], serde_json::json!([80, 24])); assert_eq!(evidence["exit"], 0); let runs: Vec<_> = fs::read_dir(harness.data.join("runs")) .unwrap() .map(Result::unwrap) .filter(|entry| entry.file_type().unwrap().is_dir()) .collect(); assert_eq!(runs.len(), 1); let pack = hexwork_content::RuntimePack::load(&harness.content).unwrap(); let saved = hexwork_save::decode_run( &fs::read(runs[0].path().join("run.save")).unwrap(), pack.hash(), ) .unwrap(); assert_eq!(saved.identity.seed, 48); assert_eq!(saved.identity.mode, hexwork_core::modes::Mode::Classic); assert_eq!( saved.identity.ancestry, hexwork_core::character::Ancestry::Mudborn ); assert_eq!( saved.identity.calling, hexwork_core::character::Calling::Ratcatcher ); assert_eq!(saved.identity.display_name, "HUD essentials"); assert_eq!(saved.identity.content_hash, pack.hash()); assert_eq!( saved.identity.run_id.to_string(), runs[0].file_name().to_string_lossy() ); for screen in ["play", "map"] { let rows: Vec<&str> = evidence[screen] .as_array() .unwrap() .iter() .map(|row| row.as_str().unwrap()) .collect(); assert_eq!(rows.len(), 24); // Generated starter is ASCII; chrome separators are also one-cell glyphs. for row in &rows[16..] { assert_eq!(row.chars().count(), 80); } assert_eq!( rows[16].trim_end(), "HP 10 · Light no carried lamp · Burden 4.3/40.0kg 6/20 bulk within limit" ); assert!( rows[16].contains(" · Burden ") && rows[16].contains("within limit"), "{}", rows[16] ); assert!( !rows[16].contains('…'), "normal starter elided: {}", rows[16] ); let verb = if screen == "map" { "close" } else { "quit" }; assert!(rows[17].starts_with(&format!("{label} {verb}"))); if label != "Esc" { assert!(!rows[17].contains("Esc quit")); } assert_eq!( rows[18].trim_end(), "Melee warning: surviving hostiles counterattack only within their own reach." ); assert!(rows[19].starts_with("Town "), "{}", rows[19]); let tick = rows[19] .split(" · t") .nth(1) .unwrap() .split(' ') .next() .unwrap() .parse::<u64>() .unwrap(); assert!(tick <= saved.current.tick); assert!(rows[20].starts_with("Recent feedback")); if screen == "map" { assert!(rows[19].contains("[TACTICAL Z ") && rows[19].contains("LIVE]")); } else { assert!(!rows[19].contains("TACTICAL")); } } // Real clocks may advance. No cross-run or pre/post whole-save equality. }}