Spinsels op het web
actions » SearchLogin 382 articles • 19 Apr 2014

Recent articles in 'MUD / I.F.'

Wednesday, 25 Sep 2013

permalink Tale: release 1.3

Previous installments.

Tale Release 1.3: what has changed?

  • improvements about global state (ongoing, paving the way for multi-user support)
  • mud_context is no longer a thread-local (will have to change again when multi-user support is implemented)
  • simplifications in tkinter gui event handling code
  • open/close/lock/unlock API change (actor is required, item is optional)
  • thread handling changed/simplified: driver loop always runs in background thread, GUI/console-io loop always runs in main thread. Even when the driver tick mode is synchronous (command-driven). Async-input code removed.
  • improved turns counter (errors in input should no longer count as a turn)
• Wrote irmen at 22:37 | read 106× | 0 Comments

Tuesday, 10 Sep 2013

permalink Tale: release 1.2

Previous installments.

Tale Release 1.2: what has changed?

  • uses readline (command-history) on supported systems
  • parser fixes regarding quoted messages and the say command
  • added a few more commands
• Wrote irmen at 23:44 | read 70× | 0 Comments

Thursday, 04 Jul 2013

permalink Tale has been moved to Github

I've moved a bunch of my projects from my personal Subversion server over to Github. Tale's source repository can now be found at: https://github.com/irmen/Tale

• Wrote irmen at 23:50 | read 74× | 0 Comments

Wednesday, 24 Apr 2013

permalink Tale (20): release 1.1

Previous installments.

Version 1.1: While I promised to actually start writing a comprehensive story/adventure, I found that I had too little inspiration to actually do this. Instead, I've tweaked some more stuff and ironed out some bugs that I wasn't happy with.

Tale Release 1.1: what has changed?

  • Money-less game is now possible by setting config.money_type to None.
  • Fixed various unit test and build/package related issues.
  • Fixed some colorama issues with the latest colorama version (for colored console output). Unfortunately this new version still has a few bugs on windows so most monkeypatching that I do has to remain.
  • Removed dependency on the blinker library; replaced it with a very simple pubsub module that is now part of Tale itself. This got rid of the wiretap bug on Python 3.3.
  • Added a few more commands, and command aliases are now shown separately in the help instead of a single huge list of commands.
  • <monospaced> ... </monospaced> style tags added. !events and the story banner are now printed in monospaced (in Gui mode)
• Wrote irmen at 00:46 | read 108× | 0 Comments

Thursday, 27 Dec 2012

permalink Tale (19): release 1.0

Tale has reached version 1.0 :-)

Previous installments.

Version 1.0: this means that I now think the actual framework features and API have reached a state where it should be possible to build a nice story on. That will be my main focus for the time to come: creating an actual interactive fiction to play.

There are still a lot of ideas and todo's (mentioned in the ideas.txt file in the distribution archive), but they are now more or less all "nice to have in a future version". While developing a proper story, I do expect to find problems and silly or cumbersome choices in Tale. I'll probably fix the nastiest ones immediately, but the focus now is first on creating a story with what we have.

Tale Release 1.0: what has changed?

GUI improvements

The gui now has text styling as well as a command-history. [[image: tale_gui2.png]]

Other new stuff

  • can use smartypants module to automatically create typographically pleasing quotes, dashes and a few other characters. (optional)
  • soul now understands pronouns to refer to earlier items/persons (hug it/her/him/them)
  • embedded a tiny demo story in the library (python -m tale.demo.story)
  • some internal API improvements (Exits, Hint system, deferreds)
  • improved the API sphinx docs
  • bugfixes
• Wrote irmen at 15:16 | read 104× | 0 Comments

Sunday, 16 Dec 2012

permalink Tale (18): GUI

A big visible change this time: Tale now also has a GUI, for if you don't like the text console interface :-)

Previous installments.

Tale Release 0.9: what has changed?


Tale's internal I/O handling has been completely rewritten. There are now "I/O adapters" that implement the actual input and output. Because of this, it had become fairly easy to create an I/O adapter that does its input and output by means of a graphical user interface, rather than text-based console.

[[image: tale_gui.png]]

There are still a couple of rough edges (no text styling, some text layout issues) but it is working quite nicely already. The dark red lines ("e", "examine rat") are user-entered commands.

