Python Mud (12): meer focus op IF, release op PypiWat 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 | read 0× | 0 Comments
Python Mud (11): save gamesHet 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' @ 0x24c0290> [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 here. >> !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 kitchen. 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 | read 0× | 0 Comments
IE's document compatibility modesIE's document compatibility mode selection. See below. Do NOT want 
The original can be found here, click this to also see the embeddd images that are not shown below.
Python Mud (10): heartbeats en deferredsTot 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 | read 6× | 0 Comments
Hi guys!HI GUYS! ..GUYS? ![[[image: tIkpl.jpg from i.imgur.com]]](http://i.imgur.com/tIkpl.jpg)
HELLO MY HONEY ![[[image: pB99U.jpg from i.imgur.com]]](http://i.imgur.com/pB99U.jpg)
OH, HI! ![[[image: XWK0H.jpg from i.imgur.com]]](http://i.imgur.com/XWK0H.jpg)
YO, 'SUP! ![[[image: waving-alligator-big.jpg from www.roflzoo.com]]](http://www.roflzoo.com/pics/042010/waving-alligator-big.jpg)
WELL HELLO THERE! ![[[image: ylAGR.jpg from i.imgur.com]]](http://i.imgur.com/ylAGR.jpg)
FFFUUUUU! ![[[image: Nhlwq.jpg from i.imgur.com]]](http://i.imgur.com/Nhlwq.jpg)
EHH, HI! ![[[image: ck2gU.gif from i.imgur.com]]](http://i.imgur.com/ck2gU.gif)
(reddit)
• Wrote irmen at 23:41 (edited 1×, last on 20 Apr 2012) | read 10× | 0 Comments
Python Mud (9): geschreeuwDeze 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 wellJe 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.] >>• Wrote irmen at 15:32 | read 7× | 0 Comments
GFWL echt waar... pffff... your save games aren't encrypted based on your Live ID, no, that would make too much sense.
They're encrypted based on your OS install. Meaning if you install a new OS on the same hardware, the encryption key changes. Which means I lost all my saved games.
WTF.
Meer anecdotal evidence om Games For Windows Live te mijden als de plaag. 
Python Mud (8): meer commando'sVorige edities:
other article
other article
other article
other article
other article
other article
other 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)
update:
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 3×, last on 18 Apr 2012) | read 13× | 0 Comments
Journey (PS3)![[[image: journey.jpg]]](/blog/files/plaatjes/journey.jpg)
Flow was aardig. Flower was geweldig. Journey is een onbeschrijflijke emotionele ervaring, en de soundtrack ervan is op zichzelf ook een meesterwerk.
Het gebeurt niet vaak dat ik zit te janken, maar het einde van Journey is zo overweldigend, dat ik het niet kon helpen
.
Ik zet dit spel in mijn top 3 van beste spellen ooit. (Zeker voor de belachelijk lage prijs. OK het is kort, je speelt het in 2-3 uur, maar dat doet er totaal niet toe als je aan het eind met een enorm gevoel van ontzag en verwondering naar het scherm zit te staren).
Het is eigenlijk Kunst.
• Wrote irmen at 00:50 (edited 2×, last on 15 Apr 2012) | read 20× | 3 Comments
Sealand/HeavenCo en oude tijdschriftenErg interessant artikel op Ars Technica afgelopen week: Death of a data haven: cypherpunks, WikiLeaks, and the world's smallest nation.
Het gaat over Seahaven / Havenco.
WTF dat is? Dan had je maar je oude Wired magazine van juli 2000 moeten bewaren zoals ik:
Wired 8.07 (juli 2000)
Het was toen de coverstory, en zoals in het artikel word gezegd: "Even today, it remains one of the best pieces of tech journalism of all time."
In de comments wordt verwezen naar een ouder artikel uit de Wired, dat nog beter zou zijn: Mother Earth, Mother Board door Neal Stephenson. Die gaat te lang terug (ik heb nog Wireds uit 1999 maar niet ouder) dus toch maar eens online lezen dan
Tech-nostalgie!
• Wrote irmen at 21:28 | read 26× | 2 Comments
Python Mud (7): parser en command api updatesVorige edities:
other article
other article
other article
other article
other article
other 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 | read 7× | 0 Comments
Python Mud (6): item verplaatsing en inventory fixesVorige edities:
other article
other article
other article
other article
other 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:
Python Mud (5): laatste paar commandsVorige edities:
other article
other article
other article
other 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 1×, last on 22 Mar 2012) | read 15× | 0 Comments
Python Mud (4): take ALL the things & teleport me out of hereVorige edities:
other article
other article
other 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 2×, last on 19 Mar 2012) | read 9× | 0 Comments
Python Mud (3): items en verplaatsingVorige edities:
other article
other article
Sinds de vorige versie is er een hoop veranderd onder de motorkap maar ook qua mogelijkheden.
Je kunt nu rondlopen! De exits doen het inclusief controles (b.v. normale spelers kunnen de wizard tower niet in komen). Tevens kun je nu items oppakken en wegleggen, en aan iemand anders geven (zolang die dat accepteert).
Vrijwel alle commands zijn uit de driver losgehaald en in eigen modules ondergebracht. Er is een opsplitsing tussen commando's die iedereen kan doen, en commando's waar je wizard privileges voor moet hebben. Middels een eenvoudige decorator @cmd("take") wordt de benodigde glue aan elk commando toegevoegd.
Wizards zien meer details over personen, npc's en items, en kunnen ze clonen en destroyen. Ze kunnen ook een 'wiretap' leggen op een living of een kamer, om de berichten die daarheen worden gestuurd, af te tappen.
Aggressieve acties die je tegen een monster pleegt (bv kick, taunt) zorgen ervoor dat het monster gaat aanvallen (combat zit er echter nog helemaal niet in).
Voor de volgende keer wil ik iets doen aan:
Een sessie met een paar nieuwe opties loopt nu als volgt, zie verder:
• Read more » • Wrote irmen at 20:00 (edited 3×, last on 10 Mar 2012) | read 24× | 0 Comments
Leukste toeval van 't jaar tot nu toeHoe leuk kan toeval zijn?
![[[image: irmentoeval.png]]](/blog/files/plaatjes/irmentoeval.png)
Dit mannetje is voor mij pas de 2e persoon in mijn hele leven die ik "ken" met dezelfde naam als ik 
VooruitgangEr lag een TDK SA-90 cassettebandje op de parkeerplaats vandaag. Iemand had dat uit z'n auto gegooid kennelijk (doen ze wel vaker, maar dan met name McDonald's Happy Meal verpakkingen
)
Zet je toch wel weer te denken:
![[[image: tapeipod.jpg]]](/blog/files/plaatjes/tapeipod.jpg)
Bijkomend voordeel ook nog natuurlijk dat flash ram niet in de knoop kan raken. Ook relevant:

