tag:blogger.com,1999:blog-83382604440578325832024-03-14T04:16:16.499+01:00Griatch's Evennia musingsEvennia MUD server developmentGriatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.comBlogger69125tag:blogger.com,1999:blog-8338260444057832583.post-41696816266112738182021-11-18T22:53:00.003+01:002021-11-20T15:31:56.030+01:00The Evennia blog has moved to evennia.com! <p>This dev blog has moved! All past and future posts will now be found <a href="https://www.evennia.com/devblog/" target="_blank">here instead</a> on evennia.com. The linked post discusses the move in more detail, including the little custom blog platform I wrote for it.</p><p><br /></p><p>The new blog has a new RSS feed address, so if you follow this blog via RSS, update your feed link (all old entries were migrated as well).<br /></p><p><br /></p><p>The old posts here on blogspot/bloggly will remain but won't be updated anymore.</p><p>Cheers,</p><p>Griatch</p>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-37119183590047425512021-03-21T12:59:00.001+01:002021-03-21T13:03:44.229+01:00Where do I begin? (repost)<div style="text-align: left;"><div class="separator"></div><p><i></i></p><blockquote><i><span style="font-size: x-small;">This is a repost of an article I originally wrote for the Imaginary Realities e-zine, Volume 7, issue 3 back in 2015. It's not Evennia-specific but meant for a wider audience interested in making a text-based multiplayer game (MUD/MU*). Since IR is no longer active, I repost it here with only some minor cleanup. </span></i></blockquote><br /><p></p><h1>Where do I begin?</h1><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">by Griatch </span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 10pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">(image from <a href="http://deviantart.com/griatch-art">deviantart.com/griatch-art</a></span>)<span style="background-color: transparent; color: black; font-family: Arial; font-size: 10pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"></span></p><br /></div><div style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="border: medium none; clear: right; display: inline-block; float: right; height: 236px; margin-bottom: 1em; margin-left: 1em; overflow: hidden; width: 344px;"><img alt="yellow_world_by_griatch_art-d7a6e5n.jpg" height="236" src="https://lh3.googleusercontent.com/-qJ589ckRG0OrqrQa4KbgYSGMiezN3QFYKl7Iv8ZTRJ-5zQ1FQZySPHYDmQfm383XONU9KoOXPLaQTXGd2xHubHfNKSEL9gICK98ENyPcExOE0MaqR8Ddac3ZZr_8d_ffV6c0YM" style="margin-left: 0px; margin-top: 0px;" width="344" /></span>When a new user has everything installed and drops into Evennia’s IRC support chat or mailing list, there is one question that we regularly get in various variations: </div><br /><div><i><br />“Where do I begin?”</i><br /><span style="font-family: inherit;"><br /><br />How to actually start down that long road towards your own game is an important question. Unfortunately it has no one-size-fits-all answer. So it usually leads to a series of counter-questions. In this article I will try to (without being Evennia-specific) pose those questions in a way that would not fit in a chat window. </span></div><div style="text-align: left;"><span style="font-family: inherit;"> </span><br /><br /><h2>What is your motivation for doing this?</h2><br />So you want to make a game. First you need to make a few things clear to yourself. <br /><br />Making a multiplayer online game is a big undertaking. You will (if you are like most of us) be doing it as a hobby, without getting paid. And you’ll be doing it for a long time. <br /><br />So the very first thing you should ask yourself (and your team, if you have any) is why am I doing this? Do some soul-searching here. Here are some possible answers: </div><div style="text-align: left;"><br /><ul style="text-align: left;"><li>I want to earn recognition and fame from my online community and/or among my friends.</li><li>I want to build the game so I can play and enjoy it myself.</li><li>I want to build the same game I already play but without the bad people.</li><li>I want to create a game so that I can control it and be the head honcho.</li><li>A friend or online acquaintance talked me into working on it.</li><li>I work on this because I’m paid to (wow!)</li><li>I only build this for my own benefit or to see if I can pull it off.</li><li>I want to create something to give back to the community I love.</li><li>I want to use this project as a stepping-stone towards other projects (like a career in game design or programming).</li><li>I am interested in coding or server and network architectures, making a MUD just seems to be a good way to teach myself. </li><li>I want to build a commercial game and earn money.</li><li>I want to fulfill a life-long dream of game making.<br /></li></ul><br /><br />There are many other possibilities. How “solid” your answer is for a long-term development project is up to you. The important point is that you ask yourself the question. <br /><br /><br />Answering this question you may find that you should not start a new project - maybe it’s better to build on or help improve something that already exists. Maybe you find you are more of a game engine developer than a game designer. Some answers may also suggest that you are driven by emotions of revenge or disconcert - emotions that may have abated later when the project most needs your enthusiasm and motivation. <br /><br /><br />If your aim is to earn money your design goals may well be very different from those of a person who only builds for their own benefit.<br /><br /><br />Whichever your motivation, you should at least have it clear in your own mind. It’s worth to make sure your eventual team is on the same page too. <br /><br /><h2>What are your skills?</h2><h2> </h2><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">Once you have your motivations straight you need to take stock of your own skills and the skills available in your team, if you have one.<br /><br />Your game will have two principal components and you will need skills to cater for both: <br /> </p><ul style="text-align: left;"><li>The game engine (“the code base”)</li><li>The assets created for using the game engine (“the game world”)<br /></li></ul><br /><h2>The game engine</h2><h2> </h2><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">T</span>he game engine is maintained and modified by programmers (coders). It represents the infrastructure that runs the game - the network code, the protocol support, the handling of commands, scripting and data storage. <br /><br /><br />Creating your game engine from scratch can be a worthwhile and rewarding endeavour. It is however not a small one and if your main goal is to create a running game I would recommend building on an existing engine. It’s worth to take your time and do your research here. Searching the net and various MUD sites will bring you a slew of options. I will give some things to look for here.<br /><br /><br />Whereas some engines/code bases offer a lot of pre-existing coded systems, there is no denying that your team will always need someone who either already knows some basic programming or is willing to learn it. <br /><br />When judging which engine you want to use, consider: <br /><br /></p><br /><ul style="text-align: left;"><li>The engine’s community - hang out in the community/forums/chat surrounding the respective engine. Expect to need to ask a lot of “stupid” questions as you start developing (hint: no question is stupid). Is this a community in which you would feel comfortable doing so?</li><li>Active development - is the code base actively maintained? If there are bugs in the engine, does it seem likely they will be fixed upstream or will you be patching bugs yourself? Or alternatively, are there many active users that can help you out with known quirks?</li><li>Other available documentation - does the engine come with a manual? Are there online tutorials or other help resources to read?</li><li>Which language is the engine coded in? What is it scripted in? Do you or your team already know this language or are you willing to learn it? </li><li>If you don’t know the language, do a few beginner tutorial so that you can at least vaguely recognize the syntax. Does the engine’s code seem easy to read and well documented? If the engine is poorly documented, the time of development may rise dramatically. </li><li>Something to remember here is that computers of today are very powerful. And while scaling may be interesting if your game really takes off, a text game is, for the most part, not very demanding. So I’d recommend you pick your language and engine not primarily based on performance but on what you feel comfortable and productive working with. </li><li>What is the engine’s license? This is mainly important if you plan to ever earn money with your game. Some common engines explicitly forbid commercial use.<br /></li></ul><br /> <h2>Asset creation</h2><h2> </h2><h2></h2>Compared to the level of work needed to produce professional graphics for an MMORPG, detailed text assets for a mud are cheap to create. This is one of the many reasons muds are so well suited for a small team.<br /><br /><br />This is not to say that making “professional” text content is easy though. Knowing how to write imaginative and grammatically correct prose is only the minimal starting requirement. A good asset-creator (traditionally called a “builder”) must also be able to utilize the tools of the game engine to its fullest in order to script events, make quests, triggers and interactive, interesting environments. <br /><br /><br />Some game engines will offer generic online building tools while others will depend on the coders to create tools specific for their game. What you go for may be influenced by just how technically savvy your builders are and what skills they are willing to pick up along the way. <br /><br /><br />Your team’s in-house builders will be the first ones to actually “use” your game framework and build tools. They will stumble on all the bugs. This means that you need people who are just not “artsy” or “good with words”. Assuming coders and builders are not the same people, builders need to be able to collaborate well and give clear and concise feedback.<br /></div><div style="text-align: left;"></div><div style="text-align: left;"><br /><h2> </h2><h2>So, where <i>do</i> I begin?</h2><br /><br />Right, after all this soul-searching and skill-inventory-checking, let’s go back to the original question. And maybe you’ll find that you have a better feeling for the answer yourself already:</div><div style="text-align: left;"><br /><br /><ul style="text-align: left;"><li>If you are learning a new programming language, you should follow basic tutorials so that you can read, understand and replicate example code without being completely in the dark.</li><li>If you have decided on your game engine you should dive into its manual and basic tutorials. Also make sure to introduce yourself to its community so you can get as much help as possible. </li><li>If the game engine offers tutorials on making some small example game, do that carefully. Even if the resulting demo game has nothing to do with what you aim to build. If there are no tutorials maybe you can instead find a full example code that you can examine in the same way. Not only will this give you a better understanding of how parts of the engine hangs together, it will also give you ideas for what you can do with it. If something is surprisingly easy to do, you might even be able to expand your plans! </li><li>If your game engine comes with pre-made game tools or building commands, the builders can start getting familiar with it. But keep in mind that these will not reflect the full capabilities of the game - your game is not yet built! So don’t set builders off to build large zone projects at this point. If they are building anything at all, it should be small test areas in order to agree on a homogenous form, mood and literary style.<br /></li></ul><br /><br />With a few tutorials and game examples under your belt you are ready to start some preliminary coding-tests of your own. You won’t be making a full game yet! Working without a step-by-step tutorial will give you an idea of just how easy or hard this stuff is to figure out in practice at your current skill level, chosen game engine and language. Make ample use of any manuals, help channels or other resources you can find - anything you will also have access to when you code the real thing. This allows you to judge the quality and usefulness of those resources at the same time. </div><div style="text-align: left;"><br /><br />You or any builders may also get some building exercise here, using the commands and objects you create for simple testing. Here is a list of things to try out (you should be able to do these in any game engine worth its salt):<br /><ul style="text-align: left;"><li>Change some phrasing in the output of an already existing command.</li><li>Make a new command and add it to the game engine. Make it just echo back whatever argument you give it. </li><li>Code an object that echoes “tick” to everyone at its location every 20 seconds.</li><li>Make a new command that creates new ticking objects where you are, but with a name given by you. </li><li>Make a room whose description changes every time you enter it.</li><li>Make an object that deletes itself when its “health” property is changed to zero. </li><li>Make an “attack” command that randomly reduces the “health” property of a target object until it deletes itself.</li><li><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"></span>These are all simple things but it should give you an idea of what your chosen game engine is capable of and, most importantly, where to find help when you get stuck. If you can’t get past this step even with help you might need to go back and read up on the programming bit some more. Or maybe you should consider an easier game engine.<br /><br /></li></ul><h2>What is your scope?</h2><br />We are now past the “things to do first”. Welcome to the things you do later.<br /><br /><br />To reiterate, at this point you should have pondered why you are doing this and made an inventory of your available skills. You have gotten a first taste of the kind of coding work you will need to do and what that entails. You have built a few things to see how that works. Maybe you even changed game engine somewhere in the middle. Still ready to roll? Excellent. <br /><br /><br />You should now hopefully have enough information to be able to realistically set the scope of your game. <br /><br /><br />Everyone wants to make the best game ever. You want a whole world simulated in minute detail with next-generation artificial intelligence. You want instant action that puts Hollywood to shame and emergent storytelling worthy of Shakespeare. <br /><br /><br />It’s okay to dream big, but your first goal now is to get something out. Something that players can actually connect to and give feedback on. Having players enjoying an early version of your game is a great motivational boost in itself, you should try to reach that stage quickly. You are aiming for a first version, not the ultimate version. All online mmo:s keep improving the game after release, that’s the name of the game. </div><div style="text-align: left;"><br /><br />So keep your grand plans in mind but limit your scope for your first release. For a group of hobbyist developers (which is, frankly what almost all MU* development teams are) your motivational time is precious. You are likely not getting paid during development which means that it’s imperative that you set out to create something you are capable of finishing while still having fun. Adjust the scope to fit this time. If you run out of steam before this time you’ll know you went for too big a scope.<br /><br /><br /><h2>How to continue from here?</h2><br /><br />How to progress is depending on your preference. Some prefer to just jump straight into coding and figure out things as they go. It's not a bad idea to to sit down and plan a little first though - and remember that you want <i>a first version</i> of your game at this point, not the <i>final, ultimate</i> version. </div><div style="text-align: left;"> </div><div style="text-align: left;">This is beyond the first question asked in this article (which is long enough as it is) but I have written about this process in <a href="https://www.blogger.com/#">Evennia’s game planning documentation</a>. This reiterates some aspects of this article while expanding on others. </div><div style="text-align: left;"><br /><br />… But in the end, remember that what kills a hobby game project will usually be <i>your own lack of motivation</i>. So do whatever you can to keep that motivation burning strong! Even if it means deviating from what you read in articles like this one. Just get that game out there, whichever way works best for you.</div><div style="text-align: left;"><br /><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">Griatch is the lead developer of </span><a href="http://www.evennia.com/" style="text-decoration: none;"><span style="-webkit-text-decoration-skip: none; background-color: transparent; color: #1155cc; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration-skip-ink: none; text-decoration: underline; vertical-align: baseline; white-space: pre;">Evennia</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">, </span></p><p style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">the MU* creation library.</span></p></div>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-26712095362369329072021-01-01T13:38:00.003+01:002021-01-01T13:38:35.777+01:00Happy new years 2021! Evennia things to come this year<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiODPgOIKLPYSnlfeHcSXVCaiw4UsRcYHarYokO4Trj1Hoe1fMniZAO2aRmm7BVc3P4wm-OfCgYyyQtZWi69p1kOK_CAKKwJhfZXaITGk4iVHIlYAE4BfkJZnlBWQ9qtKyGuLo1moGd8Qw/s2048/1a1-sydney_new_years_eve_2008.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1536" data-original-width="2048" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiODPgOIKLPYSnlfeHcSXVCaiw4UsRcYHarYokO4Trj1Hoe1fMniZAO2aRmm7BVc3P4wm-OfCgYyyQtZWi69p1kOK_CAKKwJhfZXaITGk4iVHIlYAE4BfkJZnlBWQ9qtKyGuLo1moGd8Qw/s320/1a1-sydney_new_years_eve_2008.jpeg" width="320" /></a></div><br /><p><span style="font-size: x-large;">A</span>nother year passed with Evennia, the Python MU* creation system. The past year saw a lot of bug fixing and more gradual additions and in September we released version 0.9.5. This was an intermediary version on our way to 1.0. Time to look forward to next year. </p><p>On my development horizon for 2021 are the main new features planned for v1.0. Some of these are rather big things I've wanted to get around to for a while. They are all happening in the <i>develop</i> branch of Evennia, which is currently <i>not</i> recommended for general use.</p><p></p><ul style="text-align: left;"><li><b>SessionDB: </b>In the current Evennia, Sessions (the representation of a single client connection) is an in-memory entity. This is changing to be a database-backed entity instead. One will be able to typeclass Sessions like other entities for easier overriding. This change also means that there will be one single point of session-id (the django-session), alleviating some reported issues where the Portal- and Server-side sessions have drifted out of sync. It will also make it a lot easier to support auto-logins, also across server reboots. Db-backed Sessions will also simplify the Portal-Session interaction a lot. </li><li><b>Script refactor: </b>The Scripts will see some refactoring, mainly because they are used more as general-storage entities compared to the timers they were originally meant to be. These days Evennia also offers a range of other timer-mechanisms (tickers, delays, Events etc), so it's less important to rely on Scripts for this functionality. The most important change will be that the timer will required to be explicitly started (instead of always starting on script-creation). It will also be possible to stop the timer without the script getting deleted (so separating the timer from the Script's life-cycle). </li><li><b>Channel refactor:</b> The Channels will also see changes; notably to make it considerably easier to override and customize them per-caller. Today the Channel typeclass has a maze of different hooks being called, but it's harder for devs wanting users to customize their channel output. So one of the changes will be new hooks on the account/object level for allowing to format the channel output per-user. There will also be a cleanup of the existing hooks to make things clearer. </li><li><b>New starting tutorial:</b> As part of the new documentation, I'm writing a new starting-tutorial. This will consolidate many of the existing beginner tutorials in a consistent sequence and if following it to the end, the reader will have created a small beginner game with everything in place. I plan to make a few new contribs to support this.</li><li><b>Contrib restructure:</b> Our contrib/ folder is getting a little cluttered. I'm investigating organizing things a little differently by at least moving things into categorized folders. This will lead to people having to change their imports, but we'll see just how it goes.</li><li><b>Documentation cleanup: </b>There are a lot of small changes, cleanup and restructuring needed in the docs overall - many of the existing pages are auto-translated from the old wiki and need rewriting both in style and content. The whole idea of moving to the new doc-system is to be able to update the docs alongside the code changes. So hopefully the changes to Sessions, Scripts and Channels etc will all be covered properly from the onset rather than after release (as was the case with the wiki). </li><li><b>Unittest coverage: </b>Our current test coverate is 64%, we need to expand this. I hope to get to at least 70% before v1.0 but that is less of a strict goal.</li><li><b>Evennia PYPI package:</b> This will be one of the last things before the release of 1.0 - Evennia will be put onto PYPI so you can install with <b>pip install evennia</b>. Once we do it will simplify the install instructions dramatically for those not interested in contributing to Evennia proper.</li></ul><div>We also have some pull-requests in the making that will be interesting to have in the system, such as Volund's plugin system, making it easier to inject custom settings on the fly (good for contribs wanting to add their own database tables, for example). </div><div><br /></div><div>A lot of work to do as usual! </div><div><br /></div><div><b>Thanks</b> for the past year, everyone - thanks to all of you that contributed to Evennia with code or by reporting issues or coming with feedback. Thanks particularly to those of you willing (and able) to chip in with some financial support for Evennia development - that's very encouraging! </div><div>And finally, a big thanks to all of you taking part in community discussions, both you asking questions and you helping to answer them tirelessly and with good cheer - you make the Evennia community the friendly, inviting place it is!</div><div><br /></div><div>May all our game development move forward and our hard drives stay healthy for another year. </div><div><br /></div><div>Cheers and a Happy new year,</div><div>Griatch</div><p></p>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-42113175211906177302020-11-14T18:46:00.005+01:002020-11-14T19:01:37.531+01:00Evennia 0.9.5 released!<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggjVvIxyKB2BqTLFrbT_h_wIgG5AaKVyF9iDOYyFRU7YbbUGnOlh7XZwXDLBZflTosPrs8Oz1jThZQpwBbfhEeZjU-RkGCtd45-8iJ7uIfrMCRNkLbH6Hv0GBdBACmCv7-BIDD3el2o-4/s1544/evennia_screenshot.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1035" data-original-width="1544" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggjVvIxyKB2BqTLFrbT_h_wIgG5AaKVyF9iDOYyFRU7YbbUGnOlh7XZwXDLBZflTosPrs8Oz1jThZQpwBbfhEeZjU-RkGCtd45-8iJ7uIfrMCRNkLbH6Hv0GBdBACmCv7-BIDD3el2o-4/s320/evennia_screenshot.png" width="320" /></a></div>As of today, Evennia 0.9.5 is out. Evennia is a Python based library and framework for creating text-based multiplayer games (MUD/MU*). <p></p><p>This is a gradual improvement halfway between 0.9 and the upcoming 1.0. So if you have been keeping up-to-date with the <i>master</i> branch of Evennia over the last year you will not notice much difference from this release (time to upgrade if you haven't been keeping up though!). </p><p>While an interim release, there are still a lot of things that has happened since v0.9: </p><h4 style="text-align: left;">Webclient improvements <br /></h4><ul style="text-align: left;"><li>Big <b>web client</b> improvements (courtesy of contributor friarzen) - players can now save and restore pane layouts directly in the client (so you could have a separate pane for channel chatter, another for look-returns, two input panes etc etc). </li><li>The layout changes makes it easier for devs to create default layouts to offer to players of their game. People in the Evennia community have already started doing very cool stuff with this, I'll try to gather screenshots for a future blog. <br /></li><li>Allow to redirect video/music to separate panes.</li><li>Many other fixes, such as improving the input-history behavior. <br /></li></ul><h4 style="text-align: left;">EvMenu improvements</h4><p><b>EvMenu</b> is a powerful system for creating in-game text menus.<br /></p><ul><li>The <b>EvMenu </b>class was refactored to be easier to override. For example, all messages now go through <b>EvMenu.msg</b> which allows for easy customization. It also defaults to sending with a <b>type</b> of "menu", making it easier to redirect menus to seprate panes in the webclient.</li><li>In a node, EvMenu is now accessed via the much more logically named <b>.ndb._evmenu</b> instead of <b>.ndb._menutree</b> (the old name still works for backwards
compatibility, but is deprecated).</li><li>New optional <b>EvMenu template</b>
system for quickly building simpler
EvMenus without needing so much code. This makes it easy to catch and
parse arbitrary input from the user and redirect to the correct node as
needed. Creating menu nodes as functions still work (and is a lot more
powerful), this can be mixed with templating to create different
effects. <br /></li></ul><h4 style="text-align: left;">New settings</h4><div><ul style="text-align: left;"><li><b>INLINEFUNC_STACK_MAXSIZE</b> is an integer that allows to control how big the inlinefunc nesting stacksize is. <br /></li><li>New <b>DEFAULT_CHANNELS</b> setting to allow customization of which
channels should be initialized on startup. This can be modified after
initial server start.</li><li><b>CHANNEL_HANDLER_CLASS </b>allows for specifying an alternative to the default <b>ChannelHandler</b> if wanting to change how Channels behave. </li><li><b>SERVER_LOG_DAY_ROTATION</b> defines how many days the server log should run before being force-rotated (default is seven days).</li><li><b>SERVER_LOG_MAX_SIZE</b> specifies how big the log must be before it auto-rotates (even if <b>SERVER_LOG_DAY_ROTATION</b> days has not passed yet). </li><li><b>PORTAL_LOG_DAY_ROTATION, PORTA_LOG_MAX_SIZE</b> - equivalent for the Portal. <br /></li></ul><h4 style="text-align: left;"> Other improvements<br /></h4><ul style="text-align: left;"><li>The <b>EvMore</b> pager saw big performance speedups, making the viewing of large numbers of entries much snappier. You can now also paginate <b>EvTables</b> directly and create custom pagers by override the <b>EvMore class</b> (useful if you want to e.g. do a EvTable per-page).<b> </b> </li><li>Improvement to the multi-match parser: Trying to get for example <b>3-box</b> will now fail with a no-found if there are only two boxes in the room (before it would show the multi-match menu). </li><li>New <b>inside_rec</b>
lockfunc to recursively check if an object is inside another. Putting
this on a room will thus also check the contents of any objects in the
room, not only the contents themselves. Or if you had something in your
wallet (a container).</li><li>New <b>$random</b> inlinefunc for producing a random number in strings. <br /></li><li><b>TickerHandler.add()</b> now returns a <b>store_key</b> to uniquely describe the ticker just added. The <b>TickerHandler.remove()</b> accepts a new kwarg <b>store_key</b>
for removing the ticker - this makes it easier to manage tickers
instead having to insert the full specifications of the ticker to remove
it.</li><li>Many fixes to the <b>spawn</b> command and prototype functionality. The new <b>spawn/raw</b> flag will now return the prototype-dict so one can manually edit and copy&paste it.</li><li>The <b>evennia.GLOBAL_SCRIPTS</b> container will now contain all global scripts, not only those explicitly created with the <b>GLOBAL_SCRIPTS</b> setting. </li><li>The <b>list_to_string</b> utility converts a list to a nice string-representation, such as <b>["a", "b", "c", "d"]</b> -> <b><i>"a, b, c and d"</i></b>. The function is renamed to <b>iter_to_string </b>(but old name still works) and now also works with generators and will not crash even when provided a single value.</li><li>A lot of bug fixes and stability fixes! <br /></li></ul><h4 style="text-align: left;"><span style="font-weight: normal;">See the </span><a href="https://github.com/evennia/evennia/blob/master/CHANGELOG.md#evennia-095-nov-2020" target="_blank">changelog here.</a></h4><h3 style="text-align: left;"> </h3><h3 style="text-align: left;">New documentation system </h3><p style="text-align: left;">The bigger change with 0.9.5 is that we are moving to a new documentation system. The details of the long road to do this is documented in <a href="http://evennia.blogspot.com/2020/10/on-using-markdown-with-sphinx-onward-to.html" target="_blank">my prervious post</a>. The point is that we are stopping the use of the Github wiki in favor of statically generated documentation hosted on github pages. At the same time we also move the old evennia.com website from Google-sites to Github. </p><p style="text-align: left;">Check it out: </p><ul style="text-align: left;"><li>New evennia.com: <a href="https://evennia.com">https://evennia.com</a></li><li>New static documentation: <a href="https://evennia.com/docs/latest">https://evennia.com/docs/latest</a><br /></li></ul> As for the docs, they will be maturing for a long time still. The old wiki will not be updated anymore, but it will also not be going anywhere in the short term. Version 0.9.5 of the docs is pretty much a copy of the wiki and I hope to not have to spend too much more work maintaining it since the wiki is still around. <br /></div><div> </div><div>New updates and documentation features will primarily be happening in the 1.0-dev version of the documentation. This will include refactoring all pages as well as a new intro-tutorial and many other things. </div><div> </div><div>But that's for future blogs ... <br /></div><div><br /></div><div><br /></div><div><p style="text-align: left;"> <br /></p><h4 style="text-align: left;"><br /></h4></div>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-71718304569611193082020-10-20T00:21:00.003+02:002020-10-20T00:21:55.919+02:00On using Markdown with Sphinx - onward to Evennia 0.9.5<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1TUTEr2Bq7T29iaZSmSiIK2nIDFNNu1VsWelU4XezeZVB3a2X6K3gM2oErAg9cX1vci1rkd44Lut5nzBRu_n4z7sK6M3u0Ab4uz71GiHD30r4ybI50bbocMErA9Ns5QoaInE-pyhDxAQ/s207/book.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="207" data-original-width="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1TUTEr2Bq7T29iaZSmSiIK2nIDFNNu1VsWelU4XezeZVB3a2X6K3gM2oErAg9cX1vci1rkd44Lut5nzBRu_n4z7sK6M3u0Ab4uz71GiHD30r4ybI50bbocMErA9Ns5QoaInE-pyhDxAQ/s0/book.png" /></a></div><span style="font-size: large;">L</span>ast post I wrote about the upcoming v1.0 of Evennia, the Python MU* creation engine. We are not getting to that 1.0 version quite yet though: The next release will be 0.9.5, hopefully out relatively soon (TM). <br /><p></p><p>Evennia 0.9.5 is, as you may guess, an intermediary release. Apart from the 1.0 roadmap just not being done yet, there is one other big reason for this - we are introducing documentation versioning and for that a proper release is needed as a base to start from. Version 0.9.5 contains everything already in <i>master</i> branch, so if you have kept up-to-date you won't notice too much difference. Here are some highlights compared to version 0.9: </p><ul style="text-align: left;"><li>EvMore will paginate and properly handle both EvTables and database query output. For huge data sets, pagination can give a 100-fold speed-increase. This is noticeable e.g. in the <b>scripts</b> and <b>spawn/list</b> commands, once you have a lot of items.</li><li>EvMenu templating language, to make it easier to create simpler menus. </li><li>Webclient improvements: Cleanup of interface and the ability for players
to save/load their pane layouts from the client. The developer can
still provide a default for them to start out with. <br /></li><li>MUD/Evennia Intro wizard to the tutorial world to explain basic game controls in an interactive way. </li><li>Default channels can now be defined in settings instead of having to do so from in-game. <br /></li><li>New documentation system (see below). <br /></li><li>Many, many bug fixes and optimizations!</li></ul><p>Many contributors helped out along the way. See the <a href="https://github.com/evennia/evennia/blob/master/CHANGELOG.md" target="_blank">changelog</a> where contributors of the bigger new features are listed. <br /></p><h2 style="text-align: left;">The path to a new documentation</h2><p style="text-align: left;">For many years we've used the Github wiki as our documentation hub. It has served us well. But as mentioned <a href="http://evennia.blogspot.com/2020/04/spring-updates-while-trying-to-stay.html" target="_blank">in my previous post</a>, it has its drawbacks, in particular when it comes to handling documentation for multiple Evennia versions in parallel.</p><p style="text-align: left;">After considering a bunch of options, I eventually went with <a href="https://www.sphinx-doc.org" target="_blank">sphinx</a>, because it has such a good autodoc functionality (parsing of the source-code docstrings). This is despite our wiki docs are all in markdown and I dislike restructured text quite a bit. Our code also uses friendly and in-code-readable Google-style docstrings instead of Sphinx' hideous and unreadable format. </p><p style="text-align: left;">Luckily there are extensions for Sphinx to handle this: </p><ul style="text-align: left;"><li><span><a href="https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html" target="_blank">Napoleon</a> to convert Google-style docstrings to reST on the fly</span></li><li><span><a href="https://recommonmark.readthedocs.io/en/latest/index.html" target="_blank">recommonmark </a>to convert our markdown wiki pages to reST on compile-time <br /></span></li><li><span><a href="https://holzhaus.github.io/sphinx-multiversion/master/index.html" target="_blank">sphinx-multiversion</a> to merge docs from one or more GIT branches into a documentation where you can select between the versions.</span><br /></li></ul><p style="text-align: left;">What could go wrong? Well, it's been quite a ride.</p><h4 style="text-align: left;">Getting Markdown into reST<br /></h4><p style="text-align: left;">Linking to things in recommonmark turned out to be very flaky. I ended up forking and merging a bunch of PRs from the project but that was not enough: Clearly this thing was not built to convert 200 pages of technical markdown from a github wiki.</p><p style="text-align: left;">My custom fork of recommonmark had to be tweaked a bit for my needs, such as not having to specify the <b>.md</b> file ending in every link and make sure the url-resolver worked as I expected. There were a bunch of other things but I will probably not merge this back, the changes are pretty Evennia-specific. <br /></p><p style="text-align: left;">Even so, many of my wiki links just wouldn't work. This is not necessarily recommonmark's fault, but how sphinx works by grouping things into <i>toctrees</i>, something that the Evennia wiki doesn't have. </p><p style="text-align: left;">Also, the recommonmark way to make a toctree in Markdown is to make a list of links - you can't have any descriptive text, making the listing quite useless (apparently people only want bland lists of link-names?). After trying to figure out a way to make this work I eventually capitulated - I make pretty lists in Markdown while using a "hidden" toctree to inform sphinx how the pages are related. <br /></p><h4 style="text-align: left;">Getting the wiki into the new doc site <br /></h4><p style="text-align: left;">This required more custom code. I wrote a custom importer that reads the wiki and cleans/reformats it in places where recommonmark just dies on them. I also made a preprocessor that not only finds orphan pages but also builds a toctree and remaps all links in all documents to their actual location on compilation. The remapper makes it a lot easier to move things around. The drawback is that every page needs to be uniquely named. Since this was already the case in the wiki, this was a good tradeoff. So with a lot of custom code the wiki eventually could port automatically. </p><p style="text-align: left;">The thing is, that even with all this processing, recommonmark doesn't support stuff like Markdown tables, so you still have to fall back to reST notation for those. And Napoleon, while doing a good job of parsing google docstrings, do <i>not </i>expect Markdown. So the end result is <i>mostly</i> markdown but we still have to fall back to reST for some things. It's probably as far as we get.<br /></p><h4 style="text-align: left;">Deploying the docs <br /></h4><p style="text-align: left;">Figuring out how to build and deploy these components together was the next challenge. Sphinx' default Makefile was quite anemic and I also wanted something that regular contributors could use to test their documentation contributions easily. I ended up having to expand the Makefile quite a lot while also adding separate deploy scripts and interfaces to github actions (which we recently started using too).</p><p style="text-align: left;">Finally, the versioning. The sphinx-multiversion plugin works by extracting the branches you choose from git and running the sphinx compiler in each branch. The plugin initially had a bug with how our docs are located (not at the root of the package) but after I reported it, it was quickly fixed. The result is a static document site where you can select between the available versions in the sidebar.</p><p style="text-align: left;">I've not gotten down to trying to make LaTeX/PDF generation work yet. I'm dreading it quite a bit... <br /></p><h4 style="text-align: left;">Where we are<br /></h4><p>The github wiki is now closed for external contributions. The v0.9.5 of the new documentation will pretty much be an import of the last state of the wiki with some minor cleanup (such as tables). While we'll fix outright errors in it, I don't plan to do many fixes of purely visual glitches from the conversion - the old wiki is still there should that be a problem. <br /></p><p>The main refactoring and cleanup of the documentation to fit its new home will instead happen in v1.0. While the rough structure of this is already in place, it's very much a work in progress at this point. </p><h4 style="text-align: left;">Conclusions</h4><p>Evennia 0.9.5 has a lot of features, but the biggest things are 'meta' changes in the project itself. After it is out, it's onward towards 1.0 again! <br /></p><p><br /></p>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com2tag:blogger.com,1999:blog-8338260444057832583.post-6406865414309832702020-04-14T18:31:00.001+02:002020-04-14T18:31:44.925+02:00Spring updates while trying to stay healthy<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio1KEGxwCVx52AVMXClcTjAWJ8NgNWhuiEiyQoXi5zlZRkNz9te-rZ9Bb5vWIBE1e3DdP3fDlF2IxIJ349OlKYahQDMqM0iVqbDwsC5tgKVvDBReWqPhkai-8zoAqyPIDKPhU3jZ4cCsY/s1600/spring-flower-and-snow.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="398" data-original-width="600" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio1KEGxwCVx52AVMXClcTjAWJ8NgNWhuiEiyQoXi5zlZRkNz9te-rZ9Bb5vWIBE1e3DdP3fDlF2IxIJ349OlKYahQDMqM0iVqbDwsC5tgKVvDBReWqPhkai-8zoAqyPIDKPhU3jZ4cCsY/s320/spring-flower-and-snow.jpg" width="320" /></a></div>
So, spring grows nearer for those of us on the Northern hemisphere.
With everyone hopefully hunkered down and safe from the Covid-19
pandemic, I thought it overdue to make another dev blog for the progress
of Evennia, the Python MU*-creation system. <br />
<br />
<br />
The last
few months have seen primarily bug fixing on the Evennia front, but it
also has seen an uptick of PRs from the community and the re-opening of
the <span style="font-family: "courier new" , "courier" , monospace;">develop</span><i> </i>branch in earnest. There is still quite a lot of work to do before we can add that extra 0.1 and go from version 0.9 to 1.0.<br />
<br />
<h3>
What's in a version?</h3>
<br />
For
me personally, I never put much stock in the notion of versions.
Evennia didn't even have versions until a few years back: We used to
just have a rolling git release. But eventually it became clear that our
user base was big enough that we needed to more clearly separate major
(and possibly breaking) updates from what came before. So I started
versioning at Evennia 0.5 and have had roughly a new release every year
since (not a plan or a promise, it just happened to turn out that way).<br />
<br />
Evennia
has been useful (and been used) for game development for many years
already. But there is no denying that a 1.x label tends to convey more
confidence in a system than a 0.x label, that's just the way things are.
So while the new version is still quite some way off, there are a bunch
of changes and improvements that we want to do in this release to mark
the version change in a good way.<br />
<br />
<h3>
Documentation changes </h3>
<br />
Our documentation will move away from our trusty <a href="https://github.com/evennia/evennia/wiki" target="_blank">Github wiki</a>. Instead we will convert the wiki into a static github
page built from sources inside evennia/docs/. <br />
<br />
The
advantage of the wiki is that it is a very low entry for people to
contribute and fix things using Github's editing system. We have had a
lot of use of this over the years and the wiki has served us well. The
drawbacks are starting to get ever more noticeable, however: <br />
<ul>
<li>Whereas
the wiki is itself version-controlled, we cannot show multiple versions
of the wiki at the same time. This makes it hard to update the
documentation at the same time as non-released code is being written.
This is probably my main reason for doing the change.</li>
<li>The wiki today consists of some 200+ pages. It is hard to get an
overview of what is where and what needs to be updated. </li>
<li>The
wiki word-search functionality is not really great.</li>
<li>It's
impossible to review changes before they go live, to check consistency
and style. This has led to some documentation pages overlapping.</li>
<li>Building the documentation to local HTML or PDF is an archaic process that I doubt anyone but me has done with any regularity. </li>
</ul>
The change so far planned is to switch to the <a href="https://www.sphinx-doc.org/en/master/" target="_blank">Sphinx</a>
documentation build-system (same as Python/Django etc is using). We
will use it with extensions that allows us to still use Markdown like in
the old wiki. This also allows us to build a more comprehensive (and
pretty) API documentation of the entire library. We have more options to
add comprehensive online search functionality in this solution as well.<br />
<br />
Furthermore,
will hopefully be able to set it up so that we can maintain and publish
separate documentations for each forthcoming release. That is, you
should be able to read the docs for 1.0, 1.1 or the latest master
development as you like (similarly to how Django does it, although
probably not as fancy from the onset). <br />
<br />
This means
that contributions to the documentation will be done as PRs through
GitHub, just like when contributing any other code. While this does add a
little more of a hurdle to contributions, hopefully the benefits will
far outweigh those. Building the docs locally will not require a running
Evennia server (unless you want the api docs) and we will try to set
everything up for to make it easy to contribute.<br />
<br />
Many of the details around the docs are still up in the air. This is still very much work-in-progress, like everything else.<br />
<br />
Work with this has started in the <span style="font-family: "courier new" , "courier" , monospace;">static-file-docs</span> branch of Evennia. But we have not closed the wiki either - the two will exist in parallel for now. <br />
<br />
<h3>
PyPi</h3>
<br />
As
mentioned before, we will finally start to distribute Evennia via PyPi
(the Python Package Index) - that is, you will be able to run `pip
install evennia`. Using GIT will no longer be a requirement to get
started. <br />
<br />
Considering how quickly people in
open-source throw up their three lines of code on PyPi these days, it
may be surprising Evennia is not already on PyPi. I have however felt
that reading and referencing the highly-commented code is a big part and
requirement for getting the most out of the library.<br />
<br />
With the new documentation system, this would improve. And you can of course still use git and follow <span style="font-family: "courier new" , "courier" , monospace;">master</span> branch like the good ol' days if you want! <br />
<br />
<h3>
Web Admin improvements</h3>
<br />
For
the longest time, the Django-admin component has been somewhat on the
back-burner. With the help of community contributors, this is improving
so you will be able to do more work the Admin GUI related to creating
and managing objects, tie puppets to Accounts etc.<br />
<h3>
</h3>
<h3>
API improvements </h3>
<br />
Whereas
the last few months have been mostly spent fixing lingering bugs, one
thing planned for version 1.0 is a general cleanup of legacy strangeness
in the API. For example, certain methods can return a list or a single
object depending situation, which makes it hard to generalize. There are
a lot of small quirks like that which we hope to address and make more
consistent.<br />
<br />
There has also been a recent flurry of
contributor PRs intended to help decouple Evennia's systems and make
them easier to replace for those inclined to do so. Many of this is
still being worked on, but it's likely you'll be able to replace many
more "core" components for 1.0 with your own variations without doing
any hacking in upstream code at all.<br />
... Needless to say, this
is an advanced feature that most developers will never need. But Evennia
was always intended to be heavily customizable and having the option is
a good thing! <br />
<br />
Another feature that will come for
1.0 is a REST-API, added by one of our contributors. This uses
Django-REST-Framework and makes it easier for external programs to
authenticate and fetch data out of the Evennia database (great both for
external apps, websites or custom what-have-you).<br />
At this time
you can only fetch database objects via this interface, you cannot
perform Command-calls or "play the game" this way (REST is a stateless
concept and Evennia Commands tend to retain state). <br />
<br />
<h3>
Many other fixes and contributions</h3>
<br />
There's a truckload of stuff already available in <span style="font-family: "courier new" , "courier" , monospace;">master</span> branch, but with the latest contributions of bigger code changes, we have started to use the Evennia <span style="font-family: "courier new" , "courier" , monospace;">develop</span> branch again in earnest again. For a summary of the changes so far, check out the <a href="https://github.com/evennia/evennia/blob/develop/CHANGELOG.md" target="_blank">Changelog</a>. <br />
<br />
However,
unless you want to contribute to Evennia itself (or really, really want
to be on the bleeding edge), you are still recommended to use the
master branch for now. A lot of work still to do, as said.<br />
<br />
<br />
<span style="font-size: x-small;"><i>Image ©George Hodan, released under CC0 Public Domain</i></span><i><br /></i>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-41106946239825357362019-09-30T17:39:00.001+02:002019-09-30T17:39:47.750+02:00Blackifying and fixing bugs<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSbtUABAJt-GP3h2pP5QWMwYNBGWZZUGWNTRu0DP64I30PtXYHWjoC3hEi-HuSK38nkY_U1C8_f85FU4nVmFqwai4n86qf8gGoEfi7dUUgNLAHXbNTH5cikGVxlhwruFZNtXy8gdrqO-A/s1600/black-beetle-on-concrete_800.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="515" data-original-width="800" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSbtUABAJt-GP3h2pP5QWMwYNBGWZZUGWNTRu0DP64I30PtXYHWjoC3hEi-HuSK38nkY_U1C8_f85FU4nVmFqwai4n86qf8gGoEfi7dUUgNLAHXbNTH5cikGVxlhwruFZNtXy8gdrqO-A/s320/black-beetle-on-concrete_800.jpg" width="320" /></a></div>
<span style="font-size: large;">S</span>ince <a href="http://evennia.blogspot.com/2019/07/evennia-09-released.html" target="_blank">version 0.9</a> of <a href="http://www.evennia.com/" target="_blank">Evennia</a>, the MU*-creation framework, was released, work has mainly been focused on bug fixing. But there few new features also already sneaked into master branch, despite technically being changes slated for Evennia 1.0. <br />
<br /><br />
<br />
<br />
<span style="font-size: large;">On Frontends</span><br />
<br />
Contributor friarzen has chipped away at improving Evennia's HTML5 web client. It already had the ability to structure and spawn any number of nested text panes. In the future we want to extend the user's ability to save an restore its layouts and allow developers to offer pre-prepared layouts for their games. Already now though, it has gotten plugins for handling both graphics, sounds and video:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEAa2sx0UV8Il_1opEZwAUKG1FB_jpHkx280ibwTBNNUUC3aozI67Je3SXhgXm4xtPq-t8xcqY8MZxOqTuJrSiuYzLzCSYaDWIZ2-o8Ynjo3wNwgYUUl_YFAAlgpGAXR_gYIS8ZkKiu9A/s1600/Screenshot+from+2019-09-30+17-06-58.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="761" data-original-width="1600" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEAa2sx0UV8Il_1opEZwAUKG1FB_jpHkx280ibwTBNNUUC3aozI67Je3SXhgXm4xtPq-t8xcqY8MZxOqTuJrSiuYzLzCSYaDWIZ2-o8Ynjo3wNwgYUUl_YFAAlgpGAXR_gYIS8ZkKiu9A/s400/Screenshot+from+2019-09-30+17-06-58.png" width="400" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<i><span style="font-size: x-small;">Inline image by me (griatch-art.deviantart.com) </span></i></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
A related fun development is Castlelore Studios' development of an <a href="https://www.unrealengine.com/marketplace/en-US/slug/evennia-plugin" target="_blank">Unreal Engine Evennia plugin</a> (this is unaffiliated with core Evennia development and I've not tried it, but it looks pretty nifty!): </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://cdn1.epicgames.com/ue/product/Screenshot/EvenniaPlugin1920x1080-2-1920x1080-4705074bbe9ecdc688a46880506eb419.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="450" data-original-width="800" height="180" src="https://cdn1.epicgames.com/ue/product/Screenshot/EvenniaPlugin1920x1080-2-1920x1080-4705074bbe9ecdc688a46880506eb419.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<i><span style="font-size: x-small;">Image ©Castlelore Studios </span></i></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<span style="font-size: large;">On Black</span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;">Evennia's source code is extensively documented and was <i>sort of</i>
adhering to the Python formatting standard PEP8. But many places were sort of hit-and-miss and others
were formatted with slight variations due to who wrote the code. </span></span><br />
<span style="font-size: large;"><span style="font-size: small;"> </span></span><br />
<span style="font-size: large;"><span style="font-size: small;">After pre-work and recommendation by Greg Taylor, Evennia has adopted the <a href="https://pypi.org/project/black/" target="_blank">black autoformatter</a></span></span>
for its source code. I'm not really convinced that black produces the
best output of all possible outputs every time, but as Greg puts it,
it's at least consistent in style. We use a line width of 100.<br />
<br />
I
have set it up so that whenever a new commit is added to the repo, the
black formatter will run on it. It may still produce line widths >100
at times (especially for long strings), but otherwise this reduces the
number of different PEP8 infractions in the code a lot.<br />
<br />
<span style="font-size: large;">On Python3</span><br />
<br />
Overall
the move to Python3 appears to have been pretty uneventful for most
users. I've not heard almost any complaints or requests for help with
converting an existing game.<br />
The purely Python2-to-Python3
related bugs have been very limited after launch; almost all have been
with unicode/bytes when sending data over the wire.<br />
<br />
People
have wholeheartedly adopted the new f-strings though, and some
spontaneous PRs have already been made towards converting some of
Evennia existing code into using them.<br />
<br />
Post-launch we
moved to Django 2.2.2, but the Django 2+ upgrades have been pretty
uneventful so far.Some people had issues installing Twisted on Windows
since there was no py3.7 binary wheel (causing them to have to compile
it from scratch). The rise of the Linux Subsystem on Windows have
alleviated most of this though and I've not seen any Windows install
issues in a while. <br />
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;">On Future</span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
For now we'll stay in bug-fixing mode, with the ocational new feature popping up here and there. In the future we'll move to the <i>develop</i> branch again. I have a slew of things in mind for 1.0. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Apart from bug fixing and cleaning up the API in several places, I plan to make use of the feedback received over the years to make Evennia a little more accessible for a new user. This means I'll also try reworking and consolidating the tutorials so one can follow them with a more coherent "red thread", as well as improving the documentation in various other ways to help newcomers with the common questions we hear a lot. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The current project plan (subject to change) is <a href="https://github.com/evennia/evennia/projects/9" target="_blank">found here</a>. Lots of things to do! </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<i><span style="font-size: x-small;">Top image credit: https://www.goodfreephotos.com/ (public domain)</span></i></div>
Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com2tag:blogger.com,1999:blog-8338260444057832583.post-43233911992345165202019-07-04T19:45:00.004+02:002019-07-04T19:45:45.293+02:00Evennia 0.9 released<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqdB2uOytM0sJ71gRTHkV_t8LcTVqBFw0RbEl9POCVtIyVrC__TM5YzydZQ_cWW0BUOTflhFHqfQUN2vjTjdjCdHHrPPKe8e9AeFrUbdStYCRsIxdlMM5375vESmW4sLCoj5KlJ0Mvl9o/s1600/evennia_logo_small.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="165" data-original-width="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqdB2uOytM0sJ71gRTHkV_t8LcTVqBFw0RbEl9POCVtIyVrC__TM5YzydZQ_cWW0BUOTflhFHqfQUN2vjTjdjCdHHrPPKe8e9AeFrUbdStYCRsIxdlMM5375vESmW4sLCoj5KlJ0Mvl9o/s1600/evennia_logo_small.png" /></a></div>
<span style="font-size: large;">L</span>ast week we released <a href="http://www.evennia.com/" target="_blank">Evennia</a> 0.9, the next version of the open source Python MU* creation system.<br />
<br />
This release is the result of about 10 months of development, featuring 771 commits, 70 closed pull requests from the community and something like 80 issues and feature/requests closed. Thanks everyone!<br />
<br />
<br />
<br />
The main feature of Evennia 0.9 is that we have finally made the move to <b>Python3</b>. And we burn the bridges behind us; as announced in previous posts we completely drop Python2 support and move exclusively to only support the latest Python3.7.<br />
<br />
Overall the move to Python3 was not too bloody (and much work towards a never published py2+3 version was already done by Evennia contributors in a separate branch earlier). The main issues I ran into were mainly in the changes in how Python3 separates strings from bytes. This became crticial since Evennia implements several connection protocols; there were a lot of edge cases and weird errors appearing where data went to and from the wire.<br />
<br />
A regular user has it a lot easier though. So far people have not had too much trouble converting their games from 2.7 to 3.7. The biggest Linux distros don't all have Py3.7 out of the box though, so that may be a concern for some, we'll see.<br />
<br />
... but Py3 is nowhere all there is to find in this release though! There are a plethora of <b>more features</b> in the latest Evennia, all to make it easier to make the text-based multiplayer game of your dreams.<br />
<br />
You can see a <a href="https://groups.google.com/forum/#!category-topic/evennia/evennia-news/cOs4HWh0MFQ" target="_blank">summary of new features in the ML announcement</a> and even more details <a href="https://github.com/evennia/evennia/blob/master/CHANGELOG.md" target="_blank">in the actual CHANGELOG file</a>. <br />
<br />
<br />
<b>So what's up next? </b><br />
<br />
Now follows a period of bug-fixing and stabilizing. Maybe resolve some of those long-standing "tech-dept" issues and overall make Evennia more stable. <br />
<br />
Eventually work will then commence (in the <b>develop</b> branch) on version 1.0 of Evennia. For this next release I think I'll step back from new features a bit and focus on refactoring and cleanup of the API as well as other things around the library's distribution, documentation and presentation.<br />
<br />
But for now, onward to summer vacations.Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com1tag:blogger.com,1999:blog-8338260444057832583.post-38238035359927549202019-05-26T11:03:00.001+02:002020-09-20T11:57:26.890+02:00Creating Evscaperoom, part 2 <div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://www.deviantart.com/griatch-art/art/Say-hi-to-Mrs-Buttons-153984575" target="_blank"><img alt="Jester smiling oh so sweetly" border="0" data-original-height="637" data-original-width="900" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHHsXi6cRE_ZVG2fAHj4LTDSxsbCF8IK1HeB7g8Ve-Pw832w_2Yq9bSrs4VgvxQQweiig-EIMsno4JcNTv-LtgSI3400wdAJkWkbVDfVvQt3Wgx5lPeJg6EUS7cdaQkdu5TRux8NGzHPQ/s320/say__hi__to_mrs_buttons_by_griatch_art_d2jof9b-fullview.jpg" title="The Jester" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><a href="https://www.deviantart.com/griatch-art/art/Say-hi-to-Mrs-Buttons-153984575" target="_blank">The Jester, your 'adversary'</a></td></tr>
</tbody></table>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3-f9UlNyp2yHaboDfWwuhsPCVQ9eGMYWHPk9UO4lSoWX-_xWAuBQtkTMZjomXAQo8i07zv5qRCYA7wt3GRZGvLsl3TbCdqUM1Y8z01-5cqtEWxuSB9phU3B7rleMox7FBuRiL3mCgxuk/s1600/Screenshot+from+2019-05-17+11-38-49.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"></a><p><br />
<span style="font-size: large;">T</span>his is part two of my post-mortem dev-blog about <i>Evscaperoom</i>, the multiplayer, text-based 'escape room' I wrote in Python and <a href="http://www.evennia.com/" target="_blank">Evennia</a>. You can read the <a href="https://evennia.blogspot.com/2019/05/creating-evscaperoom-part-1.html" target="_blank">first part of the dev blog here</a>. <br />
<br />
This was a game-jam entry I created in a month for the Mud Coder's guild's <a href="https://itch.io/jam/enterthemud2/rate/422945" target="_blank">Game Jam</a>. The theme was <i>One Room.</i> You can play the game for free in your browser or with a traditional MUD client. There are no spoilers in these blog posts. </p><p></p><p></p><p></p><p></p><p><i>Update: These days you can play the Evscaperoom by logging into the Evennia demo game at <a href="https://demo.evennia.com">https://demo.evennia.com</a>. It's just one of the exits you can get through when you enter.</i><br />
<br />
<a href="https://evennia.blogspot.com/2019/05/creating-evscaperoom-part-1.html" target="_blank">The first part</a> dealt with the overall game-design aspects. This second, final part will go into details of the code and the systems I built to quickly create all the content. The code referenced here is released under the BSD license and is available <a href="https://github.com/Griatch/evscaperoom" target="_blank">on github</a>. <br />
<br />
At the time of this post, players have played <i>Evscaperoom</i> for a little more than a week. At the end I'll share some observations and things I learned along the way.
<br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">Ease of building</span><br />
<br />
Over the one-month game jam, I spent about four days making the game's 'engine' and toolset with Evennia. The rest of the time was spent using those tools to actually create game content (the story, puzzles etc).<br />
<br />
An important thing was that I didn't want to do any traditional in-game 'building'. That is - no logging into the game and running various commands to build objects and rooms. This is partly because I wanted rooms to be buildable on-demand, but also because I didn't want my game to only exist in the database but in actual version-controllable python modules. <br />
<br />
So all of the Evscaperoom is created in code (notably in the game <i>states</i> discussed below). This made it so that I could add unit tests to quickly find bugs and edge cases. It also made it easy to just clone the full game to an online server, init a database and run Evennia on it in a docker when time came to make it public. <br />
<br />
<br />
<span style="font-size: large;">Overall game structure </span><br />
<br />
</p><table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPJSco8n8qcR1D1HLWolBwKRMq77oahlzYWlk48f3Iul8MzWS9gpYZm8SmoPIbRH2seijlzIPNV6_7eksrkoTqB9Xc8bvFBzCytZmZtCQScdVcFxI2cvEr4fI_3VH1nrPxDzC_URD9rK4/s1600/Screenshot+from+2019-05-25+20-20-17.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img alt="The main Evscaperoom menu, showing the option to create a new room or join one of two existing rooms." border="0" data-original-height="460" data-original-width="1114" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPJSco8n8qcR1D1HLWolBwKRMq77oahlzYWlk48f3Iul8MzWS9gpYZm8SmoPIbRH2seijlzIPNV6_7eksrkoTqB9Xc8bvFBzCytZmZtCQScdVcFxI2cvEr4fI_3VH1nrPxDzC_URD9rK4/s320/Screenshot+from+2019-05-25+20-20-17.png" title="Menu" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Main menu</td></tr>
</tbody></table>
The game loop is simple: When you log in to the game, you get into a menu where you can create a new room to solve or join an existing one. Quitting a room brings you back to that menu. Quitting again leaves the game entirely. In between, you remain inside a single game location ('room'). <br />
<br />
To make it easier for people to agree to meet up in a room, i made a little 'fantasy name generator' to make unique random names of the rooms. It felt more thematic than showing room id's. The generator combines phonemes together with some very simple logic. Not all comes out easy-to-pronounce, but the result is at least identifiable, like the Sheru and Uyoha above. <br />
<br />
I decided that I should not keep empty rooms around, so whenever a room has no more players in it, it's deleted from the database along with all its content. This means players can't really log off and come back to the same room unless a friend stays behind. I felt it was worth keeping things clean and avoid a growing backlog of empty, unsolved rooms. It is, unfortunately, quite common for players to log in, create a room and then immediately log off. <br />
<br />
I distribute <i>Evscaperoom</i> as an Evennia 'game dir'. Once you've installed Evennia you can just clone the evscaperoom repo and start a new multiplayer server with it. While the game dir has some Evennia templates in it by default, Almost all the custom logic for this game is in <a href="https://github.com/Griatch/evscaperoom/tree/master/evscaperoom" target="_blank">the evscaperoom/ folder.</a> The only other modification I did was to make sure Evennia rerouted new players into the Evscaperoom menu when they connect.<br />
<br />
<br />
<span style="font-size: large;">Room class</span> <br />
<br />
Since all of the gameplay happens in a single room, it made sense to center all of the data-storage around a new, custom Evennia <b>Room</b> class. This "EvscapeRoom" class holds all resources for this room. Evennia makes sure to persist it all to the database for you.<br />
<br />
The Evennia API provides a lot of powerful but game-general functions. Since our use-case for this game is very strictly defined, I made a slew of helper functions to cut down on boiler plate and pre-set options I wanted to always use. <br />
<br />
For example, I added helper methods both for creating and finding objects in the room. On creation, all objects are tagged with the room's unique hash, meaning that one can be sure to never have any cross-over between rooms (like accidentally finding the object in another room (that of course has the exact same name). Since I also decided to never have more than one object with a given name per room, I could make these methods very simple. <br />
<br />
The room class also has helpers for finding all players in the room and for sending messages to them. It also catches players leaving so that eventual on-character variables can be cleaned. <br />
<br />
Importantly, the very action of deleting the room will automatically clean all resources tied to it, keeping things tidy.<br />
<br />
<br />
<span style="font-size: large;">Commands and Objects</span><br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3-f9UlNyp2yHaboDfWwuhsPCVQ9eGMYWHPk9UO4lSoWX-_xWAuBQtkTMZjomXAQo8i07zv5qRCYA7wt3GRZGvLsl3TbCdqUM1Y8z01-5cqtEWxuSB9phU3B7rleMox7FBuRiL3mCgxuk/s1600/Screenshot+from+2019-05-17+11-38-49.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img alt="This shows a list of all commands useful in the room." border="0" data-original-height="860" data-original-width="1500" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3-f9UlNyp2yHaboDfWwuhsPCVQ9eGMYWHPk9UO4lSoWX-_xWAuBQtkTMZjomXAQo8i07zv5qRCYA7wt3GRZGvLsl3TbCdqUM1Y8z01-5cqtEWxuSB9phU3B7rleMox7FBuRiL3mCgxuk/s320/Screenshot+from+2019-05-17+11-38-49.png" title="The Help screen" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The help screen, show all top-level commands</td></tr>
</tbody></table>
As discussed in part one of this blog, the Evscaperoom, uses a 'focus' mode: The player must examine/focus on an object first in order to operate or use it. <br />
<br />
The basic command syntax is: <br />
<blockquote class="tr_bq">
<b><span style="font-family: "courier new" , "courier" , monospace;">> command [target]</span></b></blockquote>
The parsing I made actually allows for a more complex syntax, but in the end this was all that was really needed, since the currently 'focused' object does not need to be specified. This is the process of using one object with another: <br />
<br />
<b><span style="font-family: "courier new" , "courier" , monospace;">></span> <span style="font-family: "courier new" , "courier" , monospace;">examine key</span></b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">~~ key (examining) ~~ </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">This is a brass key.</span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">(To unlock something with it, use <i>insert into <target></i>) </span><br />
<br />
<b><span style="font-family: "courier new" , "courier" , monospace;">> insert into door</span></b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">You unlock the <b>door </b>with the<b> key</b>! </span><br />
<br />
(the <i><span face=""arial" , "helvetica" , sans-serif">into</span></i> is optional). Here, we focus on the <span style="font-family: "courier new" , "courier" , monospace;">key</span>. We get the key's description and a hint that you can <i>insert </i>it into things. We then insert it into the <span style="font-family: "courier new" , "courier" , monospace;">door</span>, which is another object in the room. The <i>insert</i> command knows that we are focusing on the <span style="font-family: "courier new" , "courier" , monospace;">key</span> already and that it should look into the room for an object <span style="font-family: "courier new" , "courier" , monospace;">door</span> to use this with. <br />
<br />
Technically, these on-object 'actions' (like <i>insert </i>above), are dynamically generated. Here is an example of the <span style="font-family: "courier new" , "courier" , monospace;">key</span> object:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">class Key(EvscaperoomObject):</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> def at_focus_insert(self, caller, **kwargs):</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> target = kwargs['args']</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> obj = caller.search(obj)</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> if not obj: </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> return </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> if obj.check_flag("can_use_key"):</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> obj.handle_insert(self)</span><br />
<br />
Not shown here is that I made a wrapper for the "no-match" command of Evennia. This command fires when no other commands match. I made this instead analyze the currently 'focused' object to see if it had a method <span style="font-family: "courier new" , "courier" , monospace;">at_focus_<command_name></span> on it. If so, I inject the supplied arguments into that method as a keyword argument <i>args</i>.<br />
<br />
So when you focus on the key and give the <i>insert</i> command, the <span style="font-family: "courier new" , "courier" , monospace;">at_focus_insert</span> method on the key will be called with a target to insert<i> </i>the key into<i>. </i>We search for the target (the <span style="font-family: "courier new" , "courier" , monospace;">door</span> in the example), check if it even accepts keys and then pass the key to that object to handle. It would then be up to the door to figure out if this particular key unlocks it. <br />
<br />
I created a library of base objects that I can just use as mixins for the object I want to create. Here's an example:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">from evscaperoom import objects</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">class Box(objects.Openable, </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> objects.CodeInput, </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> objects.Movable):</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> # ...</span><br />
<br />
This class will offer actions to open, insert a code and move the object around. It will need some more configuration and addition of messages to show etc. But overall, this method-to-command solution ended up being very stable and extremely easy to use to make complex, interactive objects. <br />
<br />
<br />
<span style="font-size: large;">Room states</span><br />
<br />
I think of the escape room as going through a series of <i>states</i>. A change of state could for example be that the user solved a puzzle to open a secret wall. That wall is now open, making new items and puzzles available. This means room description should change along with new objects being created or old ones deleted.<br />
<br />
I chose to represent states as Python modules in a folder. To be a state, each module needs to have a global-level class <span style="font-family: "courier new" , "courier" , monospace;"><b>State</b></span> inheriting from my new <span style="font-family: "courier new" , "courier" , monospace;"><b>BaseState</b></span> class. This class has methods for initializing and cleaning up the state, as well as was for figuring out which state to go to next. As the system initializes the new state, it gets the current room as argument, so it can modify it.<br />
<br />
This is a (simplified) example of a state module: <span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"># module state_001_start.py</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">from evscaperoom.state import BaseState </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">from evscaperoom import objects</span><br />
<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">MUG_DESC = """</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">A blue mug filled with a swirling liquid. </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">On it is written "DRINK ME" with big letters. </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">""" </span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">class Mug(objects.EvscapeRoomObject):</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> def at_focus_drink(self, caller, **kwargs): </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> caller.msg(f"You drink {self.key}.") </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> self.next_state() # trigger next state</span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">class State(BaseState):</span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> hints = ["You are feeling a little thirsty...",</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> "Drink from the mug, dummy."] </span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> next_state = "state_002_big_puzzle"</span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> def init(self): </span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> mug = self.create_object(</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> Mug, key="wooden mug", aliases=["mug"])</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"> mug.db.desc = MUG_DESC.strip() </span><br />
<br />
In this simple state, a mug is created, and when you drink from it, the next state is triggered. The base object has a helper function to trigger the next state since I found that interactive with an object is almost always the reason for switching states.<br />
<br />
The state-class has a lot of useful properties to set, such as which the next state should be (this can be overridden in case of branching paths). You can also store<br />
a sequence of hints specific for that state.<br />
<br />
<br />
<br />
<span style="font-size: large;">Informing the room</span><br />
<br />
I wrote the content in second-person perspective (<i>"You open the door"</i>). This is however a multiplayer game and I didn't intially appreciate how many texts must also exist in a third-party form for the rest of the room to see (<i>"Griatch opens the door"</i>).<br />
<br />
As the amount of text grew (the Evscaperoom has close to 10 000 lines of code, a lot of which is content strings), it became clear that it would not be feasible to manually supply third-persion version strings as well.<br />
<br />
The solution was to add parsing and translation of pronouns and verbs (a concept I first saw on the game <i>Armageddon</i>).<br />
<br />
I write the string like this:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">OPEN_TEXT = "~You ~open the *door." </span><br />
<br />
The <span style="font-family: "courier new" , "courier" , monospace;">~</span> marks text that should be parsed for second/third-person use (I'll discuss the <span style="font-family: "courier new" , "courier" , monospace;">*door</span> marking in the next section). This I then send to a helper method that either sends it only to you (which means it comes back pretty much the same, but without the special markers) or to you <i>and</i> to the room, in which it will look different depending on who receives it:<br />
<br />
I see <span style="font-family: "courier new" , "courier" , monospace;">"You open the [door]."</span><br />
Others see <span style="font-family: "courier new" , "courier" , monospace;">"Griatch opens the [door]."</span><br />
<br />
English is luckily pretty easy to use for this kind of automatic translation - in general you can just add an "s" to the end of the verb. I made a simple mapping for the few irregular verbs I ended up using.<br />
<br />
Overall, this made it quick to present multiple viewpoints with minimal extra text to write. <br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF6B22ng_pPQgqNOCuMchW8QUaB6Q7f0iMX1maDDOvshsu3DSssAC5GoGZCykaxhIYuJVk_SIVVgrFOLpuWh2m2v4heRxmi111m2uZZO9hUbMNlYElsPmEdli4z4k_nS8R3DvXjiORQ3M/s1600/Screenshot+from+2019-05-17+11-49-20.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img alt="Shows the various accessibility options for showing items." border="0" data-original-height="290" data-original-width="1076" height="86" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF6B22ng_pPQgqNOCuMchW8QUaB6Q7f0iMX1maDDOvshsu3DSssAC5GoGZCykaxhIYuJVk_SIVVgrFOLpuWh2m2v4heRxmi111m2uZZO9hUbMNlYElsPmEdli4z4k_nS8R3DvXjiORQ3M/s320/Screenshot+from+2019-05-17+11-49-20.png" title="option menu" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The option menu</td></tr>
</tbody></table>
<span style="font-size: small;"></span>The <span style="font-family: "courier new" , "courier" , monospace;">*door</span> -style marking allowed me to generalize how target-able objects in the room were displayed. This meant that users can customize how objects are shown to them. The default is to mark them both with colors and square brackets (this makes it clear also for people with screen readers). But one can also use only colors or turn off the marking completely (hard mode).<br />
<br />
<span style="font-size: large;">Bringing it online</span><br />
<br />
Evennia is both a mud framework and mudserver as well as a webserver based on <a href="https://twistedmatrix.com/trac/" target="_blank">Twisted</a>. It runs the game's website (with the help of <a href="https://www.djangoproject.com/" target="_blank">Django</a>) and also provides its own HTML5 webclient. I tweaked the default website text and played a little with CSS but otherwise didn't spend too much time on this bit. <br />
<br />
I got a $5/month DigitalOcean droplet with Ubuntu. I made a new, unprivileged "evennia" user on it and cloned the evscaperoom repo to it. I then started a tmux session and ran the Evennia docker image in there. Getting the game online took maybe thirty minutes, most of which was me figuring out where to open the droplet and DigitalOcean firewalls.<br />
<br />
I then pointed <a href="http://experimental.evennia.com/">http://experimental.evennia.com</a> at the droplet's IP and that was it!<br />
<br />
<span style="font-size: small;">Updating the online server is now only a matter of pushing
changes to my github repo, pulling it to the server and reloading
Evennia; Before release, I used a private github repo for this,
afterwards I simply made it public. Pretty straightforward.</span><br />
<br />
<span style="font-size: large;">Some lessons learned</span><br />
<br />
<span style="font-size: small;">I have gotten pretty positive reviews on Evscaperoom so far. In the first two days people stumbled on some edge-case bugs, but after that it has been very stable. Mostly I've had to make small typos and grammar corrections as I (or players) spot them. </span><br />
<br />
<span style="font-size: small;">There were nevertheless some things I learned, some of which led to more real improvements post-launch. </span><br />
<br />
<span style="font-size: small;"><b>No amount of help is too much help </b></span><br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_zMj68lsx1sqtIeDoFkQ_tyQPWGm9-_uVnoBvoKhAPiHf-B4PytMNLX0ljqRLQHW2w2qUE0gH-HnUA_kH0yCjUTsMZTwaVaKQ8vlj_PFsfbgnPxzwHwLQ8hQumZPd3-biTAnpVSt5bRM/s1600/Screenshot+from+2019-05-26+09-26-49.png" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img alt="Shows focus on the 'bed', with an example of the header telling how to leave the 'focus' mode." border="0" data-original-height="272" data-original-width="1110" height="78" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_zMj68lsx1sqtIeDoFkQ_tyQPWGm9-_uVnoBvoKhAPiHf-B4PytMNLX0ljqRLQHW2w2qUE0gH-HnUA_kH0yCjUTsMZTwaVaKQ8vlj_PFsfbgnPxzwHwLQ8hQumZPd3-biTAnpVSt5bRM/s320/Screenshot+from+2019-05-26+09-26-49.png" title="Header example" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The header shows how to get out of focus mode</td></tr>
</tbody></table>
<span style="font-size: small;">Firstly, the focus-system (examine, then do stuff) is a little un-orthodox and needs to be explained. I saw people logging in, examining exactly <i>one</i> thing and then logging out. Eventually I found out (because a user told me), that this was likely because they could not figure out how to <i>leave</i> the focus mode. They'd just flounder about, think the game was buggy and log off. </span><br />
<br />
<span style="font-size: small;">The answer (just run <i>examine</i> again) is found with the <i>help </i>command, but clearly this was not intuitive. The solution was to add an explicit help text to the top every time you examine something. After this, the confusion seems to have gone away. </span><br />
<br />
<span style="font-size: small;"><b>Make it easy to connect for all tastes</b></span><br />
<br />
<span style="font-size: small;">Another example - a commenting user had pretty strong opinions about the fact that you used to have to supply a username and password to play the game. They suggested this was a 'huge hurdle'. Not sure if that's true. But unless you want to use a particular name, there is also no actual gameplay <i>reason</i> to formally authenticate for Evscaperoom. </span><br />
<br />
<span style="font-size: small;">This was easy to fix. Evennia has guest-player support out of the box so I just activated that and supplied some more fantasy-sounding names than the default "Guest 1", "Guest 2" etc. Since then, maybe 40% of players connecting have chosen to do so as an anonymous guest. I don't know if those would have left completely if the option was not available, but it's at least a convenient shortcut for getting into the game. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><b>Everything takes longer than expected</b></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">I already knew this one, but still I fell into the trap of thinking that things were going well and that there would be plenty of time to finish before deadline. </span><br />
<br />
<span style="font-size: small;">Creating text content is a lot faster than creating graphical assets, but it's still a lot of work. Just the ending 'cinematics' took me almost two days to finish and clean up at the end. </span><br />
<br />
<span style="font-size: small;">For once I did pick a reasonable scale for this project though. So while the last few days of the Jam was more intense than I would have liked, </span><span style="font-size: small;"><span style="font-size: small;">I never truly felt like I would not be able to finish in time. </span></span><br />
<br />
<span style="font-size: small;"><br /></span>
<b><span style="font-size: small;">Building a MU* game in pure code is awesome</span></b><br />
<br />
<span style="font-size: small;">Evennia tries to not instil and specific game type, hence its tools are very general. Wrapping these general tools as a highly opinionated and game-specific toolbox enforced to me just how <i>easy </i>it is to do things when you don't need to cover the general case. </span><br />
<br />
<span style="font-size: small;">Using the tools and creating content purely in-code was great and ended up leading to a <i>very</i> fast content creation. Python works perfectly as a scripting language and I don't think there is a reason for using in-game building at all for your game, especially not when you are working on your own like this. </span><br />
<br />
<span style="font-size: small;">I made a few admin-only commands to jump between states and to set flags, but otherwise most bugs were caught by a generic unit test that just looped over all founds states and tried to initialize them, one after another. </span><br />
<br />
<span style="font-size: large;"><br /></span>
<span style="font-size: small;"><span style="font-size: large;">Conclusions</span></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">For all my work on the Evennia library/server, I've not actually <i>used</i> it for games of my own very much. This was a great opportunity for doing so. It also gave me the opportunity to test the Python3-development branch of Evennia in a production setting. </span><br />
<br />
<span style="font-size: small;">I found a few edge-case library bugs which I fixed, but overall things worked very smoothly, also for this kind of game which is certainly far away from the normal MU*-mold that most use Evennia for. I am a bit biased, but overall I felt Evennia to be very mature for the use of making a game from scratch. </span><br />
<br />
<span style="font-size: small;">In the future I will most likely break out the 'engine' and tools of the Evscaperoom into an Evennia contrib so that others can make similar games with it easily.</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Looking forward to future game jams now! </span>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-45099566561992644302019-05-18T20:50:00.002+02:002020-09-20T11:53:43.080+02:00Creating Evscaperoom, part 1<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTXwjNleLQPRTT9t_gq4CMwhtBH9oY_PU9CMY4M8NWFkzoYO63mbZwg5r05KARh-ltEFl6QnsDGbFqO2I0NmNsteiGEuyk1ZBWDXIBM8_D6sd-RsA3953brshG0ZifNoZBqO37oo-iCBo/s1600/Screenshot+from+2019-05-17+11-36-47.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="758" data-original-width="1176" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTXwjNleLQPRTT9t_gq4CMwhtBH9oY_PU9CMY4M8NWFkzoYO63mbZwg5r05KARh-ltEFl6QnsDGbFqO2I0NmNsteiGEuyk1ZBWDXIBM8_D6sd-RsA3953brshG0ZifNoZBqO37oo-iCBo/s320/Screenshot+from+2019-05-17+11-36-47.png" width="320" /></a><p><span style="font-size: large;">O</span>ver the last month (April-May 2019) I have taken part in the <a href="https://itch.io/jam/enterthemud2" target="_blank">Mud Coder's Guild Game Jam</a> "Enter the (Multi-User) Dungeon". This year the theme for the jam was <i>One Room.</i><br />
<br />
The result was <a href="http://experimental.evennia.com/" target="_blank">Evscaperoom</a>, an text-based multi-player "escape-room" written in Python using the <a href="http://www.evennia.com/" target="_blank">Evennia</a> MU* creation system. You can play it from that link in your browser or MU*-client of choice. If you are so inclined, you can also <strike><a href="https://itch.io/jam/enterthemud2/rate/422945" target="_blank">vote for it here</a> in the jam</strike> (well, no more).<br />
<br />
This little series of (likely two) dev-blog entries will try to recount the planning and technical aspects of the Evscaperoom. This is also for myself - I'd better write stuff down now while it's still fresh in my mind!<br />
<br />
<a href="https://evennia.blogspot.com/2019/05/creating-evscaperoom-part-2.html" target="_blank">Update: The next part of this blog is here.</a><br />
</p><p></p><p></p><p>Update 2: The Evscaperoom can these days be played by connecting to the Evennia game demo at <a href="https://demo.evennia.com">https://demo.evennia.com</a>.<br /></p><p><br />
<span style="font-size: large;">Inception </span><br />
<br />
<span style="font-size: small;">When I first heard about the upcoming game-jam's theme of <i>One Room</i>, an 'escape room' was the first thing that came to mind, not the least because I just recently got to solve my my own first real-world escape-room as a gift on my birthday. </span><br />
<br />
<span style="font-size: small;">If you are not familiar with escape-rooms, the premise is simple - you are locked into a room and have to figure out a way to get out of it by solving practical puzzles and finding hidden clues in the room. </span><br />
<br />
<span style="font-size: small;">While you could create such a thing in your own bedroom (and there are also some one-use board game variants), most escape-rooms are managed by companies selling this as an experience for small groups. You usually have one hour to escape and if you get stuck you can press a button (or similar) to get a hint. </span><br />
<br />
<span style="font-size: small;">I thought making a computer escape-room. Not only can you do things in the computer that you cannot do in the real world, restricting the game to a single room limits so that it's conceivable to actually finish the damned thing in a month. </span><br />
<br />
<span style="font-size: small;">A concern I had was that everyone else in the jam surely must have went for the same obvious idea. In the end that was not an issue at all though.</span><br />
<br />
<br />
<span style="font-size: large;">Basic premises</span><br />
<span style="font-size: large;"> </span> <br />
I was pretty confident that I would <i>technically</i> be able to create the game in time (not only is Python and Evennia perfect for this kind of fast experimentation and prototyping, I know the engine very well). But that's not enough; I had to first decide on how the thing should actually <i>play. </i>Here<i> </i>are the questions I had to consider:<br />
<br />
<b><span style="font-size: small;">Room State </span></b><br />
<br />
<i> </i>An escape room can be seen as going through multiple <i>states</i> as puzzles are solved. For example, you may open a cabinet and that may open up new puzzles to solve. This is fine in a single-player game, but how to handle it in a multi-player environment? <br />
<br />
<i></i>
My first thought was that each object may have multiple states and that players could co-exist in the same room, seeing <i>different</i> states at the same time. I really started planning for this. It would certainly be possible to implement. <br />
<br />
But in the end I considered how a real-world escape-room works - people in the same room solves it together. For there to be any <i>meaning</i> with multi-player, they must <i>share</i> the room state.<br />
<br />
So what I went with was a solution where players can create their own room or join an existing one. Each such room is generated on the fly (and filled with objects etc) and will change as players solve it. Once complete and/or everyone leaves, the room is deleted along with all objects in it. Clean and tidy. <br />
<br />
<i></i>
So how to describe these states? I pictured that these would be described as normal Python modules with a start- and end function that initialized each state and cleaned it up when a new state was started. In the beginning I pictured these states as being pretty small (like one state to change one thing in the room). In the end though, the entire Evscaperoom fits in 12 state modules. I'll describe them in more detail in the second part of this post. <br />
<br />
<b>Accessibility and "pixel-hunting" in text</b><br />
<br />
When I first started writing descriptions I didn't always note which objects where interactive. It's a very simple and tempting puzzle to add - mention an object as part of a larger description and let the player figure out that it's something they can interact with. This practice is sort-of equivalent to <i>pixel-hunting</i> in graphical games - sweeping with the mouse across the screen until you find that little spot on the screen that you can do something with.<br />
<br />
<b></b>
Problem is, pixel-hunting's not really <i>fun</i>. You easily get stuck and when you eventually find out what was blocking you, you don't really feel clever but only frustrated. So I decided that I should <i>clearly mark every object that people could interact with</i> and focus puzzles on better things. <br />
<b></b><br />
<br />
In fact, in the end I made it an option:<br />
<br />
</p><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAItFTaHiqYxjnXgzGULGo-R_M9SDpdGYcSJ_E5eGYr8cEsfXZVvOTd0DdOgGoALcAujKsRbXU58a0i7KgjZQEVc05IuR0pDXh0T6OA9Xl9ILuMXEvF6QRPjyOMsMrD0t7WXkgRgGVEkM/s1600/Screenshot+from+2019-05-17+11-49-20.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Option menu ('quit' to return) 1: ( ) No item markings (hard mode) 2: ( ) Items marked as item (with color) 3: (*) Items are marked as [item] (screenreader friendly) 4: ( ) Screenreader mode" border="0" data-original-height="290" data-original-width="1076" height="107" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAItFTaHiqYxjnXgzGULGo-R_M9SDpdGYcSJ_E5eGYr8cEsfXZVvOTd0DdOgGoALcAujKsRbXU58a0i7KgjZQEVc05IuR0pDXh0T6OA9Xl9ILuMXEvF6QRPjyOMsMrD0t7WXkgRgGVEkM/s400/Screenshot+from+2019-05-17+11-49-20.png" title="In-game option menu" width="400" /></a></div>
<br />
As part of this I had to remind myself <i>never to use colors only</i> when marking important information: Visually impaired people with screen readers will simply miss that. Not to mention that some just disable colors in their clients.<br />
<br />
So while I personally think option 2 above is the most visually pleasing, Evscaperoom defaults to the third option. It should should start everyone off on equal footing. Evennia has a screen-reader mode out of the box, but I moved it into the menu here for easy access.<br />
<br />
<b>Inventory and collaboration</b><br />
<br />
In a puzzle-game, you often find objects and combine them with other things. Again, this is simple to do in a single-player game: Players just pick things up and use them later.<br />
<br />
But in a multi-player game this offers a huge risk: players that pick up something important and then log off. The remaining players in that room would then be stuck in an unsolvable room - and it would be very hard for them to know this.<br />
<br />
In principle you could try to 'clean' player inventories when they leave, but not only does it add complexity, there is another issue with players picking things up: It means that <i>the person first to find/pick up the item is the only one that can use it and look at it</i>. Others won't have access until the first player gives it up. Trusting that to anonymous players online is not a good idea. <br />
<br />
So in the end I arrived at the following conclusions: <br />
<ul>
<li>As soon as an item/resource is discovered,<i> everyone</i> in the room must be able to access it immediately. </li>
<li>There can be <i>no inventory</i>. Nothing can ever be picked up and tied to a specific player.</li>
<li>As soon as a discovery is made, this <i>must be echoed to the entire room</i> (it must not be up to the finder to announce what they found to everyone else). </li>
</ul>
As a side-effect of this I also set a limit to the kind of puzzles I would allow: <br />
<ul>
<li><i>No puzzles must require more than one player to solve</i>. While one could indeed create some very cool puzzles where people collaborate, it's simply not feasible to do so with random strangers on the internet. At any moment the other guy may log off and leave you stuck. And that's if you even find someone logged in at the same time in the first place! The room should always be possible to solve solo, from beginning to end.</li>
</ul>
<br />
<span style="font-size: large;">Focusing on objects</span><br />
<br />
So without inventory system, how <i>do</i> you interact with objects? A trademark of any puzzle is using one object with another and also to explore things closer to find clues. I turned to graphical adventure games for inspiration:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4IARWlM12q1mHcBuGqdZlyHIKkczGQzEy0w88lRCn8WE_7wqgFFda3a9h27AacGjjOCLmgvpfxRUDvyp_RsqtmHvjC0KJCQNRnuJ9-tArDv9mRHL6MmGI6tgRGXUV_v63ieaMMSP_1zk/s1600/1569-4-secret-of-monkey-island-the.jpg" style="margin-left: auto; margin-right: auto;"><img alt="Hovering with mouse over lens object offers action "look at lens"" border="0" data-original-height="200" data-original-width="320" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4IARWlM12q1mHcBuGqdZlyHIKkczGQzEy0w88lRCn8WE_7wqgFFda3a9h27AacGjjOCLmgvpfxRUDvyp_RsqtmHvjC0KJCQNRnuJ9-tArDv9mRHL6MmGI6tgRGXUV_v63ieaMMSP_1zk/s400/1569-4-secret-of-monkey-island-the.jpg" title="Monkey Island GUI" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i>Secret of Monkey Island ©1990 LucasArts. Image from old-games.com</i></td></tr>
</tbody></table>
<br />
A common way to operate on an object in traditional adventure games is to hover the mouse over it and then select the action you want to apply to it. In later (3D) games you might even zoom in of the object and rotate it around with your mouse to see if there are some clues to be had. <br />
<br />
While Evennia and modern UI clients <i>may</i> allow you to use the mouse to select objects, I wanted this to work the traditional MUD-way, by inserting commands. So I decided that you as a player would be in one of two states: <br />
<ul>
<li>The 'normal' state: When you use <span style="font-family: "courier new" , "courier" , monospace;"><b>look</b></span> you see the room description. </li>
<li>The 'focused' state: You focus on a specific object with the <span style="font-family: "courier new" , "courier" , monospace;"><b>examine <target></b></span> command (aliases are <span style="font-family: "courier new" , "courier" , monospace;"><b>ex </b></span>or just <span style="font-family: "courier new" , "courier" , monospace;"><b>e</b></span>). Now object-specific actions become available to you. Use <b><span style="font-family: "courier new" , "courier" , monospace;">examine</span></b> again to "un-focus". </li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3MOFYV-AeP6A_AAg9DB5Kv8vbovaWbN4nuVJMFBqtHHAnL45SaUJmI3zjvEL5j6FlEMpgzjjuDI8db6HsgsOn2yRePNU0htSrfEbhEOkP5eIoOSnDNqzXG3Fh-F5Ris1D0OqAUk4vuwg/s1600/Screenshot+from+2019-05-17+11-41-50.png" style="margin-left: 1em; margin-right: 1em;"><img alt="A small stone fireplace sits in the middle of the wall opposite the [door]. On the chimney hangs a small oil [painting] of a man. Hanging over the hearth is a black [cauldron]. The piles of [ashes] below are cold. (It looks like fireplace may be suitable to [climb].)" border="0" data-original-height="370" data-original-width="1484" height="99" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3MOFYV-AeP6A_AAg9DB5Kv8vbovaWbN4nuVJMFBqtHHAnL45SaUJmI3zjvEL5j6FlEMpgzjjuDI8db6HsgsOn2yRePNU0htSrfEbhEOkP5eIoOSnDNqzXG3Fh-F5Ris1D0OqAUk4vuwg/s400/Screenshot+from+2019-05-17+11-41-50.png" title="Examining a fireplace" width="400" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;"><span style="font-size: small;">In the example above, the fireplace points out other objects you could also focus on, whereas the last parenthesis includes one or more "actions" that you can perform on the fireplace only when you have it focused. </span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;">This ends up pretty different from most traditional MUD-style inputs. When I first released this to the public, I found people logged off after their first examine. It turned out that they couldn't figure out how to leave the focus mode. So they just assumed the thing was buggy and quit instead. Of course it's mentioned if you care to write <span style="font-family: "courier new" , "courier" , monospace;"><b>help</b></span>, but this is clearly one step too many for such an important UI concept. </span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;">So I ended up adding the header above that always reminds you. And since then I've not seen any confusion over how the focus mode works.</span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;">For making it easy to focus on things, I also decided that each room would only ever have one object named a particular thing. So there is for example only one single object in the game named "key" that you can focus on. </span></span><br />
<br />
<span style="font-size: large;">Communication</span><br />
<br />
I wanted players to co-exist in the same room so that they could collaborate on solving it. This meant communication must be possible. I pictured people would want to point things out and talk to each other. <br />
<br />
In my first round of revisions I had a truckload of individual emotes; you could<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>point at target</b></span><br />
<br />
for example. In the end I just limited it to <b> </b><br />
<br />
<b> <span style="font-family: "courier new" , "courier" , monospace;">say/shout/whisper <message></span></b> <br />
<br />
and <br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><b>emote <whatever></b></span> <br />
<br />
And seeing what people actually use, this is more than enough (<span style="font-family: "courier new" , "courier" , monospace;"><b>say</b></span> alone is probably 99% of what people need, really). I had a notion that the shout/whisper could be used in a puzzle later but in the end I decided that communication commands should be strictly between players and not have anything to do with the puzzles.<br />
<br />
I removed all other interaction: There is no fighting and without an inventory or requirement to collaborate on puzzles, there is no need for other interactions than to communicate.<br />
<br />
First version you didn't even see what the others did, but eventually I added so that you at least saw what other players were focusing on at the moment (and of course if some major thing was solved/found).<br />
<br />
In the end I don't even list characters as objects in the room (you have to use the <span style="font-family: "courier new" , "courier" , monospace;"><b>who</b></span> command to see who's in there with you).<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp3ccd74x7rNQQpuhKQaQPThi0e5SRbkTNTLeKYiQkJ-JbCAMNL2QvkkOI9kkd-gBi-wUpC9bINQ77YHXtQBFtp_fbycgC3uHBEQUP_g5xWYQZc8mXMyYmUXAuayEIK6_hw3yCxfnh-_Y/s1600/Screenshot+from+2019-05-17+11-38-49.png" style="margin-left: auto; margin-right: auto;"><img alt="Listing of commands available in the Evscaperoom (output of the help-command in game)" border="0" data-original-height="860" data-original-width="1500" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp3ccd74x7rNQQpuhKQaQPThi0e5SRbkTNTLeKYiQkJ-JbCAMNL2QvkkOI9kkd-gBi-wUpC9bINQ77YHXtQBFtp_fbycgC3uHBEQUP_g5xWYQZc8mXMyYmUXAuayEIK6_hw3yCxfnh-_Y/s400/Screenshot+from+2019-05-17+11-38-49.png" title="Help command output" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The main <b>help</b> command output.</td></tr>
</tbody></table>
<span style="font-size: small;"><span style="font-size: large;">Story</span></span><br />
<br />
<span style="font-size: small;">It's very common for this type of game to have a dangerous or scary theme. Things like "get out before the bomb explodes", "save the space ship before the engines overheat", "flee the axe murderer before he comes back" etc). I'm no stranger to dark themes, but for this I wanted something friendlier and brighter, maybe with a some dark undercurrents here and there. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">My <a href="https://www.deviantart.com/griatch-art/art/Say-hi-to-Mrs-Buttons-153984575" target="_blank">Jester character</a> is someone I've not only depicted in art, but she's also an old RP character and literary protagonist of mine. Who else would find it funny to lock someone into a room only to provide crazy puzzles and hints for them to get out again? So my flimsy 'premise' was this: </span><br />
<span style="font-size: small;"><br /></span>
<br />
<div style="text-align: center;">
<span style="font-size: small;"><i>The village Jester wants to win the pie eating contest. You are one of her most dangerous opponents. She tricked you to her cabin and now you are locked in! If you don't get out in time, she'll get to eat all those pies on her own and surely win! </i></span></div>
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">That's it - this became the premise from which the entire game flowed. I quickly decided that it to be a very "small-scale" story: no life-or-death situation, no saving of the world. The drama takes place in a small village with an "adversary" that doesn't really want to hurt you, but only to eat more pies than you.</span><br />
<br />
<span style="font-size: small;">From this, the way to offer hints came naturally - just eat a slice of "hintberry pie" the jester made (she even encourage you to eat it). It gives you a hint but is also very filling. So if you eat too much, how will you beat her in the contest later, even if you do get out? </span><br />
<br />
<span style="font-size: small;">To further the rustic and friendly tone I made sure the story took place on a warm summer day. Many descriptions describe sunshine, chirping birds and the smell of pie. I aimed at letting the text point out quirky and slightly comedic tone of the puzzles the Jester left behind. The player also sometimes gets teased by the game when doing things that does not make sense. </span><br />
<br />
<span style="font-size: small;">I won't go into the story further here - it's best if you experience it yourself. Let's just say that the village has some old secrets. And and the Jester has her own ways of doing things and of telling a story. The game has multiple endings and so far people have drawn very different conclusions in the end. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: large;">Scoring</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">Most often in escape rooms, final score is determined by the time and the number of hints used. I do keep the latter - for every pie you eat, you get a penalty on your final score. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">As for time - this background story <i>would</i> fit very well with a time limit (get out in X time, after which the pie-eating contest will start!). But from experience with other online text-based games I decided against this. Not only should a player be able to take a break, they may also want to wait for a friend to leave and come back etc. </span><br />
<br />
<span style="font-size: small;">But more importantly, I want players to explore and read all my carefully crafted descriptions! So I'd much rather prefer they take their time and reward them for being thorough. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">So in the end I give specific scores for actions throughout the game instead. Most points are for doing things that drive the story forward, such as using something or solving a puzzle. But a significant portion of the score comes from turning every stone and trying everything out. The nice side-effect of this is that even if you know exactly how to solve everything and rush through the game you will still not end up with a perfect score. </span><br />
<br />
<span style="font-size: small;">The final score, adjusted by hints is then used to determine if you make it in time to the contest and how you fare. This means that if you explore carefully you have a "buffer" of points so eating a few pies may still land you a good result in the end. </span><br />
<span style="font-size: small;"> </span><br />
<br />
<span style="font-size: small;"><span style="font-size: large;">First sketch</span></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">I really entered the game 'building' aspect with no real notion of how the Jester's cabin should look nor which puzzles should be in it. I tried to write things down beforehand but it didn't really work for me. </span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">So in the end I decided "let's just put a lot of interesting stuff in the room and then I'll figure out how they interact with each other". I'm sure this is different from game-maker to game-maker. But for me, this process worked perfectly. </span><br />
<span style="font-size: small;"><br /></span>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUpEw47-h1ps0dCKRKipVDS-bjFnL7_aRFas4fQYlXW0drSiAHY_lHNtebkPuTGdlqZFFTGRourdm_2g3kd_V8HmxKfHHcme6xyX4mMZz1U-8WdJT_75c1prk5ur0qH26SPBuglBqrBrw/s1600/20190515_230856.jpg" style="margin-left: auto; margin-right: auto;"><img alt="Scribbles on my notebook, sketching up the room's main items" border="0" data-original-height="1600" data-original-width="900" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUpEw47-h1ps0dCKRKipVDS-bjFnL7_aRFas4fQYlXW0drSiAHY_lHNtebkPuTGdlqZFFTGRourdm_2g3kd_V8HmxKfHHcme6xyX4mMZz1U-8WdJT_75c1prk5ur0qH26SPBuglBqrBrw/s640/20190515_230856.jpg" title="Scriblles on notebook" width="360" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">My first, very rough, sketch of the Jester's cabin</td><td class="tr-caption" style="text-align: center;"><br /></td></tr>
</tbody></table>
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">The above, first sketch ended up being what I used, although many of the objects mentioned never ended up in the final game and some things switched places. I did some other sketches too, but they'd be spoilers so I won't show them here ...</span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><br /></span>
<span style="font-size: small;"><span style="font-size: large;">The actual game logic</span></span><br />
<span style="font-size: small;"><br /></span>
<span style="font-size: small;">The Evscaperoom principles outlined above deviate quite a bit from the traditional MU* style of game play. </span><br />
<br />
<span style="font-size: small;">While Evennia provides everything for database management, in-game objects, commands, networking and other resources, the specifics of your game is something you need to make yourself - and you have the full power of Python to do it! </span><br />
<br />
<span style="font-size: small;">So for the first three days of the jam I used Evennia to build the custom game logic needed to provide the evscaperoom style of game play. I also made the tools I needed to quickly create the game content (which then took me the rest of the jam to make). </span><br />
<br />
<span style="font-size: small;">In part 2 of this blog post I will cover the technical details of the Evscaperoom I built. I'll also go through some issues I ran into and conclusions I drew. I'll link to that from here when it's available!</span><br />
<br />
<span style="font-size: small;"><a href="https://evennia.blogspot.com/2019/05/creating-evscaperoom-part-2.html" target="_blank">Continue to part 2. </a></span>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com2tag:blogger.com,1999:blog-8338260444057832583.post-46552863213927940142019-05-09T15:38:00.001+02:002019-05-09T15:38:30.842+02:00Podcast about Evennia<div class="separator" style="clear: both; text-align: center;">
<a href="https://assets.fireside.fm/file/fireside-images/podcasts/images/f/f5646c0a-3321-4158-a4fa-d4a14ec2d573/cover_medium.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="800" data-original-width="800" height="200" src="https://assets.fireside.fm/file/fireside-images/podcasts/images/f/f5646c0a-3321-4158-a4fa-d4a14ec2d573/cover_medium.jpg" width="200" /></a></div>
<b>I</b> was interviewed on the (pretty grandiosely named) podcast <i>Titans of Text</i> the other day. <br />
<br />
In the interview, which are run by people from the <a href="https://mudcoders.com/" target="_blank">MUD Coder's Guild</a> (a great initiative!), I talk a bit about the history of Evennia, the text-based multiplayer game engine I'm working on, and go into some various technical aspects of the engine as well. Check it out and support the podcast!<br />
<br />
<a href="https://www.titansoftext.com/4">https://www.titansoftext.com/4</a> Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-52639602425409864072019-04-25T11:42:00.002+02:002019-04-25T11:42:45.527+02:00Steaming on, eating jam<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj80S7GDKH5KAUC7JbzSPrE1vbnvJP2AmI9nvXhny4BJzO2PW2XfUT3KqQFXS1xMLJ94zg2SFMgtYz8cXEtu1G144OSydszN4jGw4ZSVWHZlzUl-jCvIJO-BMRhSrS9d32ukJSH18URjZ0/s1600/2009-2211.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="480" data-original-width="800" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj80S7GDKH5KAUC7JbzSPrE1vbnvJP2AmI9nvXhny4BJzO2PW2XfUT3KqQFXS1xMLJ94zg2SFMgtYz8cXEtu1G144OSydszN4jGw4ZSVWHZlzUl-jCvIJO-BMRhSrS9d32ukJSH18URjZ0/s320/2009-2211.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><i><span style="font-size: xx-small;">Image credit: The Smithsonian</span></i></td></tr>
</tbody></table>
<span style="font-size: x-large;">I</span>n the last few months, development of the upcoming <a href="http://www.evennia.com/" target="_blank">Evennia</a> 0.9 has been steaming on. Evennia is, as you may know, a Python library for creating text-based multiplayer games (MUDs, MUSH etc).<br />
But it's not all backend work! There is also some sweet game-jamming going on, I get to that at the end. <br />
<br />
<br />
<h3>
Evennia progress towards Python3 </h3>
The regular Evennia <i>develop</i> branch is now running completely in Python 3. Since we are using some new features of this Python release, we will be aiming for Python 3.7 as a minimum version once Evennia 0.9 goes stable. We will also use Django 2.1 and likely Twisted 19 - so we'll be pretty much up-to-date on all our main dependencies.<br />
<br />
Now, while the release of Evennia 0.9 is still some time away (there are a bunch of regular bug fixes and minor features that I want to get in there too (see the progress <a href="https://github.com/evennia/evennia/projects/8" target="_blank">here on the github 0.9 project page</a>), it's worth to consider how much work it'll be for you to migrate and if you should wait or jump in right now.<br />
<br />
If you are new, I still recommend you use regular <i>master</i> branch Evennia (using Python 2.7). This is for which all wiki articles and documentation online is currently written after all. Once we move to python3, you'll need to convert your code ... but syntactically the two are really not that different and conversion should not be much of an issue.<br />
<br />
Not only are there automatic converters for most stuff, you should only need to do one pass to make sure things work and then you'll be done. <a href="https://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html" target="_blank">This article</a> is pretty old but it serves well to identify the main differences. Later Py3 versions just adds new stuff which you would just not have had access to in Python2.7. Once 0.9 is released, we'll also make guides for how you go about converting existing code (apart from the wealth of info on this topic online). <br />
<br />
That said, if you are feeling more adventurous, or <i>really</i> want to use Python3 right away, many of the Evennia developer regulars have been running and testing <i>develop </i>branch for months now. It's overall been a pretty painless transition - as said, py3 is not that different from py2.<br />
<br />
However, <i>develop </i>branch has other features beyond the py3 jump. And those are not yet documented in the main docs. So you'll have to contend with that (but asking in chat/forum works of course). However while it works fine for development already, as a matter of principle I <i>do not</i> recommend ever using Evennia's <i>develop </i>branch for a production game - it can change quickly and may occationally be broken. You have been warned! <br />
<br />
<h3>
Game Jam</h3>
We are now a little more than a week into the <a href="https://mudcoders.com/" target="_blank">Mud Coders Guild</a>'s second yearly <a href="https://itch.io/jam/enterthemud2" target="_blank">Game Jam</a>. This year's theme is "One Room".<br />
<br />
I really hope some more Evennia devs jump on this one because Evennia is perfect for this kind of experimental games. This is because Evennia is not imposing a game style on you - while there are default commands you are free to replace or customize the commands, objects and every aspect of your game to be as specific as you want to your game. <br />
<br />
For example, I have a small Game Jam contribution in the works, where I very quickly reworked the default Evennia setup to pretty much make it into a different genre of game.<br />
<br />
Usually the systems I make for Evennia are generic and intended for any game-type. By contrast, making somehing highly niched is super-fast to do: Building a whole new framework for game mechanisms along with build helpers for me to quickly make content took no more than three days. <br />
<br />
There will no doubt be some iteration, but I hope to spend the rest of the jam time on content and gameplay. I have some RL things happening in the coming weeks (including work on Evennia proper) but if I can get the time to tie my jam entry together, I'll likely make one or two blog posts about how it was developed and my reasons for making the choices i did. Most likely the code will appear as an Evennia contribution in case people want to do something similar for their own projects. <br />
<br />
So, busy days. Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-67552913165157790842019-01-02T20:22:00.002+01:002019-01-02T20:22:41.859+01:00Into 2019!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjUgKkBDwJg7Zm97-2SKqRmpBh3edOPiQtzB3aKMpMGcmwDXGzWgfSHdSjsyyf6Ew3svKcXNWdrnmyhiKJvmWNO2yEEjZoaIc5FG_WH82vpvzyv94tH9yiK_qpFD4CPwFaRqELCkbqqFo/s1600/fireworks.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="481" data-original-width="720" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjUgKkBDwJg7Zm97-2SKqRmpBh3edOPiQtzB3aKMpMGcmwDXGzWgfSHdSjsyyf6Ew3svKcXNWdrnmyhiKJvmWNO2yEEjZoaIc5FG_WH82vpvzyv94tH9yiK_qpFD4CPwFaRqELCkbqqFo/s320/fireworks.jpg" width="320" /></a></div>
<span style="font-size: x-large;">A</span> new year has come around and it's time to both look back at the old and onward to the future of <a href="http://www.evennia.com/" target="_blank">Evennia</a>, the Python MUD creation system!<br />
<br />
<h4>
</h4>
<h4>
</h4>
<h4>
</h4>
<h4>
</h4>
<h4>
</h4>
<h4>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgEHJQkLY8hTXJ-_qVgmUgAF_Oqv5BXlsFoZ7ua7gqzE5O3LYS0nH8aUiWiPp95h2_U-BUn33cycStojBE2fq20jMtXErUXgx2Q3C55HkAlarIkEhzSiAphWPBN1jIOnWdwpqx6vaRu5M/s1600/Screenshot+from+2018-09-30+21-09-55.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgEHJQkLY8hTXJ-_qVgmUgAF_Oqv5BXlsFoZ7ua7gqzE5O3LYS0nH8aUiWiPp95h2_U-BUn33cycStojBE2fq20jMtXErUXgx2Q3C55HkAlarIkEhzSiAphWPBN1jIOnWdwpqx6vaRu5M/s320/Screenshot+from+2018-09-30+21-09-55.png" width="320" /></a>Last year </h4>
Last year saw the release of <a href="https://www.blogger.com/blogger.g?blogID=8338260444057832583#editor/target=post;postID=7101674864552615043;onPublishedMenu=allposts;onClosedMenu=allposts;postNum=2;src=postname" target="_blank">Evennia 0.8</a>. This version of Evennia changes some fundamental aspects of the server infrastructure so that the server can truly run in daemon mode as you would expect (no more running it in a GnuScreen session if you want to see logging to the terminal). It also adds the new Online Creation System, which lets builders create and define prototypes using a menu system as well as big improvements in the web client, such as multiple window-panes (allows the user to assign text to different windows to keep their client uncluttered) as well as plenty of fixes and features to help ease life for the Evennia developer. Thanks again to everyone who helped out and contributed to the release of Evennia 0.8!<br />
<br />
On a personal note, I spoke about Evennia at PyCon Sweden this December, which was fun. I might put up my talk and make a more detailed blog post about that in the future, but my talk got a surprising amount of attention and positive feedback. Clearly many people have fond memories of MUDs and enjoy seeing they are not only still around but are possible to create in Python!<br />
<br />
<h4>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ1HnrW-ydBCyWuiIrfwEIygEdvBLkrxo7mKkhLKrdRQQGpgF0FCDt5UlhmWmRnv8x-wH8y8Cw9WCgB_hfLVQ6rdvRvkL0ntFJShOFTv8T8nklXhvZjXVoJY4_mBC3bDAaA5T0KGXt0Bg/s1600/61SA0Wq1P1L.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="512" data-original-width="512" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ1HnrW-ydBCyWuiIrfwEIygEdvBLkrxo7mKkhLKrdRQQGpgF0FCDt5UlhmWmRnv8x-wH8y8Cw9WCgB_hfLVQ6rdvRvkL0ntFJShOFTv8T8nklXhvZjXVoJY4_mBC3bDAaA5T0KGXt0Bg/s200/61SA0Wq1P1L.png" width="200" /></a>This year</h4>
Now we are steaming ahead towards Evennia 0.9! Already we have had a large number of contributions towards this release. A coming change is a much improved central way to make typeclass information available to a website as well as central ways to do various common operations like creating characters and linking them to Accounts. Much of this functionality is today hidden in the various default commands. In Evennia 0.9 they will be moved into more easily-findable locations as library functions everyone can just trigger without having to copy functionality.<br />
<br />
The biggest change for Evennia 0.9 is however that we will now finally move Evennia over to <b>Python 3</b>. This is now possible as all our dependencies are now sufficiently ported. As discussed in the community for a long time, this will be a clean break - we will not offer any mid-way solution of Python2/3 but will drop Python2 support entirely. We will at the same time move to Django 2.+. In Django 0.9 we will however probably not use any special Python3 features yet. It should hopefully not be too difficult for our users to upgrade, but we'll of course publish extensive instructions and help when that time comes. <br />
<br />
We will likely support a minimum of Python 3.6 and maybe 3.7. This work is currently happening in a separate branch <b>develop-py3</b> which will soonish merge into the current Python2.7-based <b>develop</b> branch and become Evennia 0.9 when it merges into <b>master</b> branch at an unknown time later this year.<br />
<br />
There are a slew of other things planned for Evennia 0.9 and you can <a href="https://github.com/evennia/evennia/projects/8" target="_blank">follow the progress from our project page</a>. If you want to help out you are of course also very welcome. If you are new and are interested in getting your feet wet in helping out with Open-source development, we have <a href="https://github.com/evennia/evennia/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22" target="_blank">a list of good first issues you could jump into</a>. <br />
<br />
Onward into the new year!<br />
<br />
<br />
<br />
<i><span style="font-size: x-small;">Fireworks image courtesy: U.S. Air Force photo by Zachary Hada</span></i>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-14406284534106506872018-10-04T10:34:00.002+02:002018-10-04T10:34:52.831+02:00Evennia in Hacktoberfest 2018<div class="separator" style="clear: both; text-align: center;">
<a href="https://hacktoberfest.digitalocean.com/assets/hacktoberfest-2018-social-card-c8d2e1489f647f2e0a26e6f598adeb760872818905b34cd437afc7ac2857ceab.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="420" data-original-width="800" height="168" src="https://hacktoberfest.digitalocean.com/assets/hacktoberfest-2018-social-card-c8d2e1489f647f2e0a26e6f598adeb760872818905b34cd437afc7ac2857ceab.png" width="320" /></a></div>
<span style="font-size: x-large;">L</span>ike last year, Evennia, the Python MUD creation system, takes part in <a href="https://hacktoberfest.digitalocean.com/" target="_blank">Hacktoberfest</a>, a yearly event run by Digitalocean in collaboration with GitHub.<br />
<br />
The premise is simple: Sign up at their website and then contribute with 5 GitHub pull requests during the month of October. If you do, you'll win a unique T-shirt!<br />
<br />
You can help out any OSS project to win, if you want to help out Evennia, I have marked a bunch of <a href="https://github.com/evennia/evennia/issues?q=is%3Aissue+is%3Aopen+label%3AHacktoberfest" target="_blank">suitable issues with the <b>Hacktoberfest </b>label </a>for you to sink your teeth in. <br />
<br />
Code on! Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-71016748645526150432018-09-30T21:35:00.000+02:002018-09-30T21:35:23.401+02:00Evennia 0.8 released <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqdB2uOytM0sJ71gRTHkV_t8LcTVqBFw0RbEl9POCVtIyVrC__TM5YzydZQ_cWW0BUOTflhFHqfQUN2vjTjdjCdHHrPPKe8e9AeFrUbdStYCRsIxdlMM5375vESmW4sLCoj5KlJ0Mvl9o/s1600/evennia_logo_small.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="165" data-original-width="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqdB2uOytM0sJ71gRTHkV_t8LcTVqBFw0RbEl9POCVtIyVrC__TM5YzydZQ_cWW0BUOTflhFHqfQUN2vjTjdjCdHHrPPKe8e9AeFrUbdStYCRsIxdlMM5375vESmW4sLCoj5KlJ0Mvl9o/s1600/evennia_logo_small.png" /></a><span style="font-size: x-large;">A</span>fter about a year of work and almost 540 commits from close to 20 contributors, <a href="http://www.evennia.com/" target="_blank">Evennia</a> 0.8 is out! Evennia is a Python game server for creating text-based multiplayer games (MUDs, Mushes, etc) using Django and Twisted.<br />
<br />
Some of the upcoming improvements have been covered by previous dev blogs, such as the <a href="https://evennia.blogspot.com/2018/01/kicking-into-gear-from-distance.html" target="_blank">completely reworked server infrastructure</a>: <br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfdGzJ8LgQoAjYESOkWm8HM5imeFSHKM6oHPAwRywohlb7rBBSLcuyulC2zzTU3tgQFN2ncUDVj4mv7j0SUFtx8Dt7S37Hyqdg7S6yj4eygfWOj6iPXgG6ZZ7aN0vKkg2ADAELe6Hvb6k/s1600/portal_server_reboot_develop.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="153" data-original-width="638" height="76" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfdGzJ8LgQoAjYESOkWm8HM5imeFSHKM6oHPAwRywohlb7rBBSLcuyulC2zzTU3tgQFN2ncUDVj4mv7j0SUFtx8Dt7S37Hyqdg7S6yj4eygfWOj6iPXgG6ZZ7aN0vKkg2ADAELe6Hvb6k/s320/portal_server_reboot_develop.png" width="320" /></a></div>
<br />
as well as the new <a href="https://evennia.blogspot.com/2018/08/inline-building-in-upcoming-evennia-08.html" target="_blank">Online Creation System</a> that allows for editing in-game prototypes using a powerful menu system:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl0sAIaGe2jpp_K1IIEDbLolr5E7vv-1pEXO0BmNrHQynq8WsarsMwY1iyEETRSOINtvtQwhMEDVv-oT9sBdC5uoNEiKm_WYEIYUxBAT-3DSgjoVzmt2nSDP-KJspJ5mDlsr5e8XQcadg/s1600/Screenshot+from+2018-08-18+12-26-12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="761" data-original-width="1600" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl0sAIaGe2jpp_K1IIEDbLolr5E7vv-1pEXO0BmNrHQynq8WsarsMwY1iyEETRSOINtvtQwhMEDVv-oT9sBdC5uoNEiKm_WYEIYUxBAT-3DSgjoVzmt2nSDP-KJspJ5mDlsr5e8XQcadg/s400/Screenshot+from+2018-08-18+12-26-12.png" width="400" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Other improvements are in the web client, which supports split-panes out of the box. The user can split the output area in any number of panes, resize as desired and then assign different types of content to each pane. You can also have panes that absorb "all the rest" or "all" of the content. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwE8HtLyPRUXazFqXV7fzhSQXMCoSaOjEbZlHACtQfMu4V_AFZyiHnnwK1fIl43aJ2_jH2ezJ_kiwHz7fbUvkpFr683ELLukCJ_Noqcp33THE7kKi-hGRAUj3FUVM1OfSQIZc8GaHmYUY/s1600/Screenshot+from+2018-09-30+21-09-55.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="900" data-original-width="1600" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwE8HtLyPRUXazFqXV7fzhSQXMCoSaOjEbZlHACtQfMu4V_AFZyiHnnwK1fIl43aJ2_jH2ezJ_kiwHz7fbUvkpFr683ELLukCJ_Noqcp33THE7kKi-hGRAUj3FUVM1OfSQIZc8GaHmYUY/s400/Screenshot+from+2018-09-30+21-09-55.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
There are still some bits which are a bit shaky and there is still much to do with the web client (for example, not that many outgoing messages yet defaults to being tagged in a way that the webclient recognizes). But it's a step forward!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
There are many other improvements for developers, such as easier tools for running debuggers and a lot of new utilities and helper functions. The menu-creation tool (EvMenu) has seen a lot of improvements and also sport a few new decorators for quickly creating multi-page menus with full functionality to flip through and select large numbers of options.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The community has also chipped in with a large number of optional contributions for developers to use for their own game, such as a full turn-based combat system (divided into convenient chunks for the dev to pick and choose support for everything from magic and potions to equipment and ranged attacks). There are also a range of helper functions for creating simpler menus and build commands as well as auditing tools and additions making better use of Django's very mature security features. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The more detailed list of improvements and changes can be found in the announcement <a href="https://groups.google.com/forum/#!category-topic/evennia/evennia-news/teSx6ICHSTU" target="_blank">here</a>. As usual, please report any issues to the issue tracker on github. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3 class="separator" style="clear: both; text-align: left;">
Future</h3>
<div class="separator" style="clear: both; text-align: left;">
In the immediate future, we'll focus on resolving any bugs that may have slipped through the cracks and also resolve some other issues in the pipeline. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
But beyond that, work on Evennia 0.9 will begin. And before you ask - yes Evennia 0.9 is the version where we'll move fully to Python3. Our dependencies have now reached a point where this is possible and there will be no intermediary Python2/3 version. There is no timeline for the 0.9 release but it should hopefully not be too tricky for the community to make the jump when the time comes. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com1tag:blogger.com,1999:blog-8338260444057832583.post-42339149509916984672018-08-18T14:23:00.002+02:002018-08-19T11:51:29.581+02:00Inline building in upcoming Evennia 0.8<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiQK02xTjn6A6KtTvn9Fq34wLqtEiyVz85sB84tEZj8xGmyd-zqewF726GdxfllQsXlPPvCrX1UXP_l0QJGEZF1yfFsVCZ7WDCXKJZjdL0N2u4d1QXy1MsDrQA6bRp3NUGUMxIaarxp38/s1600/773px-Industrial_Trust_Building_Providence_RI.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1197" data-original-width="773" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhiQK02xTjn6A6KtTvn9Fq34wLqtEiyVz85sB84tEZj8xGmyd-zqewF726GdxfllQsXlPPvCrX1UXP_l0QJGEZF1yfFsVCZ7WDCXKJZjdL0N2u4d1QXy1MsDrQA6bRp3NUGUMxIaarxp38/s200/773px-Industrial_Trust_Building_Providence_RI.jpg" width="128" /></a></div>
<br />
<a href="http://www.evennia.com/" target="_blank">Evennia</a>, the Python MUD-server game development kit, is slowly creeping closer to its 0.8 release.<br />
<br />
In our development branch I've just pushed the first version of the new OLC (OnLine Creator) system. This is a system to allow builders (who may have limited coding knowledge) to customize and spawn new in-game objects more easily without code access. It's started with the <span style="font-family: "courier new" , "courier" , monospace;"><b>olc</b></span> command in-game. This is a visual system for manipulating Evennia <i>Prototypes</i>.<br />
<br />
<br />
<h3>
Briefly on Prototypes</h3>
The <i>Prototype</i> is an Evennia concept that has been around a good while. The prototype is a Python dictionary that holds specific keys with values representing properties on a game object. Here's an example of a simple prototype:<br />
<br />
<blockquote class="tr_bq">
<b><span style="font-size: small;"><span style="font-family: "courier new" , "courier" , monospace;">{"key": "My house",</span> </span></b></blockquote>
<blockquote class="tr_bq">
<span style="font-size: small;"><b><span style="font-family: "courier new" , "courier" , monospace;"> "typeclass": "typeclasses.houses.MyHouse"} </span></b></span></blockquote>
<br />
By passing this dict to the <span style="font-family: "courier new" , "courier" , monospace;">spawner<span style="font-family: "arial" , "helvetica" , sans-serif;">, a new object named "My house" will be created. It will be set up with the given <span style="font-family: "courier new" , "courier" , monospace;">typeclass</span> (a 'typeclass' is, in Evennia lingo, a Python class with a database backend). A prototype can specify all aspects of an in-game object - its attributes (like description and other game-specific properties), tags, aliases, location and so on. Prototypes also support inheritance - so you can expand on an existing template without having to add everything fresh every time. </span></span><br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">There are two main reasons for the Prototypes existing in Evennia: </span><br />
<ul>
<li><span style="font-family: "arial" , "helvetica" , sans-serif;">They allow you to customize <i>individual</i> objects easier. For example you could have a 'Goblin' base prototype with inheriting prototypes Goblin Wizard" and "Goblin Chieftain" - all using the same Typeclass, but with different Attributes, equipment etc. </span></li>
<li><span style="font-family: "arial" , "helvetica" , sans-serif;">Prototypes can be manipulated and scripted by builders without needing full Python access. This means that while the Typeclasses are designed and supplied by the Python developer, the builders can then use that typeclass to make very different types of object instances in-game. </span><span style="font-family: "courier new" , "courier" , monospace;"></span></li>
</ul>
<h3>
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "arial" , "helvetica" , sans-serif;"> </span></span></h3>
<h3>
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "arial" , "helvetica" , sans-serif;">What's new </span></span></h3>
As said, Prototypes have been around for a good while in Evennia. But in the past they were either manually entered directly as a dict on the command line, or created in code and read from a Python module. The former solution is cumbersome and requires that you know how to build a proper-syntax Python dictionary. The latter requires server code access, making them less useful to builders than they could be.<br />
<br />
<i>Note: If you are visually impaired, each image is also a link to a text-only version.</i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://pastebin.com/raw/3YNtAdvz" target="_blank"><img alt="OLC index" border="0" data-original-height="761" data-original-width="1600" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaNmOB5ao-btDuuDmLBNlMVQ9ww48aPvrKqeKX0RGp1sMP4spslQ1VOf8Ma9YVztV7qj9Fxj1WCTJzB2V-2_EfS7bZRkfL5BXZZySl-17jziETX25eAzW_e52lJ8Rz1bhxJggu0l400HI/s400/Screenshot+from+2018-08-18+12-26-12.png" title="OLC index 1" width="400" /></a></div>
<br />
In Evennia 0.8, while you can still insert the Prototype as a raw dict, <span style="font-family: "courier new" , "courier" , monospace;"><b>spawn/menu </b><span style="font-family: "arial" , "helvetica" , sans-serif;">or the new </span><b>olc</b></span> command opens a new menu-driven interface.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://pastebin.com/raw/4UbUNGmG" target="_blank"><img alt="Select a prototype to load. This will replace any prototype currently being edited! ___________________________________________________________________________________________________ Select with <num>. Other actions: examine <num> | delete <num> Back (index) | Validate prototype | Quit 1: goblin_archer 5: goblin_archwizard 2: goblin_wizard 3: goblin 4: archwizard_mixin " border="0" data-original-height="430" data-original-width="1550" height="110" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDlaRTZEsaqftCkEVtjTaCoqjVRbcB6UpcBvzQ0J4ig6e_-zEJOtOdgleZ296REdYOOZNA7Z0_AQgpRny7noM6a2lwWANa9JyyDHZB9vaU-dyJDHZjVHMiGmRQJRA4nwGY1vKqJhEp4jY/s400/Screenshot+from+2018-08-18+12-27-37.png" title="Prototype loading" width="400" /></a></div>
<br />
More importantly, builders can now create, save and load prototypes in the database for themselves and other builders to use. The prototypes can be tagged and searched as a joint resource. Builders can also lock prototypes if others are not to be able to read or use them to spawn things. Developers can still supply module-based "read-only" prototypes (for use as starting points or examples to their Builders, for example). <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://pastebin.com/raw/dUGiSLDL" target="_blank"><img alt="Found 1 match. (Warning: creating a prototype will overwrite the current prototype!) ____________________________________________________________________________________ Actions: examine <num> | create prototype from object <num> Back (index) | Quit 1: Griatch(#1)" border="0" data-original-height="392" data-original-width="1280" height="122" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEIhdTOXpqlgpsfD3gelvvf_os9jWXhS9UJWBaWPkI3CPZPfuk51Z-guNakNBHSgtSdkJWcpLSDgyL0irBDqMjj9jdTsLgtoXLV81QaddObNKNgAzkaPOiVgExixojt2R-VEr2qW9VvcY/s400/Screenshot+from+2018-08-18+13-04-48.png" title="Load prototype from object" width="400" /></a></div>
<br />
You can now also use the menu to search for and create a new Prototype based on <i>an existing object </i>(if you have access to do so). This makes it quick to start up a new prototype and tweak it for spawning other similar objects. Of course you could spawn temporary objects without saving the prototype as well. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://pastebin.com/raw/VspKN3xf" target="_blank"><img alt="The Typeclass defines what 'type' of object this is - the actual working code to use. All spawned objects must have a typeclass. If not given here, the typeclass must be set in one of the prototype's parents. [No typeclass set] ______________________________________________________________________________________________________________________________________________ Back (prototype-parent) | Forward (key) | Index | Validate prototype | Quit 1: evennia.contrib.tutorial_world.mob.Mob 7: evennia.contrib.tutorial_world.objects.TutorialObject 2: evennia.contrib.tutorial_world.objects.Climbable 8: evennia.contrib.tutorial_world.objects.Weapon 3: evennia.contrib.tutorial_world.objects.CrumblingWall 9: evennia.contrib.tutorial_world.objects.WeaponRack 4: evennia.contrib.tutorial_world.objects.LightSource 10: evennia.contrib.tutorial_world.rooms.BridgeRoom 5: evennia.contrib.tutorial_world.objects.Obelisk current: (1/3) 6: evennia.contrib.tutorial_world.objects.Readable next page " border="0" data-original-height="511" data-original-width="1600" height="127" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjunISHuqNNBTvgf-yoYi5_08be0u9CkSoxbX4vddEYXRNT9V01l8qAhT0NAQhlfkVvlbCivlduTbuXtNUw8PKJxQ6W9YlouLf0nK8gkbXaMP1em9weqvJGyJTi1hCR9C_W_MMJ9qBjS3Q/s400/Screenshot+from+2018-08-18+13-15-44.png" title="Typeclass selection, miltipage" width="400" /></a></div>
<br />
Builders will likely not know which typeclasses are available in the code base. There are new a few ways to list them. The menu display makes use of Evennia 0.8's new EvMenu improvements, which allows for automatically creating multi-page listings (see example above).<br />
<br />
There is also a new switch to the <span style="font-family: "courier new" , "courier" , monospace;"><b>typeclass</b></span> command, <span style="font-family: "courier new" , "courier" , monospace;"><b>/list</b></span>, that will list all available typeclasses outside of the OLC. <br />
<h4>
</h4>
<h3>
Protfuncs</h3>
Another new feature are <i>Protfuncs. </i>Similarly to how <i>Inlinefuncs</i> allows for calling for the result of a function call inside a text string, Protfuncs allows for calling functions inside a prototype's values. It's given on the form <span style="font-family: "courier new" , "courier" , monospace;">$funcname(arguments)<span style="font-family: "arial" , "helvetica" , sans-serif;">, <span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "arial" , "helvetica" , sans-serif;">where <span style="font-family: "courier new" , "courier" , monospace;">arguments <span style="font-family: "arial" , "helvetica" , sans-serif;">could themselves contain one or more nested Protfuncs. </span></span></span></span></span></span><br />
<br />
As with other such systems in Evennia, only Python functions in a specific module or modules (given by settings) are available for use as Protfuncs in-game. A bunch of default ones are included out of the box. Protfuncs are called at the time of spawning. So for example, you could set the Attribute <span style="font-family: "courier new" , "courier" , monospace;"></span><br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;"><b>Strength = $randint(5, 20) </b><span style="font-family: "arial" , "helvetica" , sans-serif;"></span></span></blockquote>
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-family: "arial" , "helvetica" , sans-serif;">to automatically spawn objects with a random strength between 5 and 20. </span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://pastebin.com/raw/3VLMEPFd" target="_blank"><img alt="prototype-key: goblin, -tags: [], -locks: spawn:all();edit:all() -desc: Built from goblin prototype-parent: None key: goblin aliases: monster, mob attrs: desc = You see nothing special. strength = $randint(5,20) agility = $random(6,20) magic = 0 tags: mob (category: None) locks: call:true();control:id(1) or perm(Admin);delete:id(1) or perm(Admin);edit:perm(Admin);examine:perm(Builder);get:all();puppet:pperm(Developer) ;tell:perm(Admin);view:all() location: #2 home: #2 No validation errors found. (but errors could still happen at spawn-time) ______________________________________________________________________________________________________________________________________________ Actions: examine <num> | remove <num> Back (index) | Validate prototype | Quit 1: Spawn in prototype's defined location (#2) 2: Spawn in Griatch's location (Limbo) 3: Spawn in Griatch's inventory 4: Update 2 existing objects with this prototype" border="0" data-original-height="1052" data-original-width="1554" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_TNWsOSRJJ8_R1__VXLBL69gMGkoijcl6SUyUok8VzMYsmCiSEEA72aEa1IdlZs10IkRqIisINGWB51_9WcZr967QyIUy1uQ2fuh7OIx3LUUcFs-gjB7zEwSzP7fpgSLRx5_aHFdnTFE/s400/Screenshot+from+2018-08-18+13-40-04.png" title="Spawning screen" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
When spawning, the olc will validate the prototype and run tests on any Protfunc used. For convenience you can override the spawn-location if any is hard-coded in the prototype.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://pastebin.com/raw/K0a1z23h" target="_blank"><img alt="https://pastebin.com/raw/K0a1z23h" border="0" data-original-height="740" data-original-width="1404" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgi31ysPQ7I6957JZ3_F8m3BHiBQrugXCFxy2R-5NHKuSKXiyf0OovJy8-XHRaT0RDY8nmhyvzsCUis5lSM3hPf2Kx7xHkArsqd91ImFYP_mQAKqlCK14Pz6DN-nUKMxOo5H43n3of9p3I/s400/Screenshot+from+2018-08-18+13-58-27.png" width="400" /></a></div>
<br />
The system will also allow you to try updating existing objects created from the same-named prototype earlier. It will sample the existing objects and calculate a 'diff' to apply. This is bit is still a bit iffy, with edge cases that still needs fixing. <br />
<h4>
</h4>
<h3>
Current status</h3>
The OLC is currently in the <span style="font-family: "courier new" , "courier" , monospace;">develop</span> branch of Evennia - what will soon(ish) merge to become Evennia 0.8.<br />
<br />
It's a pretty big piece of code and as such it's still a bit unstable and there are edge cases and display issues to fix. But it would be great with more people trying it out and reporting errors so the childhood issues can be ironed out before release!<br />
<br />
<br />
<br />
<br />
<span style="font-size: xx-small;">Building Image: Released as Creative Commons <a href="https://en.wikipedia.org/wiki/File:Industrial_Trust_Building_Providence_RI.jpg" target="_blank">here</a> </span>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com2tag:blogger.com,1999:blog-8338260444057832583.post-67423148337157986812018-01-27T23:27:00.001+01:002018-01-27T23:27:46.442+01:00Kicking into gear from a distance<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKPeVtnLEjyoE7MZruV8iq17kbVV-nwLZncUSu0Eu9umf9IeVtM6Q0aX4FlDNlxd4b8zYAxfn-cvB0VhU8aLp8ZTK-cPkieRWsxOkkDMwoJTuhDBOml41EY3GhVmFQe6IsQOEnHMUw9s4/s1600/karate-312470_640.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="585" data-original-width="640" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKPeVtnLEjyoE7MZruV8iq17kbVV-nwLZncUSu0Eu9umf9IeVtM6Q0aX4FlDNlxd4b8zYAxfn-cvB0VhU8aLp8ZTK-cPkieRWsxOkkDMwoJTuhDBOml41EY3GhVmFQe6IsQOEnHMUw9s4/s200/karate-312470_640.png" width="200" /></a></div>
<b><span style="font-size: large;">T</span></b>he last few weeks I have reworked the way <a href="http://www.evennia.com/" target="_blank">Evennia</a>'s startup procedure works. This is now finished in the <i>develop</i> branch so I thought I'd mention a little what's going on.<br />
<br />
Evennia, being a server for creating and running text-games (MU*s), consists of two main processes:<br />
<ul>
<li>The <i>Portal</i> - this is what players connect to with their clients. </li>
<li>The <i>Server</i> - this is the actual game, with the database etc. This can be shutdown and started again without anyone connected to the Portal getting kicked from the game. This allows for hot-adding new Python code into the running Server without any downtime. </li>
</ul>
Since Evennia should be easy to set up <i>and</i> also run easily on Windows as well as on Linux/Mac, we have foregone using the linux process management services but instead offered our own solution. This is how the reload mechanism currently looks in master branch:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnaqOClNal4vaL6ZOljNjequObv6OB9rNzYQ6chp5SDLsNygkf3FhWtj14Au99bmb0__YJ6HM7-HEF6ZWVKvJIJ8ansD4sml_V0pCSOTt6m2c4fUdwhEB5oO8xuAFu8J-obHNLj9t2v78/s1600/portal_server_reboot_master.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="235" data-original-width="647" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnaqOClNal4vaL6ZOljNjequObv6OB9rNzYQ6chp5SDLsNygkf3FhWtj14Au99bmb0__YJ6HM7-HEF6ZWVKvJIJ8ansD4sml_V0pCSOTt6m2c4fUdwhEB5oO8xuAFu8J-obHNLj9t2v78/s400/portal_server_reboot_master.png" width="400" /></a></div>
Here I've excluded connections irrelevant to reloading, such as the Twisted AMP connection between Portal and Server. Dashed lines suggest a more "temporary" connection than a solid line.<br />
<br />
The <b><i>Launcher</i></b> is the <span style="font-family: "Courier New", Courier, monospace;">evennia</span> program one uses to interact with the Server in the terminal/console. You give it commands like <span style="font-family: "Courier New", Courier, monospace;">evennia start/stop/reload</span>.<br />
<br />
<ul>
<li>When <b>starting</b>, the Launcher spawns a new program, the <i><b>Runner</b></i>, and then exits. The Runner stays up and starts the Portal and Server. When it starts the Server, it does so in a blocking way and sits waiting in a stalled loop for the Server process to end. As the Server and Portal start they record their current process-ids in <i><b>.pid files</b></i>. </li>
<li>When <b>reloading</b>, the Launcher writes a flag in a little <i><b>.restart</b></i> <i><b>file</b></i>. The Launcher then looks up the Server's .pid file and sends a SIGINT signal to that process to tell it to gracefully shut down. As the Server process dies, the Runner next looks at the Server's .restart file. If that indicates a reload is desired, The Runner steps in its loop and starts up a new Server process. </li>
<li>When <b>stopping, </b>everything happens like when reloading, except the .restart file tells the Runner that it should just exit the loop and let the Server stay down. The Launcher also looks at the Portal's .pid file and sends a SIGINT signal to kill it. Internally the processes catch the SIGINT and close gracefully. </li>
</ul>
The original reason for this Server-Portal-Runner setup is that the Portal is <i>also</i> reloadable in the same way (it's not shown above). But over time I've found that having the Portal reloadable is not very useful - since players get disconnected when the Portal reloads one can just as well stop and start both processes. There are also a few issues with the setup, such as the .pid files going stale if the server is killed in some catastrophic way and various issues with reliably sending signals under Windows. Also, the interactive mode works a little strangely since closing the terminal will actually kill the Runner, not the Server/Portal - so they will keep on running except they can no longer reload ...<br />
It overall feels a little ... fiddly. <br />
<br />
In develop branch, this is now the new process management setup:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIiqu6wmR7GfhUvUDYPP-718pepx2ZpETP879ZhDlF3XE-enVTmIVu-cN0sb-obNTKL_TilmjpplYoweICyCw1YM9K8d1SwrMfWjJkOkG8Jv7DLswxU0-ed9SCfDSBvhXHOCIONofVczg/s1600/portal_server_reboot_develop.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="153" data-original-width="638" height="95" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIiqu6wmR7GfhUvUDYPP-718pepx2ZpETP879ZhDlF3XE-enVTmIVu-cN0sb-obNTKL_TilmjpplYoweICyCw1YM9K8d1SwrMfWjJkOkG8Jv7DLswxU0-ed9SCfDSBvhXHOCIONofVczg/s400/portal_server_reboot_develop.png" width="400" /></a></div>
<br />
The Portal is now a Twisted <a href="https://twistedmatrix.com/documents/current/api/twisted.protocols.amp.html" target="_blank">AMP</a> server, while the Evennia Server and Launcher are AMP clients. The Runner is no more.<br />
<br />
<ul>
<li>When <b>starting</b>, the Launcher spawns the Portal and tries to connect to it as an AMP client as soon as it can. The Portal in turn spawns the Server. When the Server AMP client connects back to the Portal, the Portal reports back to the Launcher over the AMP connection. The Launcher then prints to the user and disconnects. </li>
<li>When <b>reloading</b>, the Launcher connects to the Portal and gives it a reload-command. The Portal then tells the Server (over their AMP connection) to shutdown. Once the Portal sees that the Server has disconnected, it spawns a new Server. Since the Portal itself knows if a reload or shutdown is desired no external .restart (or .pid) files are needed. It reports the status back to the Launcher that can then disconnect. </li>
<li>When <b>stopping</b>, the Launcher sends the "Stop Server" command to the Portal. The Portal tells the Server to shut down and when it has done so it reports back to the Launcher that the Server has stopped. The Launcher then sends the "Stop Portal" command to also stop the Portal. The Launcher waits until the Portal's AMP port dies, at which point it reports the shutdown to the user and stops itself. </li>
</ul>
So far I really like how this new setup works and while there were some
initial issues on Windows (spawning new processes does not quite work
they way you expect on that platform) I think this should conceptually
be more OS-agnostic than sending kill-signals. <br />
<br />
This solution gives much more control over the processes. It's easy to start/stop the Server behind the portal at will. The Portal knows the Server state and stores the executable-string needed to start the Server. Thus the Server can also itself request to be reloaded by just mimicking the Launcher's instructions. <br />
The launcher is now only a client connecting to a port, so one difference with this setup is that there is no more 'interactive' mode - that is the Server/Portal will always run as daemons rather than giving log messages directly in the terminal/console. For that reason the Launcher instead has an in-built log-tailing mechanism now. With this the launcher will combine the server/portal logs and print them in real time to easily see errors etc during development.<br />
<br />
The merger of the develop branch is still a good bit off, but anyone may try it out already here: https://github.com/evennia/evennia/tree/develop . Report problems to the issue tracker as usual.Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-77364900264527822562018-01-05T11:29:00.000+01:002018-01-05T11:29:25.091+01:00New year, new stuff<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTcFhhf3gWAZt5HjwHIA0ZsyPco3eT8N8y3Rvzdqzoztv7QowXdltgKaL7wAiIeXdEiAGyUowXwrQCH-OR8r4mZWy8mbZBmzIDNvgF5NpHALxGGGsSrqalkxH5j_dMq6aUbLUVO7MfRPU/s1600/child-1539341_640.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="640" data-original-width="640" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTcFhhf3gWAZt5HjwHIA0ZsyPco3eT8N8y3Rvzdqzoztv7QowXdltgKaL7wAiIeXdEiAGyUowXwrQCH-OR8r4mZWy8mbZBmzIDNvgF5NpHALxGGGsSrqalkxH5j_dMq6aUbLUVO7MfRPU/s200/child-1539341_640.jpg" width="200" /></a></div>
<span style="font-size: large;"><b>H</b></span>appy 2018 everyone! Here's a little summary of the past Evennia year and what is brewing.<br />
<br />
<i>(Evennia is a Python server- and toolbox for creating text-based multiplayer games (MU*)).</i><br />
<br />
The biggest challenge for me last year Evennia-wise was the release of Evennia 0.7. Especially designing the migration process for arbitrary users migrating the Django auth-user took a lot of thought to figure out <a href="http://evennia.blogspot.se/2017/08/renaming-djangos-auth-user-and-app.html" target="_blank">as described in my blog post here.</a> But now 0.7 <a href="http://evennia.blogspot.se/2017/09/evennia-07-released.html" target="_blank">is released</a> and a few initial minor adjustments could be made after feedback from daring pilot testers. <a href="https://groups.google.com/forum/#!category-topic/evennia/evennia-news/0JYYNGY-NfE" target="_blank">The final process</a> of migrating from 0.6 to 0.7 is, while involved, a step-by-step copy&paste list that has worked fine for most to follow. I've gotten far fewer questions and complains about it than could be expected so that's a good sign. <br />
<br />
Working away on the boring but important behind-the-scenes stuff made me less able to keep up with more "mundane" issues and bugs popping up, or with adding new "fun" features to existing code. Luckily the Evennia community has really been thriving this year; It feels like new users pop up in the support channel all the time now. The number of pull requests both fixing issues and offering new features and contribs have really picked up. A bigger part of my time has been spent reviewing Pull Requests this year than any other I think. I would like to take the opportunity to thank everyone contributing, it's really awesome to see others donating their time and energy adding to Evennia. The <a href="http://evennia.blogspot.se/2017/10/evennia-in-hacktoberfest-2017.html" target="_blank">Hacktoberfest</a> participation was also surprisingly effective in getting people to create PRs - I have a feeling some were just happy to have an "excuse" for getting started to contribute. We should attend that next year too. <br />
<br />
One thing we added with 0.7 was a more formal branching structure: Evennia now uses fixed <b>master</b> and <b>develop</b> branches, where master is for bug-fixes and develop is for new features (things that will eventually become evennia 0.8). This is simple but enough for our needs; it also makes it easier to track new from old now that we are actually doing releases. <br />
<br />
Now that Twisted is at a point where this is possible for us to do, we also now have a <a href="https://groups.google.com/forum/#!category-topic/evennia/evennia-news/GbLh1GF-ZaY" target="_blank">sort-of plan</a> for finally moving Evennia to Python 3. I won't personally be actively working on it until after 0.8 is out though. I don't expect both Evennia 0.8 and 0.9 (which will be pure py3) to get released this year, but we'll see - so far contributors have done all the work on the conversion.<br />
<br />
At any rate, this coming year will probably be dominated by catching up on issues and edge cases that are lining our <a href="https://github.com/evennia/evennia/issues" target="_blank">Issue tracker</a>. One side effect of more newcomers is more eyes on the code and finding the creaky-bits. At least for me, most of my Evennia-time will be spent resolving bugs and issues. The fun thing is that unlike previous years this is not only up to me anymore - hopefully others will keep helping to resolve issues/bugs to broaden our bandwidth when it comes to keeping Evennia stable. The faster we can handle the backlog of issues the faster we can focus on new shiny features after all. <br />
<br />
Finally, a continued great thank you to those of you contributing to the <a href="https://www.patreon.com/griatch" target="_blank">Patreon</a>. Even small donations have a great encouraging value when working on something as niche as a Python MU* game server in 2018 - thanks a lot!Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-53967362618968958302017-10-29T17:01:00.000+01:002017-10-29T17:01:08.639+01:00Getting a MUD Roleplaying Scene going<div dir="ltr" id="docs-internal-guid-252ab3e3-68c1-1d5d-b730-8791bf12b710" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: 'Trebuchet MS'; font-size: 21pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Getting a MUD RP-scene going</span></div>
<br />
<br />
<span style="font-size: x-small;">This article is a little different from the normal more technical <a href="http://www.evennia.com/" target="_blank">Evennia</a>-specific content of this blog. It was originally published as a light-hearted addition to the <a href="http://journal.imaginary-realities.com/" target="_blank">Imaginary Realities</a> e-zine many years ago. While IR is still online it has since dozed off. So I'm reposting it here to bring it to a new audience. </span><br />
<br />
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"><span style="font-size: x-large;">I</span>n roleplay-heavy MUDs (and in other categories of text-based roleplaying games), the concept of </span><span style="background-color: transparent; color: black; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">scenes</span><span style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> become important. A </span><span style="background-color: transparent; color: black; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">scene</span><span style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> in this concept is simply a situation big or small that involves you and your fellow players in interesting role play. A scene can be as simple as two players meeting in the street and exchanging a few words to the dramatic conclusion to a staff-driven quest. Whenever role player-interested players meet, a scene may happen.</span></span></div>
<span style="font-family: inherit;"><br /></span><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="font-family: inherit;"><span style="background-color: transparent; color: black; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">But sometimes scenes won’t come naturally. Sometimes your favourite game has only a few people online, or most of them are hovering in private areas. It’s time to go proactive. Below I offer some archetypes, tropes and ideas for how to get a random Scene started and people interested. The list is based on one I did for a RP-heavy MUD I played some time back.</span></span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Some terms used in the list: </span></div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Character concept </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">- The general idea behind your player character (PC), like “The scarred veteran”, “The grumpy old magician” or “The swashbuckling bounty-hunter”. </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 700; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">IC/OOC </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">- In-Character/Out-Of-Character.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Emote/pose </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">- This is the common way to roleplay in MUDs. This displays a free-form action to the room, such as “The tall man sighs heavily”. Some MUDs offer a slew of special commands for particular actions or special syntax to decorate poses. Some games use specific “say” commands for verbal communication whereas others make say’s part of the emote completely. </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 700; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Action/static pose </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">- a pose that “lingers”, such as </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The tall man is sitting by the bar</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. Commonly static poses remain assigned to your character’s description until you change it or exit the room, meaning that new people entering will immediately see your current status. </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">NPC</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> - Non-Player Character. Also known as a “mob”. An in-game character that is controlled by the computer, such as a bartender or a city guard. </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">vNPC</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> - a “virtual” NPC. This NPC does not actually exist in code but they </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">should </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">be there. Even though there are only two Players and a City guard in the central plaza, that place is </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">actually </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">packed with people most of the day. Most RP-heavy muds ask players to </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">imagine</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> vNPCs being all around them and have it influence their roleplay. </span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Godmodding</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 8pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> - this is considered very bad form. Godmodding means to include another Player’s character in your roleplay in a way that takes control away from them unfairly. Depending on the game, disagreements on how to resolve a situation may be down to skill checks, die rolls or calling in a staff arbiter.</span></div>
</li>
</ul>
<br /><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 10pt;">
<span style="font-size: large;"><span style="background-color: transparent; color: black; font-family: "Trebuchet MS"; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Scene starters</span></span></h2>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Scene starters</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> are for when you are alone in a room hoping for others to join you (we've all done it). It is considerably easier to run Scene starters if there is some OOC way for other players to know where to find you (such as a list showing who's interesting in roleplay and where they are in the game). If not, it’s best to prepare your starter in a commonly visited central location or hub. You normally trigger the starter whenever another Player enters.</span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The Scene starters below are intended as ideas and suggestions, but are also examples of archetypical behaviour I’ve observed myself. </span></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh5.googleusercontent.com/h5i2RaOuaKozyn9f3_BTy6DgIEtxivNHKmBE4sWQntpDM0CHof9VOVbouwCZY1X6AMtGOZIYGo8A-nJSDtDED3y-PxVKv74G5eiY__r2sjUR8XurPOoSupWvyzUmjdNazd_E4P8" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh5.googleusercontent.com/h5i2RaOuaKozyn9f3_BTy6DgIEtxivNHKmBE4sWQntpDM0CHof9VOVbouwCZY1X6AMtGOZIYGo8A-nJSDtDED3y-PxVKv74G5eiY__r2sjUR8XurPOoSupWvyzUmjdNazd_E4P8" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Barfly</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">A role playing mud classic since time immemorial. </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The barfly</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> is alone in a tavern and tends their drink, waiting for things to happen. A passive role, but trivial to setup and easy for other players to jump in on - they just slide up to the bar and ask what's up. Fun variations is the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">drunk barfly</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> or </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">really, really sad/happy barfly</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, states which immediately give other Players things to ask about and work with.</span></div>
<br />
<br />
<br />
<br /><br />
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"></span><a href="https://lh3.googleusercontent.com/RQVHP9QaojaIeer1bYbsblxkBk2kqxN04Tom_8YffXOD7JlBmJrCGbdMJ-qpZF8aAVOiCFeyL8kiiRYwc0JkOqOjCy3Ytcwf0qS-EymdnEZJnQFIEmRdmvVu16UFdOW9SpTkkEc" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://lh3.googleusercontent.com/RQVHP9QaojaIeer1bYbsblxkBk2kqxN04Tom_8YffXOD7JlBmJrCGbdMJ-qpZF8aAVOiCFeyL8kiiRYwc0JkOqOjCy3Ytcwf0qS-EymdnEZJnQFIEmRdmvVu16UFdOW9SpTkkEc" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Strider</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This is the "dark stranger in the corner" variation of </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the barfly</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. It is simple to execute - just sit in a dark tavern corner looking glum and mysterious. Often used by newbie players unsure of the game’s commands. The problem is that unless they know </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the Strider</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> from before it's hard for other Characters to include him/her in their roleplay in a realistic way. The whole IC point of this trope is after all to avoid attention.</span></div>
<br /><br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh3.googleusercontent.com/nQbZY-w_ChB4LhIqcT2-IWONaPl2VTl4_RZ05buEBwDABE7pZJ84TBgnTQni3IxhKqNvkKwU6UQA7k7xJtrTcRkuXhOXrgP3j7xX5zucumMBagIaKX1D0CfAkCIB8w9A0h0TBtI" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh3.googleusercontent.com/nQbZY-w_ChB4LhIqcT2-IWONaPl2VTl4_RZ05buEBwDABE7pZJ84TBgnTQni3IxhKqNvkKwU6UQA7k7xJtrTcRkuXhOXrgP3j7xX5zucumMBagIaKX1D0CfAkCIB8w9A0h0TBtI" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> The Busybody</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The busybody</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> is keeping busy in this room. Most commonly they are performing their job. If they own a bar or run the shop, they tend it. If they are guardsmen they are standing on patrol. If they are wee jesters they are making fools out of themselves. And so on. This is a great starter since it is both natural, realistic and in-character all at once. The nature of their work may occasionally make it easier or harder for other Characters come up with reasons to interact with them though - it might be harder to motivate why some characters would strike up a conversation with a guardsman than they would with a street vendor. </span></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> The Demagogue</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="https://lh5.googleusercontent.com/5fFNF2AG29zrkxWJH3qcen_SJpFLOnIDXDUt1f-k8bbhtjPoV-Bd_i-wvHge4DITlB7KXLGgzr4YD4Hf8cWJX8Q3KFHYZMXbLJXBqZdfhS23vtoyg6w7kuQ3AMHLhnc-GEsRuT8" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://lh5.googleusercontent.com/5fFNF2AG29zrkxWJH3qcen_SJpFLOnIDXDUt1f-k8bbhtjPoV-Bd_i-wvHge4DITlB7KXLGgzr4YD4Hf8cWJX8Q3KFHYZMXbLJXBqZdfhS23vtoyg6w7kuQ3AMHLhnc-GEsRuT8" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This more involved starter involves striking up a loud conversation with an NPC/vNPC. Whenever another Character enters, the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Demagogue</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> plays out a small scene where they are "arguing" with the NPC, playing both roles. The argument could be "continuing" or just starting as the new PC enters. It could be about anything from tavern prices to refuting a made-up insult. The advantage of this is that it gives immediate character to </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the demagogue</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and to the NPC both. It also makes it easy for the newcomer to get into the scene just by taking sides in the debate.</span></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh6.googleusercontent.com/K49MsnM4i2kMCpy7VQpOtw4tIoZjcM12JP-Gszfec04wnRftasf390AjEW644FuxRtBMtkn5kLbLeHrZctUPJutzWTApW3snrNCP6xFtcW-1DwQvOX1uFUhp7HSZANJcdaL85CQ" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh6.googleusercontent.com/K49MsnM4i2kMCpy7VQpOtw4tIoZjcM12JP-Gszfec04wnRftasf390AjEW644FuxRtBMtkn5kLbLeHrZctUPJutzWTApW3snrNCP6xFtcW-1DwQvOX1uFUhp7HSZANJcdaL85CQ" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Damsel in Distress</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This starter, which of course works both for male and female Characters, sets up </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the damsel</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> as being in a dependency situation to whomever enters the room next. It involves describing </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">damsel</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> in a sort of precarious situation that clearly requires an extra hand to resolve. This could be anything: Having their hands full and nearly dropping stuff. Chasing a dog that is running off with their book. Being accosted by vNPC ruffians (which should bugger off quickly, unless roleplaying completely “virtual” combat is your cup of tea). Either way the newcomer has an ongoing scene to react to, and roleplay immediately ensues.</span></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Organizer</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="https://lh6.googleusercontent.com/TquhRSMaFqrIsKPkIa2LZRw6mgiYsjD4Aban4OfAox60W9PiW2sWiKjsRnw2q_oUaFgD5cw9pHdNAYSDBHQOnbO5aFaRL1iVU2JP68W9AKsnAyzN3eCy81yxAfjuVVbATHueYro" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://lh6.googleusercontent.com/TquhRSMaFqrIsKPkIa2LZRw6mgiYsjD4Aban4OfAox60W9PiW2sWiKjsRnw2q_oUaFgD5cw9pHdNAYSDBHQOnbO5aFaRL1iVU2JP68W9AKsnAyzN3eCy81yxAfjuVVbATHueYro" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This starter requires that the game has a developed in-game message- or mailing system. If so - use it to explicitly and in-character </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">invite</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> people to a scene! If </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the organizer</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> is in a position of in-game power, this could make good IC sense - like the lord calling on their vassals to attend some sort of function. But anything from calling in a favor to suggesting a business opportunity or looking for a job works. Throw a party. Get drunk and send an ill-advised love letter. This starter works exceptionally well in combination with </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Stage director</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> or </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Aggravator</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> for getting selected Players into a memorable scene.</span></div>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh5.googleusercontent.com/ZKPX1lB3mp5BAFCLNd13sSR3UnXLGoC-uNASS_-T3BxSAu546fzIBZblSedIU_gOz4qyuo9GZvdLBl0V88TgWBJDJ2IYBBhjJs9uC-XLkTFy32dvyTRkn4UwszwKnnomk-OilGA" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh5.googleusercontent.com/ZKPX1lB3mp5BAFCLNd13sSR3UnXLGoC-uNASS_-T3BxSAu546fzIBZblSedIU_gOz4qyuo9GZvdLBl0V88TgWBJDJ2IYBBhjJs9uC-XLkTFy32dvyTRkn4UwszwKnnomk-OilGA" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> The Aggravator</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The aggravator </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">starts off on the wrong foot with people. Maybe they lash out due to some perceived injustice or they are just grumpy. This starter does not fit all character concepts. </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The aggravator</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> should accuse the newly arrived PC for something. It could be something from their common history or something made-up out of the blue. It is an active starter in that it leads the way and forces other PCs into roleplay - if nothing else in order to defend themselves. A simple example is to chide the newly arrived PC for not stopping the vNPC that just ran past them out the door. It's important not to take </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the aggravator</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> trope too far, especially not when using vNPCs. The idea is to get a scene started with some tension, not to get the other (possibly random) PC into real trouble. No god-modding, remember. If the two Characters are </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">actual </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">enemies though, it may be another matter ...</span></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Stage Director</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="https://lh5.googleusercontent.com/e2N_x7CTxpkz7suW4EpXkp-5My9U8L73rpkPuDIaU51lG5pyTU0lg-jVXYV2z14lU0bbu6QdFavVFbHodECRZueBF--tNYZZTyJ4EkN9hDehAbcydxs7U0CdrUtpsQLL7JQ9wEc" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://lh5.googleusercontent.com/e2N_x7CTxpkz7suW4EpXkp-5My9U8L73rpkPuDIaU51lG5pyTU0lg-jVXYV2z14lU0bbu6QdFavVFbHodECRZueBF--tNYZZTyJ4EkN9hDehAbcydxs7U0CdrUtpsQLL7JQ9wEc" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This is a more sophisticated starter that is halfway to improvised theater. It sets up a whole little scene involving some event with a number of semi-named vNPCs. The </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">stage director</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> could be directly involved or be a spectator (in which case other PCs can walk up to them and ask what's going on). The event could be anything from a trite bar brawl to a domestic dispute in progress. Or why not a marriage proposal between two vNPCs in the middle of the street! If the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">stage director</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> is threatened in some way, this is a large-scale version of </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">damsel in distress</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The nice thing about staged scenes like this is that it gives depth and personality to the game and is often highly appreciated by other Players. If done well, the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">stage director</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> could give everyone involved a true feeling of being in a living environment. </span></div>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The scene could continue to be played out around the PCs also as they interact, making this starter potentially demanding on the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">stage director</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. If the other Players are experienced they should pick up on this and maybe even contribute their own vNPCs to the scenario (or the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">stage director</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> could actively invite other Players to do so). It's important to remember to avoid god-modding here - never dictate another PCs actions, let other Players react as they see fit.</span></div>
<br /><br /><br /><br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh3.googleusercontent.com/ZLRgi7wonS0OUBRM-RUNCxiz-ZpkV0Upr2yIo4Sf8ROpOFaJtrXtAiHMWOmsel6TU3gCKyB7H5DIT9_fUDkebFT4SS1Tc1f_DHGoZUPjRnazFf5Qin-wlJI6u8QjJSqQodDoEQs" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh3.googleusercontent.com/ZLRgi7wonS0OUBRM-RUNCxiz-ZpkV0Upr2yIo4Sf8ROpOFaJtrXtAiHMWOmsel6TU3gCKyB7H5DIT9_fUDkebFT4SS1Tc1f_DHGoZUPjRnazFf5Qin-wlJI6u8QjJSqQodDoEQs" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Lazy Bum</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This is unfortunately the most common of starters and we've probably all done it one time or another. It does not involve anything but simply standing in a room. No action set, no nothing. Just being there, the Character staring blankly into space until something happens. Yeah.</span></div>
<br /><br /><br /><br /><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 10pt;">
<span style="background-color: transparent; color: black; font-family: 'Trebuchet MS'; font-size: 13pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h2>
<h2 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 10pt;">
<span style="font-size: large;"><span style="background-color: transparent; color: black; font-family: "Trebuchet MS"; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">Scene entrances</span></span></h2>
<br /><div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Here are some ideas on how to</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> enter</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> a scene/room with one or more other PCs already involved in role play. It should be noted that if other PCs already have a scene going they might be OOC annoyed if the newcomer muscles in with some room-changing entrance. So you as a Player have to show some consideration here. Check the land and eventual actions set on people in the room. If a great scene is already in progress you shouldn’t need to start your own - instead try to get in on the action!</span></div>
<br />
<br />
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh6.googleusercontent.com/M5gSt-Jag0SvZy7Pb0esu44RkEdfzfrNuv10wp1nVHV6e0gWJozqYjaOTfUNuBCzK2AVko-jUE_mctHUvj7fsu9_3X8Wn85E6eTVkjD7QFkQpaT6Vx-wCylBZgE2UmD30A8BwtM" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh6.googleusercontent.com/M5gSt-Jag0SvZy7Pb0esu44RkEdfzfrNuv10wp1nVHV6e0gWJozqYjaOTfUNuBCzK2AVko-jUE_mctHUvj7fsu9_3X8Wn85E6eTVkjD7QFkQpaT6Vx-wCylBZgE2UmD30A8BwtM" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Mouse</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The most common of entering schemes. </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The Mouse </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">walks into the room/area not drawing attention to themselves. A simple, passive setup that fits many situations and Character concepts. </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The mouse </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">is a useful way to enter an already running scene. It is a bit overused though, possibly being </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The lazy bum</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> of entrances. It seem to imply that it is up to others to notice and respond to </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the mouse</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. If really aiming for anonymity, </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the mouse</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> must emote explicitly that they are not drawing attention to themselves, making it clear to other characters they need not go out of their way to be courteous and notice the newcomer.</span></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Ignoranti</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="https://lh5.googleusercontent.com/DxLRp-g0L8meJkvI7WTLxvPtm2Q4GbMDOrdjWgwHifsnZn354T3SsMQKyIOQajX2mx8-SmfyjbKXOWUDbF-6WpkKq608iWDiIAeZHqtkIAfUvw-Kl2BWDNYdmTdVrKF5w7sgqHc" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://lh5.googleusercontent.com/DxLRp-g0L8meJkvI7WTLxvPtm2Q4GbMDOrdjWgwHifsnZn354T3SsMQKyIOQajX2mx8-SmfyjbKXOWUDbF-6WpkKq608iWDiIAeZHqtkIAfUvw-Kl2BWDNYdmTdVrKF5w7sgqHc" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The ignoranti</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> acts as if they do not notice the other Characters in the room. This entrance variant is useful for crowded or large locations. It is also realistic - just because the “chock-full” tavern has only two PCs in it, it doesn’t mean you would </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">actually </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">immediately notice them. vNPCs are everywhere. </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The ignoranti </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">must emote their ignorance explicitly, with something like "</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">S/he does not notice the others yet</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">". This entrance makes for a nice variation by allowing </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the ignoranti</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> and other PCs to "accidentally" bump into each other later in a very natural way. </span></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh3.googleusercontent.com/edaRIo1m0kQ7U3N1xoijVUI0Gkgi7_l6uyRPTozq0ITfN1Oiaq0AovWkubMwhLEdg5Qtx-hg41XXJCavvLhToZnLHuYGoc0L2Asn6HJf9W-jxmQ-vgKDrPJ477e3ezB9b6EA-IM" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh3.googleusercontent.com/edaRIo1m0kQ7U3N1xoijVUI0Gkgi7_l6uyRPTozq0ITfN1Oiaq0AovWkubMwhLEdg5Qtx-hg41XXJCavvLhToZnLHuYGoc0L2Asn6HJf9W-jxmQ-vgKDrPJ477e3ezB9b6EA-IM" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Walker</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The walker</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> is just "passing through" this area. This entrance is useful for outdoor areas or minor streets were many Character concepts probably have no real reason to be hanging about more than necessary. </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The walker</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> is really heading somewhere else and just happens to stop to chat with people in this room. It's an effective entrance that allows for quick, logical exits as well (they just have to 'be on their way'). This is far better than the more common approach of just congesting onto a street room and start greeting people as if all you do is stand in the street all day.</span></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Planned Visitor</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="https://lh6.googleusercontent.com/ZVc7Hd-nbgyqyW1UcvjLDi16RmPMbphOZzPecRHnUqSDxyQmdh0ACsGYy-XAv7xj12M_7bPauEPmgZykpIhVrjNy0xZTD9B5AgNSvFOpJ0NNm_xjjIdJj6wlgHdwZNpLia417qM" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://lh6.googleusercontent.com/ZVc7Hd-nbgyqyW1UcvjLDi16RmPMbphOZzPecRHnUqSDxyQmdh0ACsGYy-XAv7xj12M_7bPauEPmgZykpIhVrjNy0xZTD9B5AgNSvFOpJ0NNm_xjjIdJj6wlgHdwZNpLia417qM" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This is a variation on </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">busybody </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">and the opposite of </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The walker</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">planned visitor</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">needs</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> to come to this room, and that is </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">not</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> in order to chat with random PCs. The visitor will start to perform whatever they are here to do and interaction with others is mere a side effect. The classic take on this trope is to read message boards or to order food and drink. More imaginative ones could be to ask the NPC barkeep for a job, look for a vNPC (which turns out to not be here), repair something, do some sort of inspection or setup for an artistic performance. If done well, others will have plenty of opportunity to ask </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The Planned Visitor</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> what they are up to. It also makes for a thematic way to exit the scene once you declare your business there done. </span></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh4.googleusercontent.com/WWGpwuKchPjC6s9oh6B4c5c-VW9eoYRuXc_hPns6OQsatfv_Qtyj858Mj3y2IODS9kbMbWrim0FluhkkG65HEQULVFm1SPwVATWhkaRs4thScnmkpmruMKzfZ4T3ba7d9m1T_rc" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh4.googleusercontent.com/WWGpwuKchPjC6s9oh6B4c5c-VW9eoYRuXc_hPns6OQsatfv_Qtyj858Mj3y2IODS9kbMbWrim0FluhkkG65HEQULVFm1SPwVATWhkaRs4thScnmkpmruMKzfZ4T3ba7d9m1T_rc" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Wet Kitten</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">A classic that involves entering a scene drenched to the bone, shivering from cold, gasping from heat or otherwise be dramatically and visually affected by whatever weather or situation reigns outside. Common to taverns everywhere. For some reason this entrance rarely instills as much sympathy as one would think - but at least it opens up for other Characters to comment on the weather. Taken to the extreme, this becomes a variation on </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Damsel in Distress</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">.</span></div>
<br /><br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> The Third Wheel</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<a href="https://lh6.googleusercontent.com/v0kwyIVi0j5BqUnULNtUYT3hLtA_-FkqfckTA-NiLED56H2andf76UvXgioCHDExDdxbV4ALx7OqH6JKhSABQ2oOTaXJkRQntr7p7r0511_Wkm03rlEfMilqb318Iz1qWZelq8c" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://lh6.googleusercontent.com/v0kwyIVi0j5BqUnULNtUYT3hLtA_-FkqfckTA-NiLED56H2andf76UvXgioCHDExDdxbV4ALx7OqH6JKhSABQ2oOTaXJkRQntr7p7r0511_Wkm03rlEfMilqb318Iz1qWZelq8c" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This is an active, provocative entrance and a variant on </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the aggravator</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. It should directly interrupt and involve other PCs in the room entered. The trivial confrontational way to do this is for the intruder to muscle or elbow past other PCs in a rude way, maybe even (attempting to) give them a rough shove (remember to avoid god-modding). This is sure to start off a scene! The more common third-wheel approach is to walk up to another group of conversing PCs and simply jump into their conversation mid-sentence. How this is received depends on the situation and Characters involved. </span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">In both cases it's important to make it clear that your actions is a conscious RP choice - it’s your </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Character </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">which is inconsiderate, not the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Player </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">behind it. In other words, emote something like “</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">... He/She does not seem to notice or care that s/he is intruding...</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">”</span></div>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<br /></div>
<br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh5.googleusercontent.com/Aqil3Dbo2dsJAcOxOlk4w7vYNcyJi5FkbemipnPFpyl_VcvtKRlKsCOD7tKJ2NW57adNKA7D6Zqu5ocup-DwD8WGHq1Izq947cTx42fUs8mdC_E-ivCKRkHOoSW-4OF7-RaL9Ks" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh5.googleusercontent.com/Aqil3Dbo2dsJAcOxOlk4w7vYNcyJi5FkbemipnPFpyl_VcvtKRlKsCOD7tKJ2NW57adNKA7D6Zqu5ocup-DwD8WGHq1Izq947cTx42fUs8mdC_E-ivCKRkHOoSW-4OF7-RaL9Ks" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Theatrist</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This is an on-the-fly version of the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">Stage director</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> or </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">demagogue</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">. Only use if it's clear the currently ongoing scene allows it (so its often a good idea to follow a few emotes in the room before setting this one off). Just like </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">stage director</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, it starts some sort of background action in the room based on vNPCs. Maybe a brawl, an argument or some other event like a happy announcement. Maybe a vNPC starts hitting on a PC. Or, like the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">demagogue</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">, the </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">theatrist</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> gets involved in a discussion with an NPC/vNPC. Bartender NPCs are classically useful targets for this. Again, the theatrist must be considerate here, and perceptive so as to not take over an already running scene. Some PCs might forcibly choose to ignore the events going on in order to focus on their ongoing RP, so don't shove it down their throats (no god-modding!)</span></div>
<br /><br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh6.googleusercontent.com/qwzycM2BAkL1Ad5WaUmdmCQ4E_l7zdq8Z4BMTYNqISqEmihrF6rVnRNdtBdZQnt1uSUJ0jR0130agWDIsqhSOpekDqN2J1fhB1KNDx-D-9B2NAj-JZmeAnjcZN8pP22ypV7iRNM" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://lh6.googleusercontent.com/qwzycM2BAkL1Ad5WaUmdmCQ4E_l7zdq8Z4BMTYNqISqEmihrF6rVnRNdtBdZQnt1uSUJ0jR0130agWDIsqhSOpekDqN2J1fhB1KNDx-D-9B2NAj-JZmeAnjcZN8pP22ypV7iRNM" style="border: medium none; transform: rotate(0rad);" width="200" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;">The Non-sequitur</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">This, strangely rare, entrance involves running into a crowded room, shouting "Monkeeey!" and then run out again. This one will </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">at least</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> lead to roleplay for the confused people in the room you just visited. And no, don't do this unless you have a </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">very </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">specific and suitable character concept, kids.</span></div>
<br /><br /><br /><br /><h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<a href="https://lh3.googleusercontent.com/H1dasQzorKRf7wttBC4O-rgWrIpueB77Qj_9nDliP4SnImbI0Kc2FThSmT83TAYS2U37_8zv-gMb4v9EFa1KkMyLlKGLrv8FbbAiGmZ-5dCTyUUOPd8wvUZnvrGFhYHPjdAgDnA" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://lh3.googleusercontent.com/H1dasQzorKRf7wttBC4O-rgWrIpueB77Qj_9nDliP4SnImbI0Kc2FThSmT83TAYS2U37_8zv-gMb4v9EFa1KkMyLlKGLrv8FbbAiGmZ-5dCTyUUOPd8wvUZnvrGFhYHPjdAgDnA" style="border: medium none; transform: rotate(0rad);" width="320" /></a><span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> </span></h3>
<h3 dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 8pt;">
<span style="background-color: transparent; color: #666666; font-family: 'Trebuchet MS'; font-size: 12pt; font-style: normal; font-variant: normal; font-weight: 700; text-decoration: none; vertical-align: baseline;"> The Newbie</span></h3>
<div dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">The classic </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">newbie</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> entrance involves walking into a room and saying "Hello" to no one in particular. Bonus points if this is done while ignoring the fact that the room's on fire and the PCs within are all involved in mortal combat. Luckily this entrance trope screams </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">newbie </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">so clearly that players may be urged to pity and lenience. It may in fact be the trigger for getting a more experienced player to take </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: italic; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;">the newbie</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 11pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline;"> under their wing and explain a thing or two. </span></div>
Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com1tag:blogger.com,1999:blog-8338260444057832583.post-5542976113974295932017-10-01T22:05:00.001+02:002017-10-01T22:05:19.178+02:00Evennia in Hacktoberfest 2017<div class="separator" style="clear: both; text-align: center;">
<a href="https://assets.digitalocean.com/ghost/2017/09/Hacktoberfest17-Blog-01.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="425" data-original-width="800" height="170" src="https://assets.digitalocean.com/ghost/2017/09/Hacktoberfest17-Blog-01.png" width="320" /></a></div>
Evennia, the Python MUD/MUSH/MU* creation library participates in the <a href="https://hacktoberfest.digitalocean.com/" target="_blank">Hacktoberfest</a> 2017 (sign up on that page)! Hacktoberfest is open for all open-source projects like ours. After registering, if you make at least <b>four</b> Pull Requests to a public repo on Github during October (need not just be to Evennia), you win a limited-edition T-shirt! <br />
<br />
The help Evennia out and get your T-Shirt, look at our <a href="https://github.com/evennia/evennia/issues" target="_blank">Issue Tracker</a>. I have marked some issues with "Hacktoberfest" but you could take on any issue you want. Take a look in particular at the <a href="https://github.com/evennia/evennia/issues/1458" target="_blank">Unit test issue</a> if you are looking to get into contributing on a smaller scale while helping us tremendously.<br />
<br />
If you have any questions on contributing (or it's your first time making a Pull Request), don't be shy to drop into #evennia on irc.freenode.net or ask in our <a href="https://groups.google.com/forum/#%21forum/evennia" target="_blank">forum/mailing list</a>. Have fun!Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-85316269743967885432017-09-20T22:44:00.000+02:002017-09-23T11:12:13.627+02:00Evennia 0.7 released <div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhXOdWeFalqaYKWjOA8gbpFjrBKvd3ERUkzQExesOLZxT4-fjY7aXiJSCFH5lXA1x9BnJbcAlAkAOEED-Vv3yz-EEfgrDY2BO3ipFlIcZQNYj_y_U79AsYlML8Wo7t2mirRzxuYuERIzk/s1600/evennia_logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1455" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhXOdWeFalqaYKWjOA8gbpFjrBKvd3ERUkzQExesOLZxT4-fjY7aXiJSCFH5lXA1x9BnJbcAlAkAOEED-Vv3yz-EEfgrDY2BO3ipFlIcZQNYj_y_U79AsYlML8Wo7t2mirRzxuYuERIzk/s200/evennia_logo.png" width="181" /></a></div>
As of today <b>Evennia 0.7</b> is officially out! Evennia is a Python framework and -server for creating text-based multiplayer games (MU*).<br />
<br />
A big thank you to all collaborators that have helped with code and testing along the way!<br />
<br />
Here is the <a href="https://groups.google.com/forum/#!category-topic/evennia/evennia-news/0JYYNGY-NfE" target="_blank">hefty forum post</a> that details how you migrate to Evennia 0.7. <br />
<br />
Evennia 0.7 comes with a range of changes and updates (these are just the ones merged from the latest devel branch, a lot more has happened since 0.6 that were already in master): <br />
<br />
<ul>
<li>Evennia separates <code>Player</code> objects from <code>Character</code> objects in that the former is an OOC entity that can puppet one or more of the latter. The name <code>Player</code> was a source of some confusion since this is used differently in other code bases. <code>Player</code> has now been renamed to <code>Account</code> to make its function clearer.</li>
<li>Evennia's in-built website now uses our own theme and <code>bootstrap</code>
under the hood to make it easier to modify as well as rescale it better
on mobile devices (webclient is not updated at this point).</li>
<li>Shared logins between webclient and website, with the ability to log out of each independently of the other if so desired.</li>
<li>Prefix-ignoring - All default commands are now renamed without their
@-prefixes. Both @examine, +examine or examine will now all point to
the same command. You can customize which prefixes Evennia simply
ignores when searching for a command. The mechanic is clever though - if
you create a command with a specific key "+foo", then that will still
work and won't clash with another command named just "foo". </li>
<li>Easy pause mechanisms using <code>yield</code> statements directly in Command code (just do <code>yield 10</code> in your command code to have it pause ten seconds without blocking anyone else). You can also do <code>retval = yield "Do you want to accept?"</code> and have the command pause (non-blocking) for the player's input before continuing.</li>
</ul>
New contribs (optional plugins) (selection, new since 0.6 but many have been available on <code>master</code> branch for a while):<br />
<ul>
<li>The optional <a href="https://github.com/evennia/evennia/wiki/Tutorials#contrib" rel="nofollow"><em>In-Game-Python</em></a>
contrib by Vincent le Geoff allows for coding and scripting in-game using full-fledged Python to
make events and triggers. It's <em>not</em> a safe softcode-style
language (you have the full power of Python which is not good for
untrusted users) but is intended for trusted builders to make complex
scripting from the command line.</li>
<li>Wilderness/maps - Creation of dynamic or static maps based on
ascii-maps for dynamically creating rooms and to show when moving
around. (titeuf87, Cloud Keeper)</li>
<li>Full turn-based combat system, meant to expand for a desired system (battlejenkins)</li>
<li>Alternative Unix-style command base for Evennia, for those that
prefer to enter commands like you do on the unix command line (with <code>--flags</code> etc) (Vincent le Geoff)</li>
<li>Multidescer, which together with Evennia's nick replacement system can be heavily customized in-game (me).</li>
<li>Mail - a <code>@brandymail</code>-style in-game mail-system (grungies1138)</li>
<li>Clothing system, for layered outfits adding to the wearer's desc when worn (battlejenkins). </li>
</ul>
A more technical list from the main announcement post: <br />
<ul>
<li><a href="https://github.com/evennia/evennia/issues/1205">EvMenu formatting functions now part of class</a> - EvMenu no longer accepts formatting functions as inputs, these are now part of the EvMenu class. To override the formatting of EvMenu nodes you should now override EvMenu and replace the format method you want. This brings EvMenu more in line with other services in Evennia, all of which are built around overriding. </li>
<li><a href="https://github.com/evennia/evennia/issues/1179">Scripts are now valid message senders</a> - Also Scripts can now act as "sender" of a Msg, for example to a Channel or a player.</li>
<li>Due to the new prefix-ignoring above, <b>@desc</b> (builder-level description-setting) was renamed to <b>setdesc</b> to make it clearly separate from <b>desc</b> (used by a player setting their own description). This was actually the only clash we had to resolve this way in the default commands. </li>
<li><a href="https://github.com/evennia/evennia/issues/1175">Permission Hierarchy names change</a> - To make Evennia's permission hierarchy better reflect how Evennia actually works, the old <b>Players, Player Helpers, Builders, Wizards, Immortals</b> hierarchy has changed to <b>Player, Helper, Builder, Admin, Developer</b>. Singular/Plural form is now ignored so <b>Builder</b> and <b>Builders</b> will both work (this was a common source of simple errors) Old permissions will be renamed as part of the migration process. The distribution of responsibilities has not changed: Wizards (which in some other systems was the highest level, which confused some) always had the power to affect player accounts (like an admin) whereas Immortals had server-level access such as @py - that is, they were developers. The new names hopefully makes this distinction clearer. </li>
<li><a href="https://github.com/evennia/evennia/issues/1206">All manager methods now return querysets</a> - Some of these used to return lists which was a throwback to an older version of Typeclasses. With manager methods returning querysets one can chain queries onto their results like you can with any django query.</li>
<li>PrettyTable was removed from the codebase. You can still fetch it for your game if you prefer (it's on pypi). But <b>EvTable</b> has more functionality as well as color-support. </li>
<li><a href="https://github.com/evennia/evennia/issues/1276">Add **kwargs support to all object at_* hooks</a> - All object at_ hooks, such as <b>at_look</b>, <b>at_give</b> etc now has an additional **kwarg argument. This allows developers to send arbitrary data to those hooks so they can expand on them without changing the API. </li>
<li><a href="https://github.com/evennia/evennia/issues/1229">Remove {-color tags</a> - The use of {r, {n etc was deprecated for years and have now been completely removed from Evennia's core in favor of only one form, namely |r, |n etc. However, the color parser is now pluggable and the {-style as well as the %c style color tags etc can be re-added to your game since they are now in a contrib. </li>
<li><a href="https://github.com/evennia/evennia/issues/1288">Updated hooks for say/whisper commands</a> - There are now at_before/after_say sub-hooks to allow say to be more easily customized. There is still ongoing discussion on the best way to handle this (see e.g. <a href="https://github.com/evennia/evennia/pull/1419">this PR</a>). </li>
<li><a href="https://github.com/evennia/evennia/issues/1365">More compact distribution of ports</a> - Before, Evennia distributed its ports widely, such as using <b>4000, 4001, 8000, 8001, 5001, 8022</b>, some of which appeared close but actually was unrelated in functionality. They were also scattered throughout the settings file. The port definitions have now all moved more closer together, at the top of the settings file. Evennia will now use ports <b>4000-4006</b> by default (fewer depending on which protocols you want to start). This should make it easier to assign port ranges when wanting to run multiple Evennia instances on the same machine. </li>
<li><a href="https://github.com/evennia/evennia/issues/1063">Change how auto-login works</a> - It used to be that once you logged into the website, every time you went to the webclient you would auto-login, even if you manually quite the webclient before. Only way to really log out (to change account, say) would be to first log out of the website. Now this will work more intuitively - you will still auto-login but if you log out of the webclient you "decouple" from the login state of the website and need to re-login to the webclient next time, even if you are still logged into the website. </li>
<li><a href="https://github.com/evennia/evennia/issues/701">Better idle disconnects</a> - This is a long-running pet peeve for many. Idle timeouts will now honor a particular lock. Setting this lock allows selected entities (for example staff and bots) to avoid getting timed out like everyone else.</li>
<li>A slew of bug fixes and other tweaks. See <a href="https://github.com/evennia/evennia/projects/6">here</a> for the list.</li>
</ul>
<ul></ul>
Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com2tag:blogger.com,1999:blog-8338260444057832583.post-79864949558581236362017-08-25T23:22:00.000+02:002017-08-25T23:22:49.440+02:00Renaming Django's Auth User and App<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfYOSBYgL9Zmyvqcty61adTQrDPosIvOOgpfFrMLYU7QRwvOnQOhWZI30LhUuU-pfJpSbBNPBDzgLvtfvlfsxKvZST_y4tELGSkDJ449aZcbzfqJp6Uz95wUv37Dml5xfmk6KOWykwOI/s1600/birds-1976981_640.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="358" data-original-width="640" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDfYOSBYgL9Zmyvqcty61adTQrDPosIvOOgpfFrMLYU7QRwvOnQOhWZI30LhUuU-pfJpSbBNPBDzgLvtfvlfsxKvZST_y4tELGSkDJ449aZcbzfqJp6Uz95wUv37Dml5xfmk6KOWykwOI/s400/birds-1976981_640.jpg" width="400" /></a></div>
<span style="font-size: x-large;">N</span>ow that <a href="http://www.evennia.com/" target="_blank">Evennia's</a> devel branch (what will become Evennia 0.7) is slowly approaching completion, I thought I'd try to document an aspect of it that probably took me the longest to figure out. One change in Evennia 0.7 is that the Django model named "Player" changes name to "Account". Over time it has become clear that the old name didn't properly reflected the intention of the model. Sounds like a simple change, right? Well, it was not.<br />
<br />
<h3>
Briefly on migrations</h3>
<br />
First some background. A Django <i>migration</i> is a small Python file sitting in <span style="font-family: "courier new" , "courier" , monospace;">migrations/</span> sub folders throughout Evennia. A migration describes how our database schema changes over time, so as we change or update fields or add new features we add new migrations to describe how to go from the old to the new state. You apply them with the `evennia migrate` command we sometimes ask you to run. If we did not supply migrations, anyone with an existing Evennia database would have to either start from scratch or manually go in and tweak their database to match every upstream change we did.<br />
<br />
Each migration file has a sequential number, like <span style="font-family: "courier new" , "courier" , monospace;">migration_name.0002.py</span> etc. Migrations will run in order but each migration can also "depend" on another. This means for example that a migration in the <span style="font-family: "courier new" , "courier" , monospace;">player/</span> folder (application) knows that it need to wait for the changes done by a migration in the <span style="font-family: "courier new" , "courier" , monospace;">typeclasses/</span> folder/app before it can run. Finally, Django stores a table in the database to know which migrations were already run so to not apply them more than once.<br />
<br />
<i>For reference, Evennia is wrapping the django manage commands, so where I refer to <span style="font-family: "courier new" , "courier" , monospace;">evennia migrate</span> below you would use <span style="font-family: "courier new" , "courier" , monospace;">manage.py migrate</span> in most Django applications.</i><br />
<br />
<h3>
Our problem</h3>
<br />
So I wanted to migrate the database change "Rename the Player model to Account". We had to do this under a series of additional constraints however:<br />
<br />
<ol>
<li>The Player is the Django Auth user, storing the password. Such a user Django expects to exist from the beginning of the migration history.</li>
<li>The Player model sits in a application (folder) named "players". This folder should also be renamed to "accounts", meaning any in-migration references to this from other apps would become invalid.</li>
<li>Our migration must both work for old <i>and</i> new users. That is, we cannot expect people to all have existing databases to migrate. Some will need to create the database from scratch and must be able to do so without needing to do any changes to the migration structure.</li>
<li>We have a lot of references to "player" throughout the code, all of which must be renamed.</li>
<li>The migration, including renames, should be possible to do by new users with newbie-level Python and database skills.</li>
</ol>
<h3>
</h3>
<h3>
Some false starts</h3>
There is no lack of tutorials and help online for solving the problem of renaming a model. I think I tested most of them. But none I found actually ended up addressing these restraints. Especially point <b>2</b> in combination with point <b>3</b> above is a <i>killer</i>.<br />
<br />
<ul>
<li>One of my first tries wiped the migrations table completely, renamed the folder and just assumed Player never existed. This sounds good on paper and works perfectly for fresh databases. But existing databases will still contain the old Player-related models. With the old migrations gone, this is now all wrong and there is no information on how to migrate it.</li>
<li>I tried initiating fresh migrations with a player model state so you can move an existing database over to it. But then fresh databases doesn't work instead, since the player folder is gone. Also, you run into trouble with the auth system.</li>
<li>I next tried to keep the old migrations (those we know work both for old and new databases) but to migrate it in-place. I did many different attempts at this, but every time one of the restraints above would get in the way.</li>
<li>Eventually I wrote raw SQL code in the migrations to modify the database tables retroactively. That is, I basically manually removed all traces of Player in the database where it was, copying things table by table. This was very work-intensive but overall decently successful. With proper error-checking I could get most of the migration to work from old databases as well as for new databases. The trouble was the migrations themselves. No matter how I tried, I couldn't get the migration history to accept what I had done - the dependencies now longer made sense on the database level (since I had manually edited things) and adding new migrations in the future would have been tricky.</li>
</ul>
<br />
In the end I concluded that I had to abandon the notion that users be able to just do a single <span style="font-family: "courier new" , "courier" , monospace;">migrate</span> command. Some more work would be needed on the user's part.<br />
<br />
<h3>
The solution</h3>
<br />
In the end I needed to combine the power of migrations with the power of Git. Using Git resolved the Gordian knot about the player folder. Basically the process goes like this:<br />
<br />
<ul>
<li>First I copied of the `players` folder and renamed it and everything in it to <span style="font-family: "courier new" , "courier" , monospace;">accounts</span>. I added this to <span style="font-family: "courier new" , "courier" , monospace;">settings.INSTALLED_APPS</span>. I also copied the migrations from <span style="font-family: "courier new" , "courier" , monospace;">player</span> and renamed everything in them appropriately - those migrations thus look like <span style="font-family: "courier new" , "courier" , monospace;">Account</span> has always existed - so when you run the migration from scratch the database will be created normally. Note that this also means setting the Account as the auth user from the beginning of the migration history. This would be fine when migrating from scratch except for the fact that it would clash with the still existing <span style="font-family: "courier new" , "courier" , monospace;">Player</span> model saying the same thing. We dodge this problem by the way we run this migration (we'll get to this later).</li>
<li>Next I added one new migration in the Account app - this is the migration that copies the data from the player to the equivalent account-named copies in the database. Since Player will not exist if you run this from scratch you have to make sure that the Player model exists at that point in the migration chain. You can't just do this with a normal import and traceback, you need to use the migration infrastructure. This kind of check works:</li>
</ul>
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> # ...<br /><br /> def forwards(apps, schema_editor):<br /> try:<br /> PlayerDB = apps.get_model("players", "PlayerDB")<br /> except LookupError:<br /> return<br /><br /> # copy data from player-tables to database tables here<br /><br /> class Migrations(migrations.Migration):<br /> # ...<br /> operations = [<br /> migrations.RunPython(forwards, migrations.RunPython.noop)<br /> ]</span><br />
<br />
<ul>
<li>Now, a lot of my other apps/models has ForeignKey or Many2Many relations to the Player model. Aided by viewing the tables in the database I visited all of those and added a migration to each where I duplicated the player-relation with a duplicate account relation. So at this point I had set up a parallel, co-existing duplicate of the Player model, named Account.</li>
<li>I now made sure to commit my changes to git and tag this position in the version history with a clear git tag for later reference. This is an important step. We are saving the historical point in time where the player- and account-apps coexisted.5. The git position safely saved, I now went about purging player. I removed the <span style="font-family: "courier new" , "courier" , monospace;">player</span> app and its folder.</li>
<li>Since the player folder is not there, it's migrations are not there either. So in another app (any would work) I made a migration to remove the player tables from the database. Thing is, the missing player app means other migrations also cannot reference it. It is possible I could have waited to remove the <span style="font-family: "courier new" , "courier" , monospace;">player/</span> folder so as to be able to do this bit in pure Python. On the other hand, that might have caused issues since you would be trying to migrate with two Auth users - not sure. As it were, I ended up purging the now useless player-tables with raw SQL: </li>
</ul>
<br />
<span style="font-family: "courier new" , "courier" , monospace;"> from django.db import connection<br /><br /> # ...<br /><br /> def _table_exists(db_cursor, tablename):<br /> "Returns bool if table exists or not"<br /> sql_check_exists = "SELECT * from %s;" % tablename<br /> try:<br /> db_cursor.execute(sql_check_exists)<br /> return True<br /> except OperationalError:<br /> return False<br /><br /><br /> def _drop_table(db_cursor, table_name):<br /> if _table_exists(db_cursor, table_name):<br /> sql_drop = "DROP TABLE %s;" % table_name<br /> db_cursor.execute(sql_drop)<br /><br /><br /> def drop_tables(apps, schema_migrator):<br /> db_cursor = connection.cursor()<br /> _drop_table(db_cursor, "players_playerdb")<br /> _drop_table(db_cursor, "players_playerdb_db_attributes")<br /> # etc<br /><br /> class Migration(migrations.Migration):<br /><br /> # ...<br /><br /> operations = [<br /> migrations.RunPython(drop_tables)<br /> ]</span><br />
<ul>
<li>Next I continued creating migrations to remove all the "duplicate" foreignkeys I had creater earlier in all other apps that make up Evennia. I committed those.</li>
<li>Finally I wrote a little program to rename Python code uses of "player" in to "account" (retaining capitalization, supporting renaming "a player" to "an account" etc). I spent some time on this since I wanted our users to be able to convert their own codes with a decent interface. I include this tool in the Evennia repository.</li>
</ul>
<br />
And with this, the migration's design was complete. Below is how to actually <i>use</i> it ...<br />
<br />
<h3>
Running the final migration</h3>
<br />
In brief, what our users will do after pulling the latest code is as follows:<br />
<br />
<ol>
<li>If they are starting fresh, they just run <b><span style="font-family: "courier new" , "courier" , monospace;">evennia migrate</span></b> as usual. All migrations referencing <span style="font-family: "courier new" , "courier" , monospace;">player</span> will detect that there is no such app and just be skipped. They are finished, hooray!</li>
<li>If they have an existing database, they should make a copy of my renaming-program, then check out the tagged point in the git history I created above, a time when <span style="font-family: "courier new" , "courier" , monospace;">players</span> and <span style="font-family: "courier new" , "courier" , monospace;">accounts</span> coexisted in code. </li>
<li>Since an important aspect of Evennia is that users create their own game in a "game" folder, the user can now use my renaming program to interactively rename all occurrencies of `player` into `account` (the term 'player' is so ubiquitous that they may have used in in different places they don't want to rename).</li>
<li>Next they run migrations at that point of the git history. This duplicates <span style="font-family: "courier new" , "courier" , monospace;">player</span> data into its renamed counterparts.</li>
<li>Now they should check out the latest Evennia again, jumping back to a point where the <span style="font-family: "courier new" , "courier" , monospace;">players</span> application is gone and only <span style="font-family: "courier new" , "courier" , monospace;">accounts</span> exists.</li>
<li>Note that our migration history is wrong at this point. It will still contain references to migrations from the now nonexisting <span style="font-family: "courier new" , "courier" , monospace;">players</span> app. When trying to run from scratch, those will fail. We need to force Django to forget that. So the user must here go into their database of choice and run the single SQL statement <span style="font-family: "courier new" , "courier" , monospace;"><b>DELETE FROM django_migations;</b> </span>. This clears the migration history. This is a step I wanted to avoid (since it requires users to use SQL) but in the end I concluded it must be done (and is hopefully a simple enough instruction).</li>
<li>Next, we trick the database to again think that we have run all the migrations from the beginning (this time without any mention of players). This is done with the <b><span style="font-family: "courier new" , "courier" , monospace;">--fake</span></b> switch: <span style="font-family: "courier new" , "courier" , monospace;"><b>evennia migrate --fake</b> </span>. This fake-applies all migrations and stores in the database that they have run.</li>
<li>However, the last few migrations are the ones I added just above. Those actually remove the player-related tables from the database. We really <i>do</i> want to run those. So we fake-<i>fake</i> undo those with <b><span style="font-family: "courier new" , "courier" , monospace;">evennia migrate --fake typeclasses 0007</span></b>, which is the application and migration number I used to wipe players. This causes django to forget those migrations so we can run them again.</li>
<li>Finally we run <span style="font-family: "courier new" , "courier" , monospace;">evennia migrate</span>. This runs the previously "forgotten" migrations and purges the last vestigest of <span style="font-family: "courier new" , "courier" , monospace;">players</span> from the database. Done!</li>
</ol>
<h3>
</h3>
<h3>
Conclusions</h3>
<br />
And that's it. It's a bit more involved for the end user than I would have liked, and took me much longer than expected to figure out. But it's possible to reproduce and you only need to do it once - and only if you have a database to convert. Whereas this is necessarily specified for Evennia, I hope this might give a hint for other django users aiming to do something like this!Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-20985048322751054432017-04-23T22:46:00.000+02:002017-04-23T23:10:35.742+02:00The luxury of a creative community<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikZvuULoXZzpO9IWv85WjKsEEv33skzeAwjFL2gjXYLaDmyBJkkWCJxN02K8unVcNnSqD5Rnf12N-qU5Jgd3PgMhRCGLywDIxybSLot2oxT6risBMA4IOmep9x5s2W7FaveoId4sfnC4E/s1600/maxpixel.freegreatpicture.com-Silver-Treasure-Gold-Jewels-Costume-Jewelry-Pearls-395994.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikZvuULoXZzpO9IWv85WjKsEEv33skzeAwjFL2gjXYLaDmyBJkkWCJxN02K8unVcNnSqD5Rnf12N-qU5Jgd3PgMhRCGLywDIxybSLot2oxT6risBMA4IOmep9x5s2W7FaveoId4sfnC4E/s320/maxpixel.freegreatpicture.com-Silver-Treasure-Gold-Jewels-Costume-Jewelry-Pearls-395994.jpg" width="320" /></a></div>
For this blog post I want to focus on the series of very nice pull requests coming in from a growing cadre of contributors over the last few months.<br />
<br />
<span style="font-size: large;">Contributed goodness</span><br />
<br />
People have put in a lot of good work to boost Evennia, both by improving existing things and by adding new features. Thanks a lot everyone (below is just a small selection)!<br />
<ul>
<li> Contrib: Turn-based combat system - this is a full, if intentionally bare-bones implementation of a combat system, meant as a template to put in your particular game system into.</li>
<li>Contrib: Clothing sytem - a roleplaying mechanic where a character can 'wear' items and have this show in their descriptions. Worn items can also be layered to hide that underneath. Had plenty of opportunities for extensions to a given game.</li>
<li>Contrib: An 'event' system is in the works, for allowing privileged builders to add dynamic code to objects that fires when particular events happen. The PR is not yet merged but promises the oft pondered feature of in-game coding without using softcode (and notably also without the security of softcode!). </li>
</ul>
<ul>
<li>A lot of PRs, especially from one user, dealt with cleanup and adherence to PEP8 as well as fixing the 'alerts' given by <a href="https://lgtm.com/projects/g/evennia/evennia/" target="_blank">LGTM</a> on our code (LGTM is by the way a pretty nifty service, they parse the code from the github repo without actually running it and try to find problems. Abiding by their advice results is cleaner code and it also found some actual edge-case bugs here and there not covered by unit tests. The joint effort has brought us down from some 600+ alerts to somewhere around 90 - the remaining ones are alerts which I don't agree with or which are not important enough to spend effort on). </li>
<li>The help mechanics of Evennia were improved by splitting up the default help command into smaller parts, making it easier to inject some changes to your help system without completely replacing the default one. </li>
<li>Evennia's Xterm256 implementation was not correctly including the additional greyscale colors, those were added with new tags <b>|=a</b> ... <b>|=z</b>.</li>
<li>Evennia has the ability to relay data to external services through 'bots'. An example of this is the IRC bot, which is a sort of 'player' that sits in an in-game channel and connects that to a counterpart-bot sitting in a remote IRC channel. It allows for direct game-IRC communication, something enjoyed by people in the Evennia demo for many years now. The way the bot was defined used to be pretty hard-coded though. A crafty contributor changed that though, but incorporating the bot mechanism into Evennia's normal message flow. This allows for adding new types of bots or extending existing ones without having to modify Evennia's core. There is already an alternative IRC bot out there that represents everyone in the IRC room as a room full of people in the MUD. </li>
<li>Evennia's <b>Attributes</b> is a database table connected to other objects via a ForeignKey relation. This relation is cached on the object. A user however found that for certain implementations, such as using Attributes for large coordinate systems, <i>non-matches </i>(that is failed Attribute lookups on the object) can also be cached and leads to dramatic speed increases for those particular use cases. A PR followed. You live and learn.</li>
<li>Another contributor helped improve the EvEditor (Evennia's VIM-like in-game text editor) by giving it a code-mode for editing Python code in-game with auto-indents and code execution. Jump into the code mode with the command <b>@py/edit</b>.</li>
<li>Time scheduling is another feature that has been discussed now and then and has now been added through a PR. This means that rather than specifying '<i>Do this in 400 seconds</i>' you can say '<i>do this at 12AM, in-game time</i>'. The core system works with the real-world time units. If you want 10 hours to a day or two weeks to a month the same contributor also made an optional calendar contrib for that!</li>
<li>A new 'whisper' command was added to the Default cmdset. It's an in-game command for whispering to someone in the same room without other people hearing it. This is a nice thing to have considering Evennia is out-of-the-box pretty much offering the features of a 'talker' type of game.</li>
<li>Lots of bug fixes big and small! </li>
<li>Some <b>at_*</b> hooks were added, such as <b>at_give(giver, getter)</b>. This allows for finer control of the give process without handling all the logics at the command level. There are others hooks in the works but those will not be added until in Evennia 0.7. </li>
</ul>
<span style="font-size: large;">About that Evennia 0.7 ...</span><br />
<br />
So while PRs are popping up left and right in master I've been working in the <b>devel</b> branch towards what will be the Evennia 0.7 release. The branch is not ready for public consumption and testing yet But tentatively it's about halfway there as I am slowly <a href="https://github.com/evennia/evennia/projects/6" target="_blank">progressing through the tickets</a>. Most of the upcoming features were covered in the previous blog post so I'll leave it at that.<br />
<br />
I just want to end by saying that it's a very luxurious (and awesome) feeling for me to see master-branch Evennia expand with lots of new stuff "without me" so to speak. The power of Open Source indeed!<br />
<span style="font-size: xx-small;"> </span><br />
<br />
<span style="font-size: xx-small;">Image from http://maxpixel.freegreatpicture.com, released as public domain.</span>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-131407669077460972017-02-05T13:21:00.003+01:002017-02-05T13:21:46.688+01:00News items from the new year<div class="separator" style="clear: both; text-align: center;">
<a href="https://cloud.githubusercontent.com/assets/294267/22219746/511151f8-e1ac-11e6-8445-9cdfd4b9ab5d.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://cloud.githubusercontent.com/assets/294267/22219746/511151f8-e1ac-11e6-8445-9cdfd4b9ab5d.png" width="320" /></a></div>
The last few months have been mostly occupied with fixing bugs and straightening out usage quirks as more and more people take Evennia through its paces.<br />
<br />
<span style="font-size: large;">Webclient progress</span><br />
<br />
One of our
contributors, mewser/titeuf87 has put in work on implementing part of
our roadmap for the webclient. In the first merged batch, the client now
has an option window for adjusting and saving settings. This is an
important first step towards expanding the client's functionality.
Other features is showing help in an (optional) popup window and to
report window activity by popup and/or sound. <br />
<br />
The
goal for the future is to allow the user or developer to split the
client window into panes to which they can then direct various output
from the server as they please It's early days still but some of the
example designs being discussed can be found in the <a href="https://github.com/evennia/evennia/wiki/Webclient%20brainstorm" target="_blank">wiki webclient brainstorm</a> (see the title image of this blog for one of the mockups). <br />
<br />
<span style="font-size: large;">New server stuff</span><br />
<br />
Last year saw the death of our old demo server on horizondark.com, luckily the new one at <a href="http://silvren.com:4281/" target="_blank">silvren.com</a>
has worked out fine with no hickups. As part of setting that up, we also got together a more
proper list of recommended hosts for Evennia games. Evennia requires
more memory than your average C code base so this is important
information to have. It seems most of our users run Evennia on various
cloud hosting services rather than from a traditional remote server
login. <br />
<br />
<span style="font-size: large;">Arx going strong </span><br />
<br />
The currently largest Evennia game, the mush <a href="http://play.arxmush.org/" target="_blank">Arx - After the Reckoning</a> has helped a lot in stress testing. Their lead coder Tehom has also been active both in reporting issues and fixing them - kudos! There are however <a href="https://github.com/evennia/evennia/issues?utf8=%E2%9C%93&q=is%3Aopen%20is%3Aissue%20author%3ATehomCD%20label%3Abug" target="_blank">some lingering issues</a> which appears rarely enough that they have not been possible to reproduce yet; we're working on those. Overall though I must say that considering how active Arx is, I would have expected to have seen even more "childhood diseases" than we have. <br />
<br /><span style="font-size: large;">Launch scripts and discussions</span><br />
<br />
It is always interesting with feedback, and some time back another discussion thread erupted over on <a href="http://musoapbox.net/topic/1366/what-is-out-there-hard-and-soft-codebases-of-choice" target="_blank">musoapbox, here</a>. The musoapbox regulars have strong opinions about many things and this time some were critical of Evennia's install process. They felt it was too elaborate with too many steps, especially if you are approaching the system with no knowledge about Python. Apparently the average MUSH server has a much shorter path to go (even though that does require C compiling). Whereas I don't necessarily agree with all notions in that thread, it's valuable feedback - I've long acknowledged that it's hard to know just what is hard or not for a beginner.<br />
<br />
Whereas we are planning to eventually move Evennia to pypi (so you can do <span style="font-family: "Courier New",Courier,monospace;">pip install evennia</span>), the instructions around getting virtualenv setup is not likely to change. So there is now unix shell scripts supplied with the system for installing on debian-derived systems (Debian, Ubuntu, Mint etc). I also made scripts for automating the setup and launch of Evennia and to use it with linux' initd within the scope of a virtualenv.<br />
So far these scripts are not tested by enough people to warrant them being generally recommended, but if you are on a supported OS and is interested to try they are found from the top of the Evennia repo, in <span style="font-family: "Courier New",Courier,monospace;">bin/unix/</span>. More info can be found <a href="https://github.com/evennia/evennia/wiki/Start-Stop-Reload#optional-server-startup-script-linux-only" target="_blank">on their documentation page</a>.<br />
<br />
<span style="font-size: large;">Docker</span><br />
<br />
Speaking of installing,
Evennia now has an official Docker image, courtesy of the work of
contributor and Ainneve dev feend78. The image is automatically kept
up-to.date with the latest Evennia repo and allows Evennia to be easily
deployed in a production environment (most cloud services supports
this). See <a href="https://github.com/evennia/evennia/wiki/Running%20Evennia%20in%20Docker" target="_blank">Docker wiki page</a> for more info.<br />
<br />
<br />
<span style="font-size: large;">Lots of new PRs</span><br />
<br />
There was a whole slew of contributions waiting for me when returning from Chistmas break, and this has not slowed since. Github makes it easy to contribute and I think we are really starting to see this effect (Google Code back in the day was not as simple in this regard). The best thing with many of these PRs is that they address common things that people need to do but which could be made simpler or more flexible. It's hard to plan for all possibilities, so many people using the system is the best way to find such solutions.<br />
<br />
Apart from the map-creation contribs from last year we also have a new Wildnerness system by mewser/titeuf87. This implements wilderness according to an old idea I had on the mailing list - instead of making a room per location, players get a single room. The room tracks its coordinate in the wildnerness and updates its description and exits dynamically every time you move. This way you could in principle have an infinite wilderness without it taking any space. It's great to see the idea turned into a practical implementation and that it seems to work so well. Will be fun to see what people can do with it in the future! Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com0tag:blogger.com,1999:blog-8338260444057832583.post-72299564968487675822016-11-30T15:38:00.000+01:002016-11-30T15:38:02.504+01:00Birthday retrospective<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-pW3nsIxgroY/WDDFXo3z2dI/AAAAAAAAEs8/n9ehRTZrlggiEIOMGZupSVFxYa7DSGsZgCPcB/s1600/evennia_logo_festive_small.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="180" src="https://4.bp.blogspot.com/-pW3nsIxgroY/WDDFXo3z2dI/AAAAAAAAEs8/n9ehRTZrlggiEIOMGZupSVFxYa7DSGsZgCPcB/s200/evennia_logo_festive_small.png" width="200" /></a></div>
<span id="goog_1748990488"></span><span id="goog_1748990489"></span><b>S</b>o, recently Evennia celebrated its ten-year anniversary. That is, it was on Nov 20, 2006, Greg Taylor made the first repo commit to what would eventually become the Evennia of today. Greg has said that Evennia started out as a "weird experiment" of building a MUD/MUX using Django. The strange name he got from a cheesy NPC in the <a href="https://wiki.guildwars.com/wiki/Evennia" target="_blank">Guild Wars</a> MMORPG and Greg's <a href="https://groups.google.com/forum/#!category-topic/evennia/evennia-news/5hQTspfWd_Q" target="_blank">first post</a> to the mailing list also echoes the experimental intention of the codebase. The merger with Twisted came <a href="https://groups.google.com/forum/#!category-topic/evennia/evennia-news/CJ52R4Ws0OM" target="_blank">pretty early too</a>, replacing the early asyncore hack he used and immediately seeing a massive speedup. Evennia got attention from the MUD community - clearly a Python-based MUD system sounded attractive.<br /><br />
When I first joined the project I had been looking at doing something MUD-like in Python for a good while. I had looked over the various existing Python code bases at the time and found them all to be either abandoned or very limited. I had a few week's stunt working with <a href="https://sourceforge.net/projects/pymoo/" target="_blank">pymoo</a> before asking myself why I was going through the trouble of parsing a custom script language<i> ... in Python</i> ... Why not use Python throughout? This is when I came upon Evennia. I started <a href="https://groups.google.com/forum/#!category-topic/evennia/evennia-news/yfR0GLKGhJA" target="_blank">making contributions</a> and around 2010 I <a href="https://groups.google.com/forum/#!category-topic/evennia/evennia-news/zXsA2PaWUoU" target="_blank">took over the development</a> as real life commitments forced Greg to step down.<br />
<br />
Over the years we have gone through a series of changes. We have gone from using SVN to Mercurial and then to using GIT. We have transited from GoogleCode to GitHub - the main problem of which was converting the wiki documentation (Evennia has <a href="https://github.com/evennia/evennia/wiki" target="_blank">extensive documentation</a>). <br />
<br />
For a long time we used Python's reload() function to add code to the running game. It worked ... sometimes, depending on what you changed. Eventually it turned out to be so unpredictable that we now use two processes, one to connect clients to and the other running the game, meaning we can completely restart one process without disconnecting anyone. <br />
<br />
Back in the day you were also expected to create your own game in a folder <span style="font-family: "Courier New",Courier,monospace;">game/</span> inside the Evennia repo itself. It made it really hard for us to update that folder without creating merge conflicts all over. Now Evennia is a proper library and the code you write is properly separated from ours.<br />
<br />
So in summary, many things have happened over the years, much of it documented in this blog. With 3500 commits, 28 000 lines of code (+46% comments) and some 25 people contributing in the last year, <a href="https://www.openhub.net/p/evennia" target="_blank">Openhub</a> lists us as <br />
<br />
<blockquote class="tr_bq">
"<i>A mature, well-established codebase with a stable commit history, a large development team and very well documented source code</i>". </blockquote>
<br />
It's just words compiled by an algorithm, but they still feel kinda good!<br />
<br />
<br />
While Evennia was always meant to be used for any type of multiplayer text game, this general use have been expanded and cleaned up a lot over the years.<br />
<br />
This has been reflected in the width of people wanting to use it for different genres: Over time the MUSH people influenced us into adding the option to play the same character from many different clients at the same time (apparently, playing on the bus and then continuing on another device later is common for such games). Others have wanted to use Evennia for interactive fiction, for hack&slash, deep roleplay, strategy, education or just for learning Python.<br />
<br />
Since Evennia is a framework/library and tries to not impose any particular game systems, it means there is much work to do when building a game using Evennia. The result is that there are dozens of games "in production" using Evennia (and more we probably don't know about), but few public releases yet.<br />
<br />
The first active "game" may have been an Evennia game/chat supporting the Russian version of 4chan... <span id="goog_1748990486"></span><span id="goog_1748990486">The community driven Evennia demo-game <a href="http://ainneve.evennia.com/" target="_blank">Ainneve</a></span><span id="goog_1748990486"> is also progressing, recently adding combat for testing. This is aimed at offering an example of more game-specific code people can build from (the way Diku does). There are similar projects meant for helping people create RPI (RolePlay Intensive) and MUSH-style games. </span><span id="goog_1748990487"></span>That said, the Evennia-game <a href="http://games.evennia.com/game/arx" target="_blank">Arx, After the Reckoning</a><span id="goog_1748990486"> is progressing through beta at a good clip and is showing all signs of becoming the first full-fledged released Evennia game.</span><span id="goog_1748990486"> </span><br />
<br />
<br />
<span id="goog_1748990486">So cheers, Evennia for turning 10. That's enough of the introspection and history. I'll get back to more technical aspects in the next post. </span>Griatchhttp://www.blogger.com/profile/01430093554910807910noreply@blogger.com1