Better text wrapping

Mainly for the text console interface: the text wrapping algorithm no longer gets confused by the embedded style tags in the text. It now ignores them and this means the text wrapping is no longer showing lines that are wrapped too early.

What's next?

Improve the GUI (really needs proper text formatting/styling).

• Wrote irmen at 19:11 | read 54× | 0 Comments

Tuesday, 04 Dec 2012

permalink Tale (17): pubsub and optimizations

It has been a while since I worked at Tale, my Mud/Interactive Fiction framework. I thought it would be nice to pick it up again. Main focus for now were some technical improvements.

Previous installments.

Tale Release 0.8: what has changed?

pubsub using blinker

I've started to use the third party library blinker as synchronous notification library. It provides decoupled signaling (or pub-sub if you wish). For now, it is used for the wiretap function in Tale, but could potentially be used for other synchronous notifications as well. Asynchronous notification must still be done using Deferreds.


Tale now has a simple virtual filesystem that provides data load and store functionality. Data is still being loaded as resources from the Tale package location itself. It is being written to the OS's user data folder (Tale uses the appdirs package for that). Savegames are also stored using the VFS now, so they end up in that location as well, and no longer inside the story's directory. This paves the way for a fully read-only story directory structure (and possibly for loading stories from a zip archive or similar).

other technical improvements

The command functions no longer get a dictionary ctx argument: now they get it as an object with proper attributes. (less error-prone, and IDEs provide auto-completion for this).

The wait command has been improved, you can now wait for a specific time as well, instead of just a given duration:

>> wait 1 hour and 20 minutes

  Time passes.  You've waited 1 hour and 20 minutes.

>> wait 1 h 10 m

  Time passes.  You've waited 1 hour and 10 minutes.

>> wait till sunset

  You can't wait more than two hours at once, who knows what might
  happen in that time?

>> time

  The game time is: 2012-04-19 16:30:00
  Real time is: 2012-12-04 00:04:17

>> wait till 18:00

  Time passes.  You've waited 1 hour and 30 minutes.

>> wait for myself

  You wait for arch wizard Irmen.


And last but not least, a lot of bugfixes have been done, especially to the 'move' command and when doing stuff on exits.

• Wrote irmen at 00:05 | read 80× | 0 Comments

Saturday, 07 Jul 2012

permalink Tale (16): hints

Previous installments.

Tale Release 0.7: what has changed?

hint system

Hint command and hint system added that can provide hints based on the current game 'state', location and custom filters if needed. The hint system also contains a recap command to remember key events of the story so far. You need to supply game state identifiers and hints yourself in your story configuration. Filling the recap messages has to be done by the story code too obviously. The demo story contains a simple use of both.

Various other small things:

Disabled text color output in unit tests, it sometimes screwed up the text output checks. Source code now uses unicode_literals for even more Python3 compatibility.

Added notify_moved on Item to act on item movement, and locking a door now actually locks it (typo fixed).

• Wrote irmen at 22:34 | read 57× | 0 Comments

Saturday, 26 May 2012

permalink Tale (15): more event handling

Previous installments.

Tale Release 0.5 and Release 0.6: what has changed?

Text output

Text layout has been rewritten in two helper classes, textoutput and paragraph. This fixed all known bugs. If you've installed the colorama package, tale will use that to spice up the console output a little bit (highlights/dim, no use of color yet).


Added event handlers: Location.notify_player_arrived/notify_player_left, Location.notify_npc_arrived/notify_npc_left.

Notify_action and the other notify_ event handlers are now queued in a new action queue in the driver, that is emptied when the processing of the player command has finished. This means for instance, that only after the player sees his new location (forced look command), the notify_player_arrived event fires. It used to fire at the exact moment the player object was inserted in the new room so the event fired before the player even got the chance to see the new room.


You can now define new commands or override existing ones in story packages. Object names are now always stored lower-case (except for Locations). The rat in the village now scuttles around.

short_description added that will be shown in the room 'look' text if set. If not, the generic line "XYZ is here."

door_code attribute and key-logic added to Door so you can lock/unlock it with a matching key object. The object just needs to have a matching door_code attribute, so you have some flexibility when creating objects to unlock doors in a totally different area/source file.