Python Mud (2): eerste opzet driver en mudlibVorige edities:
other article
Wat meer werk gedaan aan de mud. Er is nu een soort van game 'driver' die de mudlib inleest, en een mainloop bevat voor invoer, verwerking en uitvoer.
Het is nog single-player en de code is nog rommelig (hardcoded commando's en zo) maar er zit wel een soort van vorm in die geschikt zou kunnen zijn voor een multiplayer input/process/output loop. De driver gebruikt de player/room/target messages uit de soul parser om de juiste tekst output te verdelen over de aanwezigen in een locatie (maar omdat het single-player is zie je op dit moment alleen nog maar de tekst die voor de speler zelf bedoeld is). Er zitten nog wat print-statements in, maar de meeste tekst output voor het scherm van de speler gaat nu al via een intern buffer i.p.v. rechstreeks naar het scherm. De driver leest dit buffer uit en kan het dan versturen waar het heen moet als hij daar aan toe is. Op dit moment alleen nog maar stdout naar het scherm, maar het is op deze manier later eenvoudig om te leiden naar de verbinding van elke speler.
De mudlib begint ook een beetje vorm te krijgen. Je kunt 'locations' (rooms) maken met beschrijving, 'exits' naar andere locations, en items en npc's bepalen die er in staan. Ik heb een soort van object hiërarchie bedacht (bv Living->Npc->Player) maar die staat nog een beetje in de kinderschoenen, wellicht later meer daarover. Er is een lijst van 'races' met een handvol 'stats' (overgenomen uit de Dark Souls mudlib) die je kunt toekennen aan een Living. Anders dan ze op het scherm kunnen printen met het 'stats' commando wordt er nog niks mee gedaan.
Voor de volgende versie ben ik van plan om iets te doen aan:
En voor nog later moet er een ontkoppeling komen van de input/process/output loop: het moet een 'driver heartbeat' loop worden die event-gestuurd is. Gezien het beperkte aantal gelijktijdige connecties zou alle parallelle processen best via threads gedaan kunnen worden, maar het lijkt me leuk om dat juist niet te doen en deze keer eindelijk een keer iets met coroutines of misschien zelfs greenlets te gaan doen. (elke NPC en speler in een eigen greenlet). We zien wel.
Een eerste sessie met een simpel aangemaakt karakter volgt hieronder...:
• Read more » • Wrote irmen at 22:14 (edited 3×, last on 10 Mar 2012) | read 20× | 0 Comments
Python Mud (1): Soul emotesBezig geweest om een zogenaamde "soul" van een oude LPC mudlib om te zetten naar modernere Python implementatie.
Uitgangspunt was ftp://ftp.lysator.liu.se/pub/lpmud/drivers/profezzorn/soul.c maar de code is bijna helemaal opnieuw geschreven. (Beschikbaar in mijn SVN server hier: svn://svn.razorvine.net/Various/Mud/trunk)
Ik ben vrij tevreden over wat er nu mogelijk is met de parser
Er zit een behoorlijke hoeveelheid 'emotes' in, waarbij je meestal ook een persoon kunt opgeven op wie het moet slaan. Ook is er een grote lijst met 'adverbs' aanwezig om het wat kleur te geven. Je kunt tenslotte ook nog een aantal speciale woorden gebruiken om aan te geven dat je iets probeert, of iets niet doet, of faalt om iets te doen.
Er zitten nog wat andere grappige dingen in:
Hier is een dump van een interactieve sessie:
C:\Python27\python.exe E:/projects/Mud/testsoul.py command?> look YOU ARE Fritz. YOU SEE: attractive Julie and mad Max command?> hello PLAYER: You greet everyone. ROOM: Fritz greets everyone. TARGETS : Fritz greets everyone.
... rest van de conversatie hieronder....:
• Read more » • Wrote irmen at 02:52 (edited 3×, last on 05 Mar 2012) | read 19× | 0 Comments
icon is the article's permalink.