Skip to content

Commit 9c8eb5d

Browse files
committed
add shout, say and whisper commands (closes #32)
1 parent 27f9b5e commit 9c8eb5d

6 files changed

Lines changed: 62 additions & 13 deletions

File tree

‎src/fantasy_forge/area.py‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ def __iter__(self: Self) -> Iterator:
2222
for obj in self.contents:
2323
yield obj
2424

25+
@property
26+
def players(self: Self) -> str:
27+
from fantasy_forge.player import Player
28+
29+
return [
30+
player for player in self.contents.values() if isinstance(player, Player)
31+
]
32+
2533
def on_look(self: Self, actor: Player):
2634
self.messages.to(
2735
[actor],

‎src/fantasy_forge/l10n/en/main.ftl‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ void-name = the void
5757
void-description = a place filled with nothingness
5858
shell-invalid-command = This is not a valid command.
5959
shell-invalid-command-suggest = This is not a valid command. Did you mean { $closest_cmd }?
60+
player-shouts = { INTER($player) } shouts: { $message }
61+
player-says = { INTER($player) } says: { $message }
62+
player-whispers = { INTER($player) } whispers to { INTER($target) }: { $message }
63+
whisper-target-nonexistant = this player does not exist.
6064
quit-game-message-light = There is some light on the horizon, the first dancing rays of the sun.
6165
quit-game-message-dark = There is only pure nothingness that stares into your soul.
6266
quit-game-message-turtles = You look around, it's turtles, all the way down.

‎src/fantasy_forge/main.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ def main():
7575
else:
7676
player_name = args.name
7777
print()
78-
player = Player(world.messages, player_name, description)
78+
player = Player(world, player_name, description)
7979

8080
# main loop
8181
logger.info("starting mainloop for player %s" % player)
82-
player.main_loop(world)
82+
player.main_loop()

‎src/fantasy_forge/multiplayer.py‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ def handle(self):
4848
ip_adress = self.client_address[0]
4949
thread = current_thread().getName()
5050
print(f"new connection from {player_name} @ {ip_adress} on {thread}")
51-
player = Player(self.server.world.messages, player_name, player_description)
52-
player.main_loop(self.server.world, stdin=rfile, stdout=wfile)
51+
player = Player(self.server.world, player_name, player_description)
52+
player.main_loop(stdin=rfile, stdout=wfile)
5353

5454

5555
class ThreadedTCPServer6(ThreadingMixIn, TCPServer):

‎src/fantasy_forge/player.py‎

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from fantasy_forge.gateway import Gateway
99
from fantasy_forge.inventory import Inventory, InventoryFull, InventoryTooSmall
1010
from fantasy_forge.item import Item
11-
from fantasy_forge.messages import Messages
1211
from fantasy_forge.shell import Shell
1312
from fantasy_forge.weapon import Weapon
1413
from fantasy_forge.world import World
@@ -23,23 +22,25 @@ class Player(Character):
2322
shell: Shell
2423
seen_entities: dict[str, Entity]
2524
armour_slots: dict[str, Armour]
25+
world: World
2626

2727
def __init__(
2828
self: Self,
29-
messages: Messages,
29+
world: World,
3030
name: str,
3131
description: int,
3232
health: int = BASE_PLAYER_HEALTH,
3333
):
3434
super().__init__(
35-
messages,
35+
world.messages,
3636
dict(
3737
name=name,
3838
description=description,
3939
health=health,
4040
),
4141
)
42-
self.area = Area.empty(messages)
42+
self.world = world
43+
self.area = Area.empty(world.messages)
4344
# put us in the void
4445
# We will (hopefully) never see this, but it's important for the
4546
# transition to the next area.
@@ -370,14 +371,39 @@ def drop(self, item_name: str):
370371
item=item_name,
371372
)
372373

373-
def main_loop(self, world: World, stdin=None, stdout=None):
374+
def shout(self: Self, message: str) -> None:
375+
for area in self.world.areas.values():
376+
self.messages.to(
377+
area.players, "player-shouts", player=self.name, message=message
378+
)
379+
380+
def say(self: Self, message: str) -> None:
381+
self.messages.to(
382+
self.area.players, "player-says", player=self.name, message=message
383+
)
384+
385+
def whisper(self: Self, target: str, message: str) -> None:
386+
for player in self.area.players:
387+
if player.name == target:
388+
self.messages.to(
389+
[player, self],
390+
"player-whispers",
391+
player=self.name,
392+
target=target,
393+
message=message,
394+
)
395+
break
396+
else:
397+
self.messages.to([self], "whisper-target-nonexistant")
398+
399+
def main_loop(self, stdin=None, stdout=None):
374400
"""Runs the game."""
375401
if stdout is None:
376-
print(world.intro_text)
402+
print(self.world.intro_text)
377403
else:
378-
stdout.write(world.intro_text + "\n")
379-
self.shell = Shell(world.messages, self, stdin=stdin, stdout=stdout)
380-
self.enter_area(world.spawn)
404+
stdout.write(self.world.intro_text + "\n")
405+
self.shell = Shell(self.world.messages, self, stdin=stdin, stdout=stdout)
406+
self.enter_area(self.world.spawn)
381407
self.shell.cmdloop()
382408
# afterwards, leave the current area
383409
self.leave_area()

‎src/fantasy_forge/shell.py‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,17 @@ def do_drop(self, arg: str) -> None:
332332
"""
333333
self.player.drop(arg)
334334

335+
def do_shout(self, arg: str) -> None:
336+
self.player.shout(arg)
337+
338+
def do_say(self, arg: str) -> None:
339+
self.player.say(arg)
340+
341+
def do_whisper(self, arg: str) -> None:
342+
target, message = arg.split(" ", 1)
343+
self.player.whisper(target, message)
344+
# TODO: add support for players with spaces in their names
345+
335346

336347
if TYPE_CHECKING:
337348
from fantasy_forge.player import Player

0 commit comments

Comments
 (0)