Removed score/max_score. Added some confirmation questions to 'dangerous' commands. Human NPCs now accept money by default.

The money type is now configurable per story, and the driver will contain an appropriate MoneyFormatter in driver.moneyfmt.

• Wrote irmen at 22:34 (edited 1×, last on 03 Jun 2012) | read 58× | 0 Comments

Monday, 21 May 2012

permalink Tale (14): separated the story files, mud/IF modes

Previous installments.

Tale Release 0.4: what has changed?

I've decided to continue this blog in English, it might appeal to a bigger audience than I had in mind earlier. :-)

Separated the story files

This is by far the biggest change; the story files are now kept in their own directory and Tale is now a real stand-alone framework. When launching the Tale game driver you now need to give the location of the story files you want to run. The distribution still has the demo story but it's now in a separate 'stories' directory.

MUD mode vs IF mode

The difference when running in multi-user MUD mode versus Interactive Fiction mode is now bigger:

  • IF stories usually provides their own prebuilt player character, it then no longer uses the character builder which is the default on MUD mode.
  • IF mode has a (configurable) line print delay to help the player to more easily follow what's being printed. You can change it with a command line option or via the new ingame config command.
  • MOTD has been disabled in IF mode, and a few immersion-breaking commands as well (such as stats, who).
  • MUD mode: disables story_complete. (you can't exit the game that way in mud mode!).

The driver uses IF mode by default but you can force it into MUD mode with a command line parameter.

Other stuff: There's a Resource manager class that allows the game code to link to resource files such as images or large text files that are embedded in the story's package path somewhere. Also used by tale itself to load the soul_adverbs.txt.

driver.clock : object that abstracts the game time and contains the config as well, to easily calculate game times, timespans, etc.

Some text layouting issues fixed (but not all, will do that next time)

Added an input() function to the driver that flushes pending output first, and strips the input before returning it. It's easier to always use this instead of calling [util.]input() yourself and dealing with these things.

Next time Right, I think the first things I'm going to do now is to fix the text layout bug regarding unformatted paragraphs (extra newlines appear). Also, maybe look into making the input case-insensitive so you can type "examine Laish" as well without getting an error. Lastly, it would be nice if stories could define new or override/disable existing commands. :-D

• Wrote irmen at 00:58 | read 367× | 0 Comments

Friday, 18 May 2012

permalink Tale (13): uitspelen, reageren op acties

Vorige edities.

Release 0.3: wat is er deze keer toegevoegd?

Je kunt het verhaal 'uitspelen'. Er is een story_completed exception en player status toegevoegd die gezet kan worden, waarna het game over is.

Score wordt gedisabled als MAX_SCORE=0/None, tijd/datum weergave disabled als DISPLAY_GAMETIME=False

'read' commando toegevoegd om dingen te kunnen lezen.

Driver heeft een state attribuut waar globale game state variabelen in geplaatst kunnen worden. Deze is ook beschikbaar op de context als 'state'. Wordt mee opgeslagen in savegames.

Location en player hebben een lijst met custom verbs die gezet kunnen worden om extra commando's te herkennen. Als je op een object self.verbs zet dan worden die vanzelf op de container gezet (location of player), en weer weggehaald als het object uit de container verdwijnt dmv remove. Een custom verb kan een bestaande verb overriden, maar als de handle_verb False teruggeeft, wordt alsnog de gewone verb uitgevoerd.

Reageren op acties

MudObject, Living, Exit: notify_action(parsed, actor), een handige manier om te reageren op acties. Gedefinieerd op Location, roept recursief alle items, livings en items in inventory aan. Het verschil met de gewone tell() aanroep is dat die alleen maar een stukje tekst meekrijgt, en niet recursief wordt aangeroepen. Waarom een event methode en niet een callback laten registreren? Dat laatste is weliswaar een stuk efficiënter maar het is veel handiger en minder foutgevoelig als dit soort events allemaal automatisch al verzonden worden. Als het allemaal te traag wordt zien we dan later wel weer. Er is ook een nieuwe @disable_notify_action decorator bijgekomen om bepaalde commands niet een notify_action event te laten triggeren.

player.peek_output() toegevoegd om b.v. vanuit een notify_action te kunnen spieken wat de output tot nu toe was (b.v. bij 'coin').

Custom verbs

Objecten (en livings) kunnen nieuwe 'verbs' definiëren, als voorbeeld staat er nu een computer in de 'Alley of doors' waar je commando's op kunt typen om de deuren van het slot te halen. Hij registreert een paar nieuwe verbs zoals 'hack', 'type' en 'enter'.

Ik heb het setup script wat verfijnd en een eerste opzet van Sphinx documentatie bijgevoegd.

Voor de volgende keer: wat bugs fixen die ik gaandeweg nog ben tegengekomen (b.v. alles is case-sensitive :-() en toch echt maar eens gaan beginnen aan het ondersteunen van losse game modules ipv hardcoded

• Wrote irmen at 20:40 (edited 1×, last on 20 May 2012) | read 148× | 1 Comments

Sunday, 13 May 2012

permalink Tale (12): meer focus op IF, release op Pypi

Vorige edities.

Wat is er deze keer toegevoegd?

(!) De naam van het project is nu officieel Tale. Er zijn setup scripts toegevoegd en het project is geregistreed op Pypi. Er is nog geen website voor en documentatie ontbreekt ook nog.

Voorlopig ligt de nadruk van de ontwikkeling met name op features die te maken hebben met het Interactive Fiction aspect van Tale. Het lijkt me namelijk voor de komende tijd leuker om een stabiel platform te hebben om een leuk IF verhaal mee te realiseren, dan een MUD. Het aardige is natuurlijk wel dat veel features die erbij komen voor IF, ook automatisch beschikbaar zullen zijn voor de MUD variant. Maar die laatste heeft nog veel werk nodig aan de netwerk-communicatie en multi-user kant en daar heb ik voorlopig even geen zin in. ;-)

Er zijn een stapel nieuwe commands toegevoegd: 'brief' commando om korte locatiebeschrijvingen aan en uit te zetten. activate, deactivate, turn [on,off], switch [on,off]: activeer/deactiveer een object, activate()/deactivate() methods. move, shove, swivel, shift, manipulate, turn, rotate, press, poke, push --> manipuleer een object (manipulate() method).

Algemene code verbeteringen: een reeks bugfixes waaronder een crash als je een exit noemde bij een soul emote zoals: push south. Onnodige room_exits parameter verwijderd uit parse methods. inventory en inventory_size zijn nu properties ipv methods. Extra unit tests.

Server tick synchroon met invoer van de speler:

Verder een vrij belangrijke aanpassing is dat het nu mogelijk is om met een setting in globals, de server 'tick' en gametime te synchroniseren met de invoer van de speler in plaats van dat ze asynchroon doorlopen. Dit betekent dat zolang de speler niets typt, er niks gebeurt in het spel. Pas bij invoer zal er een server 'tick' plaatsvinden en gebeuren er dingen. Als er meer 'realtime' gebeurtenissen nodig zijn dan is het handiger om de oude asynchrone server loop te gebruiken (waarbij de invoer van de speler in een aparte thread wordt afgehandeld).

Tale library versie toegevoegd, en REQUIRES_TALE_VERSION, zodat er alvast een check aanwezig is om de juiste versie te gebruiken voor een bepaald 'spel' dat voor/met Tale ontwikkeld is.

Voor de volgende keer: wellicht de mogelijkheid om daadwerkelijk het verhaal 'uit te spelen' en misschien ook om verschillende verhalen te kunnen starten (in plaats van dat zoals nu nog de wereld in de library zelf zit meegebakken).

• Wrote irmen at 23:26 (edited 2×, last on 20 May 2012) | read 68× | 0 Comments

Saturday, 05 May 2012

permalink Tale (11): save games

Vorige edities.

Het is nu mogelijk om de toestand van het spel op te slaan en weer in te lezen! (save/load). Dit is op een erg eenvoudige manier geïmplementeerd: hij slaat een pickle op van alle objecten die de spel wereld voorstellen (alle npc's, de locaties, alle items en de speler zelf natuurlijk). Dus er is wel een beperking: je kunt alleen objecten gebruiken de gepickled kunnen worden (of je moet je eigen getstate/setstate implementeren - dit heb ik hier en daar moeten doen in de basis objecten). Opnieuw laden kan nu alleen nog bij het (her)starten van het spel, niet middenin een lopende sessie.

Alle text output wordt nu netjes gelayout dmv textwrap! Voorbeeld:

>> !set irmen.screen_width=60

  <mudlib.player.Player 'irmen' @ 0x24dbdd0, privs:wizard>
  Field set: irmen.screen_width = 60

>> l

  <mudlib.base.Location 'Main hall of the Tower of Magic' @
  [Main hall of the Tower of Magic]
  The main hall of this ancient wizard tower sparkles with
  traces of magic.  Everything seems to glow a little from
  within.  You can hear a very faint hum.
  A heavy wooden door to the east blocks the noises from the
  street outside.  A small ladder leads up through a hole in
  the ceiling.  A door to the north leads to the kitchen.
  You see an oak table and a rusty key.  Mindless drone is

>> !set irmen.screen_width=90

  <mudlib.player.Player 'irmen' @ 0x25bedf0, privs:wizard>
  Field set: irmen.screen_width = 90

>> l

  <mudlib.base.Location 'Main hall of the Tower of Magic' @ 0x259f2b0>
  [Main hall of the Tower of Magic]
  The main hall of this ancient wizard tower sparkles with traces of magic.  Everything
  seems to glow a little from within.  You can hear a very faint hum.
  A heavy wooden door to the east blocks the noises from the street outside.  A small
  ladder leads up through a hole in the ceiling.  A door to the north leads to the
  You see an oak table and a rusty key.  Mindless drone is here.


Er zijn nog een paar nieuwe commando's bij gekomen: insult. again. show. score. time/date. transcript (heeft ook cmd-line optie).

Verder is er een standaard 'verb' op objecten. Als die niet speciaal gezet is, is hij standaard gelijk aan 'examine'. Dit betekent dat je niet meer "examine book" hoeft te typen, het volstaat om simpelweg "book" te typen.

Container-items die je bij je draagt hebben nu standaard achter hum beschrijving "(empty)" of "(containing things)" staan, zodat je snel kunt zien of er nog iets in zit. Wat er precies in zit moet je nog steeds gewoon bekijken dmv examine.

MudObjects bewaren nu oorspronkelijke title en description tekst ook als _title en _description zodat die te gebruiken zijn in eventuele @property varianten van title en description, waarbij alleen maar een stukje tekst erachter wordt gezet (zoals "(open)" en "(closed)")

• Wrote irmen at 18:16 (edited 1×, last on 20 May 2012) | read 105× | 0 Comments

Sunday, 22 Apr 2012

permalink Tale (10): heartbeats en deferreds

Vorige edities.

Tot nu toe was alles 'statisch' en gebeurde er alleen iets als je een commando intypte op de command line. Maar de server heeft nu een main loop gekregen en de user input/output gebeurt onafhankelijk daarvan. De main loop doet periodiek (1 keer per seconde op dit moment) een 'server tick' waarbij alle geregistreerde taken worden bijgewerkt.

Die taken kunnen zijn het bijwerken van de game clock (loopt op dit moment 5x zo snel als realtime dus 1 minuut in het echt is 5 minuten in game). Verder kunnen objecten een 'heartbeat' registreren en dan wordt deze elke server tick aangeroepen. (een handige shortcut hiervoor is de @heartbeat class decorator). Objecten kunnen echter ook een 'deferred' registreren bij de driver, dit is een functie die op een gegeven moment in de toekomst uitgevoerd wordt (je bepaalt zelf op welk moment).

Omdat objecten nu vaker iets met de driver moeten kunnen doen heb ik wat verbeterd aan de globale context zodat de driver overal globaal beschikbaar is.

Wait commando toegevoegd: wacht een bepaalde tijd (in-game). De server tick wordt als het ware vooruit gespoeld.

Flee: vlucht in een willekeurige richting

!return (stuurt iemand terug naar waar hij vandaan kwam voordat hij ge-teleport werd), !server (toont wat technische info over de toestand van de server), !events (toont alle geregistreerde heartbeats en openstaande deferreds).

Nog een paar codematige verbeteringen: er is nu een living.tell_others shortcut methode, omdat vaak dezelfde code werd gebruikt om een bericht te sturen aan alle andere personen in de locatie. Verder hebben alle objecten een init() method gekregen die door de echte __init__() wordt aangeroepen. Hierdoor is het vaak niet meer nodig om moeilijk te doen met het overriden van __init__ en het doorgeven van alle standaard parameters aan de base class.

Tenslotte: op unix platforms is er nu command line editing en history dmv readline.

Voor binnenkort: omdat ik eigenlijk ook wil dat deze code gebruikt kan worden om een single-player spel mee te maken (zeg maar een soort interactive ficition text-adventure) zal er op enig moment ook een save mogelijkheid beschikbaar moeten zijn die de hele game wereld opslaat. En bij load weer terug inleest zodat je kan doorgaan waar je was. Een simpele pickle van de driver of de player objecten werkt op dit moment niet omdat er functie objecten hier en daar zitten die niet gepickled kunnen worden (alsmede WeakSets). Maar toch wil ik proberen heer eerst meer aandacht aan te geven dan aan eventuele mud (multiplayer) zaken.

De code is trouwens allemaal GPL en hier in svn beschikbaar.

Stukje dialoog van hoe een paar npc's nu werken met hun heartbeat en deferred volgt hieronder:

    • Read more »
• Wrote irmen at 15:32 (edited 2×, last on 20 May 2012) | read 101× | 0 Comments

Wednesday, 18 Apr 2012

permalink Tale (9): geschreeuw

Vorige edities.

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:

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)
            if exit.target is not source_location:
                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"
                            continue  # no direction description possible for this exit
                        exit.target.tell("The sound is coming from %s." % direction)
                    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.]

