84 lines
2.9 KiB
Python
84 lines
2.9 KiB
Python
"""
|
|
Hall of Wings — Builds the central MemPalace zone in Evennia.
|
|
|
|
Usage (from Evennia shell or script):
|
|
from world.hall_of_wings import build_hall_of_wings
|
|
build_hall_of_wings()
|
|
"""
|
|
|
|
from evennia import create_object
|
|
from typeclasses.palace_room import PalaceRoom
|
|
from typeclasses.steward_npc import StewardNPC
|
|
from typeclasses.rooms import Room
|
|
from typeclasses.exits import Exit
|
|
|
|
HALL_KEY = "hall_of_wings"
|
|
HALL_NAME = "Hall of Wings"
|
|
|
|
DEFAULT_WINGS = [
|
|
"bezalel",
|
|
"timmy",
|
|
"allegro",
|
|
"ezra",
|
|
]
|
|
|
|
|
|
def build_hall_of_wings():
|
|
"""Create or update the central Hall of Wings and attach steward chambers."""
|
|
# Find or create the hall
|
|
from evennia import search_object
|
|
halls = search_object(HALL_KEY, typeclass="typeclasses.rooms.Room")
|
|
if halls:
|
|
hall = halls[0]
|
|
else:
|
|
hall = create_object(Room, key=HALL_KEY)
|
|
hall.db.desc = (
|
|
"|cThe Hall of Wings|n\n"
|
|
"A vast circular chamber of pale stone and shifting starlight.\n"
|
|
"Arched doorways line the perimeter, each leading to a steward's chamber.\n"
|
|
"Here, the memories of the fleet converge.\n\n"
|
|
"Use |wsummon steward|n to call your wing's steward, or\n"
|
|
"|wask <steward> about <topic>|n to query the palace archives."
|
|
)
|
|
|
|
for wing in DEFAULT_WINGS:
|
|
chamber_key = f"chamber:{wing}"
|
|
chambers = search_object(chamber_key, typeclass="typeclasses.palace_room.PalaceRoom")
|
|
if chambers:
|
|
chamber = chambers[0]
|
|
else:
|
|
chamber = create_object(PalaceRoom, key=chamber_key)
|
|
chamber.db.memory_topic = wing
|
|
chamber.db.wing = wing
|
|
chamber.db.desc = (
|
|
f"|cThe Chamber of {wing.title()}|n\n"
|
|
f"This room holds the accumulated memories of the {wing} wing.\n"
|
|
f"A steward stands ready to answer questions."
|
|
)
|
|
chamber.update_description()
|
|
|
|
# Link hall <-> chamber with exits
|
|
exit_name = f"{wing}-chamber"
|
|
existing_exits = [ex for ex in hall.exits if ex.key == exit_name]
|
|
if not existing_exits:
|
|
create_object(Exit, key=exit_name, location=hall, destination=chamber)
|
|
|
|
return_exits = [ex for ex in chamber.exits if ex.key == "hall"]
|
|
if not return_exits:
|
|
create_object(Exit, key="hall", location=chamber, destination=hall)
|
|
|
|
# Place or summon steward
|
|
steward_key = f"{wing}-steward"
|
|
stewards = search_object(steward_key, typeclass="typeclasses.steward_npc.StewardNPC")
|
|
if stewards:
|
|
steward = stewards[0]
|
|
if steward.location != chamber:
|
|
steward.move_to(chamber, move_type="teleport")
|
|
else:
|
|
steward = create_object(StewardNPC, key=steward_key)
|
|
steward.db.wing = wing
|
|
steward.db.steward_name = wing.title()
|
|
steward.move_to(chamber, move_type="teleport")
|
|
|
|
return hall
|