Tale (9): geschreeuw

Wednesday 18 April 2012, 15:32:00 | mud / i.f.

Deze keer iets meer detail over een nieuw commando: yell.

Met yell kun je iets schreeuwen. Iedereen in je huidige locatie hoort dat natuurlijk maar het leek mij wel aardig om het zo te maken dat ook anderen in de buurt het kunnen horen: de aangrenzende locaties! De logica om de aangrenzende locaties te bepalen en daar het geschreeuw ook te laten horen heb ik in een utility functie gezet, omdat andere code het ook wel eens zou kunnen gebruiken (bv als een NPC iets zou schreeuwen).

De code van het commando zelf is als volgt:

@cmd("yell")
def do_yell(player, parsed, **ctx):
    """Yell something. People in nearby locations will also be able to hear you."""
    print = player.tell
    if not parsed.unparsed:
        raise ActionRefused("Yell what?")
    message = parsed.unparsed
    if not parsed.unparsed.endswith((".", "!", "?")):
        message += "!"
    print("You yell:", message)
    player.location.tell("%s yells: %s" % (lang.capital(player.title), message), exclude_living=player)
    util.yell_to_nearby_locations(player.location, message)  # yell this to adjacent locations as well

Je ziet dat hij parsed.unparsed gebruikt om de tekst te bepalen die geprint moet worden. Het voordeel daarvan is dat je het bericht niet in quotes hoeft te zetten. Dat zou wel moeten als we het 'netjes' zouden parsen en gebruik zouden maken van parsed.message.

De utility functie is als volgt:

def yell_to_nearby_locations(source_location, message):
    """Yells a message to adjacent locations."""
    if source_location.exits:
        nearby_message = "Someone nearby is yelling: " + message
        yelled_locations = set()
        for exit in source_location.exits.values():
            if exit.target in yelled_locations:
                continue   # skip double locations (possible because there can be multiple exits to the same location)
            exit.bind(rooms)
            if exit.target is not source_location:
                exit.target.tell(nearby_message)
                yelled_locations.add(exit.target)
                for direction, return_exit in exit.target.exits.items():
                    if return_exit.target is source_location:
                        if direction in {"north", "east", "south", "west", "northeast", "northwest", "southeast",
                                         "southwest", "left", "right", "front", "back"}:
                            direction = "the " + direction
                        elif direction in {"up", "above", "upstairs"}:
                            direction = "above"
                        elif direction in {"down", "below", "downstairs"}:
                            direction = "below"
                        else:
                            continue  # no direction description possible for this exit
                        exit.target.tell("The sound is coming from %s." % direction)
                        break
                else:
                    exit.target.tell("You can't hear where the sound is coming from.")

Ik heb gepoogd om het bericht dat getoond wordt ook aan te vullen met een indicatie vanuit welke richting het geschreeuw afkomstig is. De meeste gebruikte richtings bepalingen zitten er wel in denk ik. Als het via een exit komt die een bepaalde direction heeft die afwijkt (b.v. "door") dan print hij een algemene tekst dat je niet kan bepalen waar het geluid vandaan komt.

Hier een kort stukje dialoog om te zien hoe dit er dan uit komt te zien:

>> !wiretap drone
Wiretapped drone.

>> up
[wiretap on 'drone': Arch wizard Irmen leaves.]
<mudlib.base.Location 'Tower attic' @ 0x23d3ff0>
[Tower attic]
The dark and dusty attic of the wizard tower.
There are piles of old scrolls and assorted stuff here of which you assume
it once held great magical power. All of it is now covered with a thick
layer of dust.
A small ladder leads back down to the hall.

>> yell Hello I'm in the attic
You yell: Hello I'm in the attic!
[wiretap on 'drone': Someone nearby is yelling: Hello I'm in the attic!]
[wiretap on 'drone': The sound is coming from above.]

>>