• Wrote irmen at 15:32 (edited 3×, last on 20 May 2012) | read 64× | 0 Comments

Sunday, 15 Apr 2012

permalink Tale (8): meer commando's

Vorige edities:

  1. Soul Emotes remoteother article
  2. Eerste opzet driver en mudlib remoteother article
  3. Items en verplaatsing remoteother article
  4. take ALL the things & teleport me out of here remoteother article
  5. laatste paar commands remoteother article
  6. item verplaatsing en inventory fixes remoteother article
  7. parser en command api updates remoteother article

Een greep uit de nieuwe features die ik recentelijk heb ingebouwd:

Snapt nu namen met spaties: take red gem, examine steel key, enter first door. Go/enter/climb/crawl/run kan gebruikt worden om door een exit te stappen. Kan geen onzin meer doen op objecten zoals hug trashcan. Commando's dice/roll/coin om dobbelstenen en muntje gooien te simuleren. "use" verb die uitlegt dat je toch iets specifieker moet zijn. Een aantal extra cmd aliases toegevoegd zoals place=put, smell=sniff, jiggle=jerk=shake, search=locate (ipv een soul emote), steal=rob=take. Nieuw commando "throw" om spullen ergens tegenaan te gooien.

Er is geld! En je kunt het weggeven "give 12 dollar and 50 cents to irmen". Standaard is dollar/cents, maar het is eenvoudig te switchen naar gold/silver/copper als dat beter bij de setting past. Het is nog niet mogelijk om ergens geld in te stoppen of het op de grond te gooien in je huidige locatie. Dit komt omdat geld niet als 'object' in je inventory zit (maar een attribuut is op Living). Het is daarom ook niet mogelijk om geld te stelen van iemand.

