| """Live Realm Pulse — surfaces what the simulation is doing right now.""" |
|
|
| from __future__ import annotations |
|
|
| from world.book_of_ages import get_entries |
| from world.database import get_world_state |
| from world.events import get_active_world_event, get_recent_interactions |
|
|
|
|
| def render_realm_pulse(limit: int = 8) -> str: |
| """Ticker of recent world activity — encounters, events, arrivals.""" |
| state = get_world_state() |
| day = state.get("current_day", 1) |
| items: list[tuple[str, str, str]] = [] |
|
|
| event = get_active_world_event() |
| if event: |
| items.append(( |
| "event", |
| event.get("title", "Something stirs"), |
| event.get("description", "")[:160], |
| )) |
|
|
| for ix in get_recent_interactions(limit=4): |
| a = ix.get("entity_a_name", "Someone") |
| b = ix.get("entity_b_name", "someone else") |
| loc = (ix.get("location_name") or "").replace("The ", "") |
| items.append(( |
| "encounter", |
| f"{a} met {b}", |
| ix.get("book_of_ages_entry") or ix.get("description", "")[:140], |
| )) |
| if loc: |
| items[-1] = (items[-1][0], f"{items[-1][1]} · {loc}", items[-1][2]) |
|
|
| for entry in get_entries(limit=3, entry_type="arrival"): |
| items.append(("arrival", "A new soul arrived", entry.get("content", "")[:140])) |
|
|
| if not items: |
| return """ |
| <div class="realm-pulse"> |
| <div class="pulse-header"> |
| <span class="live-dot"></span> |
| <span class="pulse-title">Realm Pulse</span> |
| </div> |
| <p class="pulse-quiet">The world breathes quietly. Summon something — the Garden will remember.</p> |
| </div> |
| """ |
|
|
| cards = [] |
| for kind, headline, detail in items[:limit]: |
| cards.append(f""" |
| <div class="pulse-card pulse-{kind}"> |
| <span class="pulse-kind">{kind}</span> |
| <p class="pulse-headline">{headline}</p> |
| <p class="pulse-detail">{detail}</p> |
| <span class="pulse-day">Day {day}</span> |
| </div> |
| """) |
|
|
| return f""" |
| <div class="realm-pulse"> |
| <div class="pulse-header"> |
| <span class="live-dot"></span> |
| <span class="pulse-title">Realm Pulse</span> |
| <span class="pulse-sub">What happened while you were away</span> |
| </div> |
| <div class="pulse-track">{"".join(cards)}</div> |
| </div> |
| """ |
|
|