More graphical finesse: own beds per creature, animated room furniture, treasure chests, elaborate core and portals, worn floors

- props.rs: furniture drawn near the camera every frame
  - beds built by each creature on arrival, matching its kind (straw, web, starry cushion,
    fur pile, chain bunk, ember cushion, rock hollow, camp bed); gone when the owner is
  - training: spinning dummies, weapon racks, wobbling targets; torture: turning wheel,
    iron maiden, brazier with glowing coals; temple: altar with candles and fire bowl,
    candle stands; library: book shelves, lecterns with floating books while studying
  - treasure chests in the treasury, closed when empty, filled with their treasure otherwise
- Soul core: stepped obsidian pedestal, four spikes with energy threads, circling runes,
  unsteady pulse when hurt
- Portals: circle of standing stones with runes, column of light and rising sparks
- Floors: cracked, chipped and shattered stones, grit and crack decals

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Richard ZinkandClaude Opus 5.5 committed 2026-11-03 12:30:30 +01:00
1 parent 036c13577c
commit 75232d95ee
5 files changed
+609 -42

No files matched your search

+11
View File
@@ -2282,6 +2282,17 @@ impl Game {
}
if e.think <= 0.0 {
e.think = 0.4 + self.rng.f() * 0.3;
// a new creature builds its own bed in the lair soon after its arrival
if e.bed.is_none() && self.counts[1] > 0 && !matches!(e.job, Job::Attack(_) | Job::Leave | Job::Rally) && self.rng.f() < 0.15 {
let cur = e.tile();
if let Some(p) = self.map.search(cur, self.map.walk_cost(), |i| self.map.t[i].kind == Kind::Lair && self.map.t[i].bed == 0, true) {
let b = p.last().copied().unwrap_or(cur);
self.map.t[b].bed = me;
e.bed = Some(b);
let (bx, by) = xy(b);
self.fx(8, bx as f32 + 0.5, by as f32 + 0.5, 0.0, 0.0, 0.6, 0xff40d0ff);
}
}
if !matches!(e.job, Job::Attack(_) | Job::Leave) {
let radius = if e.job == Job::Rally { 8.5 } else { 7.0 };
if let Some(id) = self.nearest_enemy(e, radius) {