Dmv RetrySoulVerb exception kan een cmd bepalen of het alsnog als soul verb uitgevoerd wordt (b.v. als er andere argumenten meegegeven worden dan door de cmd ondersteund wordt). Items hebben nu ook objective (it), possessive (its), subjective (it) net als Living (scheelt weer een isinstance check)


Nog een lading aanpassingen: Items hebben nu een contained_in en een location zodat ze op de hoogte zijn van de location waar ze zich bevinden (en b.v. berichten kunnen sturen)

Wizard aanpassingen: Insert/remove wordt nu altijd toegestaan. Exits commando geeft gedetailleerde informatie over de exits in je locatie. Alle wizard commando's beginnen nu met '!'.

Message-of-the-day toegevoegd + motd commando. Empty commando toegevoegd om de hele inhoud van een container eruit te halen.

Alle niet-soul-verbs ondersteunen eigenlijk geen qualifiers (zoals 'suddenly', 'fail') die worden nu afgevangen, en tell en say werken nu gewoon met de tekst zonder dat je die in quotes hoeft te zetten.

• Wrote irmen at 03:01 (edited 5×, last on 20 May 2012) | read 85× | 0 Comments

Saturday, 31 Mar 2012

permalink Python Mud (7): parser en command api updates

Vorige edities:

  1. Soul Emotes remoteother article
  2. Eerste opzet driver en mudlib remoteother article
  3. Items en verplaatsing remoteother article
  4. take ALL the things & teleport me out of here remoteother article
  5. laatste paar commands remoteother article
  6. item verplaatsing en inventory fixes remoteother article

