Silver, ruby and diamond veins; treasury shows its treasures; announced payday
- New veins (appended kinds): silver (common), ruby (rare), diamond (very rare, far from the core); treasure caves contain gems; each treasure is worth a different amount per strike and per vein - Imps carry one kind of treasure at a time - Treasury tiles hold up to 500 each and show gold coins, silver bars, rubies or diamonds; spending empties random treasury tiles, the soul core keeps what does not fit - Training no longer drains gold continuously: it is billed on the next payday - Payday is announced 20 s before (message with the cost); the HUD shows a payday countdown and the cost of the next payday in red next to the gold counter - Tests for the treasury and the payday bill Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
75dc445d3b
commit
7e84cae910
7 files changed
+362
-31
No files matched your search
@@ -420,13 +420,21 @@ impl Ui {
|
||||
let wave_col = if g.wave_timer < 30.0 { RED } else { TXT };
|
||||
let vol = if settings.muted { tr("hud.off") } else { format!("{}%", (settings.volume * 100.0).round() as i32) };
|
||||
let mut segs: Vec<Vec<Part>> = vec![
|
||||
vec![txt(tr("hud.gold"), GOLD), Part::Gap, txt(format!("{}/{}", g.gold as i32, g.gold_cap() as i32), TXT)],
|
||||
vec![
|
||||
txt(tr("hud.gold"), GOLD),
|
||||
Part::Gap,
|
||||
txt(format!("{}/{}", g.gold as i32, g.gold_cap() as i32), TXT),
|
||||
Part::Gap,
|
||||
// what the next payday costs, in red
|
||||
txt(format!("-{}", g.next_payday_cost().ceil() as i32), RED),
|
||||
],
|
||||
vec![txt(tr("hud.mana"), MANA), Part::Gap, Part::Bar(g.mana / MANA_MAX, MANA), Part::Gap, txt(format!("{:<3}", g.mana as i32), TXT)],
|
||||
vec![txt(tr("hud.core"), RED), Part::Gap, Part::Bar(g.core_hp / CORE_HP, RED)],
|
||||
vec![txt(tr("hud.gate"), BLUE), Part::Gap, Part::Bar(g.gate_hp / GATE_HP, BLUE)],
|
||||
vec![txt(tr("hud.creatures"), TXT), Part::Gap, txt(format!("{}/{}", g.creature_count(), cap), TXT)],
|
||||
vec![txt(tr("hud.workers"), TXT), Part::Gap, txt(g.worker_count().to_string(), TXT)],
|
||||
vec![txt(trf("hud.wave", &[(g.wave + 1).to_string()]), wave_col), Part::Gap, txt(mmss(g.wave_timer), TXT)],
|
||||
vec![txt(tr("hud.payday"), if g.payday <= PAYDAY_WARN { RED } else { GOLD }), Part::Gap, txt(mmss(g.payday), TXT)],
|
||||
vec![txt(tr("hud.army"), TXT), Part::Gap, txt((g.army_value() as i32).to_string(), TXT)],
|
||||
];
|
||||
if !g.hand.is_empty() {
|
||||
@@ -970,8 +978,9 @@ pub fn hover_info(g: &Game, ent: Option<usize>, tile: Option<(i32, i32)>) -> Vec
|
||||
out.push((tr("tile.reinforced_info"), DIM));
|
||||
}
|
||||
Kind::Earth => out.push((tr("tile.earth"), FRAME_HI)),
|
||||
Kind::Gold => {
|
||||
out.push((tr("tile.gold"), GOLD));
|
||||
Kind::Gold | Kind::Silver | Kind::Ruby | Kind::Diamond => {
|
||||
let key = ["tile.gold", "tile.silver", "tile.ruby", "tile.diamond"][t.vein().unwrap_or(0) as usize];
|
||||
out.push((tr(key), GOLD));
|
||||
out.push((trf("tile.gold_amount", &[t.gold.to_string()]), GOLD));
|
||||
}
|
||||
Kind::Floor => {
|
||||
@@ -1021,6 +1030,10 @@ pub fn hover_info(g: &Game, ent: Option<usize>, tile: Option<(i32, i32)>) -> Vec
|
||||
out.push((tr(ROOM_NAMES[r]), FRAME_HI));
|
||||
match k {
|
||||
Kind::Farm => out.push((trf("farm.food", &[(t.food as i32).to_string()]), GREEN)),
|
||||
Kind::Treasury if t.gold > 0 => {
|
||||
let what = ["res.gold", "res.silver", "res.ruby", "res.diamond"][(t.res & 3) as usize];
|
||||
out.push((trf("treasury.content", &[t.gold.to_string(), tr(what)]), GOLD));
|
||||
}
|
||||
Kind::Lair => out.push((tr(if t.bed != 0 { "lair.taken" } else { "lair.free" }), DIM)),
|
||||
Kind::Torture => {
|
||||
let used = g.ents.iter().filter(|e| e.alive && e.hero && e.captive != 0).count();
|
||||
|
||||
Reference in new issue
Block a user