pyrogue/game/world_tools.py

79 lines
2 KiB
Python

"""Functions for working with worlds."""
from __future__ import annotations
from random import Random
import g
from tcod.ecs import Registry, Entity
from tcod.map import Map
from game.components import Gold, Graphic, Position
from game.tags import IsActor, IsItem, IsPlayer, IsDoor
def add_wall(pos, remove=False):
r_pos = g.world_center + pos
map = g.world[None].components[Map]
map.walkable[r_pos.y][r_pos.x] = remove
map.transparent[r_pos.y][r_pos.x] = remove
def add_door(pos):
g.world.new_entity(
components={
Position: pos,
Graphic: Graphic(ord('\\'))
},
tags=[IsDoor]
)
add_wall(pos)
def new_world() -> Registry:
"""Return a freshly generated world."""
world = Registry()
g.world = world
map = world[None].components[Map] = Map(100, 100)
map.walkable[:] = True
map.transparent[:] = True
rng = world[None].components[Random] = Random()
world.new_entity(
components={
Position: Position(5,5),
Graphic: Graphic(ord('@')),
Gold: 0
},
tags=[IsActor, IsPlayer]
)
# player = world[object()] # <- das hier ist das gleiche wie das world.new_entity darüber
# player.components[Position] = Position(5, 5)
# player.components[Graphic] = Graphic(ord("@"))
# player.components[Gold] = 0
# player.tags |= {IsPlayer, IsActor}
for _ in range(10):
world.new_entity(
components={
Position: Position(rng.randint(0, 20), rng.randint(0, 20)),
Graphic: Graphic(ord("$"), fg=(255, 255, 0)),
Gold: rng.randint(1, 10)
},
tags=[IsItem]
)
for i in range(20):
if i == 5 or i == 9:
add_door(Position(10,i))
else:
add_wall(Position(10, i))
return world
def unlock_door(door: Entity):
door.components[Graphic] = Graphic(ord("_"))
door.tags.clear()
add_wall(door.components[Position], remove=True)