Verbeteringen aan commando's: who is/who are voor info over npcs/spelers. Help is verbeterd. Je kunt nu met ?topic of what is topic specifieke help vragen over commands, emotes, items, npc's, enzovoort. Alle commands hebben een korte help-docstring gekregen. De API van commands krijgt nu de parse informatie door van de Soul parser en hoeft niet zelf meer string splitting te doen om te achterhalen wat er getypt is. Open/close/lock/unlock bestaan nu ook voor items en niet alleen meer voor deuren. Je kunt nu dus de vuilnisbak openen en dichtdoen bijvoorbeeld. Als hij dicht is kun je er niks in gooien.

Dynamische titels en beschrijving-teksten: d.m.v. het vervangen van de title en description attributes door een @property kun je dynamische teksten maken voor de titel en beschrijvingen van dingen. Voorbeeld object is de trashcan die leeg/vol is. Wanneer je een deur/exit examined kan hij nu aangeven of hij open of dicht is of op slot. Dit wordt normaal gesproken dan niet getoond bij een simpel 'look' (long_description)

Binnenkort toch donker/licht mogelijkheid maar eens proberen te maken. En ik vind eigenlijk dat je ook spaties moet kunnen gebruiken in namen: get red gem. examine first door/second door/... (zoals je hieronder in de [Alley of doors] kan zien zijn er vier deuren maar je moet ze allemaal een unieke naam geven zonder spaties, dat is voorlopig dus nog door1, door2, door3, door4... niet zo fraai :-( )

Een kort stukje dialoog met een paar nieuwe features volgt hieronder:

    • Read more »
• Wrote irmen at 23:58 (edited 1×, last on 20 May 2012) | read 72× | 0 Comments

Saturday, 24 Mar 2012

permalink Python Mud (6): item verplaatsing en inventory fixes

Vorige edities:

  1. Soul Emotes remoteother article
  2. Eerste opzet driver en mudlib remoteother article
  3. Items en verplaatsing remoteother article
  4. take ALL the things & teleport me out of here remoteother article
  5. laatste paar commands remoteother article

Deze keer een aantal structurele verbeteringen gemaakt in de manier waarop inventory en move geimplementeerd waren. Het was eerder mogelijk om zo maar dingen te verwijderen direct uit de inventory van een npc, en er waren problemen met het 'transactioneel' verplaatsen van dingen (dwz: alles lukt en X is weg uit A en zit nu in B, of het mislukt en er is niks gebeurd dus X zit nog steeds in A.)

De inventory is read-only geworden met access methods zodat je precies invloed hebt op wat er kan en mag met de inventory van een container item/npc/player. E zijn een hoop allow_ methodes verwijderd en de controle of iets mag, is nu ingebouwd in de nieuwe access methods.

Ik had eerst een aanpassing gemaakt om items te kunnen toevoegen en verwijderen met += en -= (__iadd__ en __isub__) maar hoewel dat lekker typt, is het niet geschikt. Je kunt namelijk geen actor bepalen op deze manier, en dat heb je soms nodig om te kunnen zeggen of een bepaalde actie mag of niet.

Er is nu ook een transactionele move() methode op Item en Living die voor correcte verplaatsing zorgt van A naar B.

Als je iets direct vanuit een kamer 'put' in een ander ding (b.v. put paper in trashcan) dan wordt nu eerst het object opgepakt vanuit de kamer, en dan in een losse stap daarna, in het andere object geplaatst. Dit is natuurlijker, en het lost een probleem op dat er was met items die je wel kan oppakken maar niet meer kan wegdoen (omdat ze een vloek hebben o.i.d.). Eerder werden deze gewoon naar het doel-object verplaatst, nu blijven ze achter in je inventory.

De baseobjects module heb ik gerenamed naar base, omdat hij heel veel gebruikt wordt en een korte naam dan eenmaal prettiger werkt.

Dingen die ik op korte termijn wil toevoegen:

  • Conditionele beschrijvingen van MudObjects. B.v. als het ergens donker of licht kan zijn dat dan de beschrijving van de locatie verandert. Of een vuilnisvat dat open of dicht is.
  • Het kunnen uitvoeren van een verb op een living/item als de standaard verb implementatie niet geschikt is (of als het een nieuwe verb is). B.v. "open trashcan" om hem open/dicht te doen. Standaard "open" verb werkt nu alleen nog maar op Exits/Doors.
  • Donker/Licht. Als het donker is, kun je niks zien (geen kamer, geen items, geen npcs, geen players, geen exits). "You are in a cave. It is pitch black."
• Wrote irmen at 13:40 (edited 2×, last on 20 May 2012) | read 108× | 0 Comments

Monday, 19 Mar 2012

permalink Python Mud (5): laatste paar commands

Vorige edities:

  1. Soul Emotes remoteother article
  2. Eerste opzet driver en mudlib remoteother article
  3. Items en verplaatsing remoteother article
  4. take ALL the things & teleport me out of here remoteother article

Ik heb snel nog een paar laatste commando's geïmplementeerd die wel nuttig leken: debug (wizard; dumpt alle interne attributen van iets), set (wizard; geeft een intern attribuut een andere waarde), who (toont speler informatie), open/close/lock/unlock (nodig voor deuren).

Verder is er nu een mechanisme om aliassen te kunnen definiëren voor items en npcs zodat je b.v. trashcan ook kan aanduiden als trash.

Er zijn nu deuren die open/dicht kunnen zijn en op slot.

Put & drop verbeterd voor items die je niet kan verplaatsen, en een aantal andere commando's doet betere checks op toegestane acties (drop, put, take, give).

De languagetools module naam vond ik te lang, hernoemd naar lang (pun intended)

Voorbeelden van de nieuwe commando's volgen hieronder:

    • Read more »
• Wrote irmen at 22:17 (edited 2×, last on 20 May 2012) | read 104× | 0 Comments

Thursday, 15 Mar 2012

permalink Python Mud (4): take ALL the things & teleport me out of here

Vorige edities:

  1. Soul Emotes remoteother article
  2. Eerste opzet driver en mudlib remoteother article
  3. Items en verplaatsing remoteother article

Veel verfijning deze keer met een paar aardige grote nieuwe features:

Python 3.x compatible (en 2.7).

Soul is intelligenter geworden. Hij herkent nu ook items waar je tegenaan kan schoppen etc. Dus in plaats van alleen 'kick idiot' kun je ook 'kick trashcan' doen. Verder is 'all' wat vriendelijker geworden; hij voegt alleen livings toe, ongelijk aan de player zelf (met "and me/myself" kun je dat weer toevoegen).

Wizards hebben nieuwe commando's gekregen: teleport (verplaats jezelf of iemand anders direct naar een bepaalde locatie), reload (reload python source), move (verplaats een item direct in een ander item of in iemands inventory).

Drop/take/give all: je hoeft niet langer elk item apart op te pakken.

put x|all [in] something, take x|all [from] something: je kunt dingen ergens in stoppen of ergens uit halen (als het een container is, zoals een zak of een vuilnisbak).

locate command: als je iets of iemand zoekt, toont deze de locatie ervan.

De command help is verbeterd (toont afkortingen ook).

Intern in de code is de containment van objecten vereenvoudigd, maar het is nog niet zo generiek als ik misschien zou willen, want het is nu bijvoorbeeld nog niet mogelijk om een living in een item te stoppen. Je kunt dus b.v. nog geen konijn oppakken, of je verschuilen in een kartonnen doos.

Voor de volgende keer:

Een korte sessie met een simpele demonstratie van een paar nieuwe features volgt hieronder:

    • Read more »
• Wrote irmen at 23:30 (edited 3×, last on 20 May 2012) | read 95× | 0 Comments

20 shown; more articles may be found in the archives. The permalink icon is the article's permalink.
Process times: page=0.082 request=0.090 cpu=0.090