mirror of
https://github.com/evennia/evennia.git
synced 2026-04-05 15:37:17 +02:00
New dev blog 2023-06-10
This commit is contained in:
parent
4ebe332687
commit
60207cd347
21 changed files with 6359 additions and 2761 deletions
|
|
@ -12,8 +12,100 @@
|
|||
<script src="../javascripts/scale.fix.js">
|
||||
</script>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="
|
||||
Latest Evennia dev blog: Evennia 1.0 released!: <br>
|
||||
<!--meta name="description" content="
|
||||
Latest Evennia dev blog: Evennia 2.0.0 released today: <p><img src="https://upload.wikimedia.org/wikipedia/commons/c/c4/Field_Hamois_Belgium_Luc_Viatour.jpg" alt="screenshot" />
|
||||
<br></p>
|
||||
<p>As part of our new use of <a href="https://semver.org/">semantic versioning</a>, Evennia
|
||||
2.0.0 was released today. Evennia is a Python <code>MU*</code> creation framework and
|
||||
server. As the change of the major version indicates, this is a backwards
|
||||
incompatible change ... well, <em>maybe</em>. It depends on your use-case. Read on.</p>
|
||||
<p>In this post I'll go over some of the new things since the release of Evennia
|
||||
1.0 some six months ago.</p>
|
||||
<h2>New version of the ExtendedRoom</h2>
|
||||
<p>The main thing that <em>may</em> be backwards income is the <code>ExtendedRoom</code> contrib.
|
||||
This contrib extends the standard room with the ability to look at 'details' and
|
||||
to have descriptions that change by season and by time-of-day in the game. I
|
||||
originally wrote the <code>ExtendedRoom</code> contrib more than a decade ago and it was
|
||||
in dire need to be recactored and cleaned up to use the modern tools available
|
||||
in Evennia. Not to mention make use of my additional years of experience since
|
||||
first creating it.</p>
|
||||
<p>Here are the <a href="https://github.com/evennia/evennia/discussions/3200">new features</a>:</p>
|
||||
<ul>
|
||||
<li>All rooms can now have any number of "room states", like "burning", "flooded",
|
||||
"dark", "crowded" or what have you. The <code>season</code> and <code>time_of_day</code> are now just
|
||||
treated as any other room-states except that they auto-change with in-game time.</li>
|
||||
<li>Rooms can have any number of swappable room-descriptions, just by adding an
|
||||
Attribute <code>desc_<roomstate></code> to the room. This will be used when a given
|
||||
room-state is set on the room. If no room state matches, the traditional
|
||||
<code>desc</code> Attribute is used.</li>
|
||||
<li>In the old contrib, you could add special tags, like <code><morning>...</morning></code>
|
||||
in your descriptions and have those parts of the texts only appear when it's
|
||||
morning in-game. This still works, but only ever supported time-of-day states.
|
||||
The new way is to make use Evennia's FuncParser to embed functions in the text
|
||||
directly. The <code>ExtendedRoom</code> understands the new <code>state</code> inline function. This
|
||||
can be used with <em>any</em> room state (including seasons and time-of-day). For
|
||||
example: <code>$state(morning, The morning sun is shining in.)</code> or
|
||||
<code>$state(burning, This place is on fire!)</code>.</li>
|
||||
<li>The room still supports <code>details</code> - the ability to look at things in the room
|
||||
without needing to create a new database object first. This hasn't changed.</li>
|
||||
<li>The <code>ExtendedRoom</code> now also has simple support for echoing random messages now
|
||||
and then to the room.</li>
|
||||
</ul>
|
||||
<p>Overall, the code was completely re-written and cleaned up, making use of the
|
||||
latest Evennia tooling. It also has much better unit-test coverage. All the unit
|
||||
tests of the old implementation passes for the new one, but the changes are
|
||||
so big that it's nevertheless possible people making heavy use of
|
||||
this contrib may see side effects from upgrading.</p>
|
||||
<p>Now, a contrib is not part of the core, so it (potentially) being
|
||||
backwards-incompatible should normally not warrant a major version bump. But I
|
||||
feel the <code>ExtendedRoom</code> contrib is used by so many in the Evennia community that
|
||||
it's prudent to up the major version to let people know that they should
|
||||
keep an eye out when upgrading.</p>
|
||||
<h2>More on the Beginner Tutorial</h2>
|
||||
<p>Most of my time has been spent continuing to work on the new <a href="https://www.evennia.com/docs/latest/Howtos/Beginner-Tutorial/Beginner-Tutorial-Overview.html">Beginner Tutorial</a>. Notably on <a href="https://www.evennia.com/docs/latest/Howtos/Beginner-Tutorial/Part3/Beginner-Tutorial-Part3-Overview.html">part three</a>, where
|
||||
we are making a whole little Evennia MUD game from scratch. While still not
|
||||
done, I have now added detailed lessons on</p>
|
||||
<ul>
|
||||
<li>Creating RPG dice rollers and rule systems (in our example we are using the
|
||||
<em>Knave</em> TTRPG ruleset).</li>
|
||||
<li>Organizing Player Character data, and character generation.</li>
|
||||
<li>In-game objects and items.</li>
|
||||
<li>Handling equipment and weapons.</li>
|
||||
<li>In-game rooms.</li>
|
||||
<li>Non-player characters.</li>
|
||||
<li>Two types of Combat systems (Twitch-based and Turn based).</li>
|
||||
</ul>
|
||||
<p>TODOs are Monster/NPC AI, Dynamical generation of rooms, Questin, Shops and some
|
||||
more bits and bobs. And of course a separate session on building the game world
|
||||
and tying all these systems together into a little example game.</p>
|
||||
<h2>A truckload of new features!</h2>
|
||||
<p>As usual, the Evennia community ame through with a bunch of new useful stuff since
|
||||
the release of Evennia 1.0.</p>
|
||||
<ul>
|
||||
<li><code>Containers</code> - A new contrib with a typeclass and commands to make and manage
|
||||
all sorts of containers, from chests to crates and jars, along with commands
|
||||
to put things in them and take things out of them. A great place to start
|
||||
tweaking for your own game implementation (InspectorCaracal).</li>
|
||||
<li>The ANSI color fallbacks (for use when your client does not support XTerm256)
|
||||
were improved to make more sense (InspectorCaracal).</li>
|
||||
<li>New <code>logger.delete_log</code> method for deleting log files from inside the server (aMiss-aWry).</li>
|
||||
<li>For those intending to override the <code>SessionHandler</code>, it was cleaned up and
|
||||
refactored to make it less prone to cause circular import issues (Volund).</li>
|
||||
<li>New <code>create_channel(attr=...)</code> keyword, for setting channel Attributes
|
||||
directly on creation, especially from channels defined in <code>settings.DEFAULT_CHANNELS</code> (me)</li>
|
||||
<li>Attributes will now properly save Python <code>deques</code> with <code>maxlen=...</code> set (me).</li>
|
||||
<li><a href="https://www.evennia.com/docs/latest/Components/Tags.html#tagcategoryproperty"><code>TagCategoryProperty</code></a> - A new way to define tags with a particular category on a class at creation-time, without having to do so in the <code>at_object_creation</code> method (me).</li>
|
||||
<li>A lot of bug fixes; <a href="https://www.evennia.com/docs/latest/Coding/Changelog.html">see the CHANGELOG</a> for all the details!</li>
|
||||
</ul>
|
||||
<h2>Continuing</h2>
|
||||
<p>Over summer, my development usually slows down a bit, but I plan to keep pushing
|
||||
on getting that Beginner tutorial done. We are also seeing more people joing
|
||||
the <a href="https://discord.gg/AJJpcRUhtF">evennia discord</a>, which means more eyes on
|
||||
the code and more bugs and edge cases being detected (and ironed out). So a lot
|
||||
of maintenance work to be done in the short term.</p>
|
||||
<p>In the longer term, there are a lot of exciting plans for Evennia in the pipe,
|
||||
but we'll get there when we get there. :)</p>
|
||||
<p>Have a nice summer!</p>
|
||||
...
|
||||
---
|
||||
Evennia is a modern Python library and server for creating text-based
|
||||
|
|
@ -49,6 +141,22 @@
|
|||
<div class="devblog-calendar">
|
||||
<ul>
|
||||
|
||||
<li>
|
||||
<a href="2023.html"> 2023 (1)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<span class="devblog-calendar-tooltip-text"> Evennia 2.0.0 released today</span>
|
||||
<a href="2023.html#2023-06-10-evennia-2.0.0-released-today"> Evennia 2.0.0 rel...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="2022.html"> 2022 (4)
|
||||
|
||||
|
|
@ -56,26 +164,26 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2022.html#2022-12-03-evennia-1.0-released!">Dec 3
|
||||
<span class="devblog-calendar-tooltip-text"> Evennia 1.0 released!</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Evennia 1.0 released!</span>
|
||||
<a href="2022.html#2022-12-03-evennia-1.0-released!"> Evennia 1.0 relea...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2022.html#2022-09-17-project-plans-and-splitting-a-setting-in-two">Sep 17
|
||||
<span class="devblog-calendar-tooltip-text"> Project plans and Splitting a Setting in two</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Project plans and Splitting a Setting in two</span>
|
||||
<a href="2022.html#2022-09-17-project-plans-and-splitting-a-setting-in-two"> Project plans and...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2022.html#2022-07-05-tutorial-writing-and-attributes-galore">Jul 5
|
||||
<span class="devblog-calendar-tooltip-text"> Tutorial-writing and Attributes galore</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Tutorial-writing and Attributes galore</span>
|
||||
<a href="2022.html#2022-07-05-tutorial-writing-and-attributes-galore"> Tutorial-writing ...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2022.html#2022-01-06-into-2022-with-thanks-and-plans">Jan 6
|
||||
<span class="devblog-calendar-tooltip-text"> Into 2022 with thanks and plans</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Into 2022 with thanks and plans</span>
|
||||
<a href="2022.html#2022-01-06-into-2022-with-thanks-and-plans"> Into 2022 with th...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -90,20 +198,20 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2021.html#2021-11-18-the-blog-moved!">Nov 18
|
||||
<span class="devblog-calendar-tooltip-text"> The blog moved!</span>
|
||||
<span class="devblog-calendar-tooltip-text"> The blog moved!</span>
|
||||
<a href="2021.html#2021-11-18-the-blog-moved!"> The blog moved!
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2021.html#2021-03-21-where-do-i-begin?">Mar 21
|
||||
<span class="devblog-calendar-tooltip-text"> Where do I begin?</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Where do I begin?</span>
|
||||
<a href="2021.html#2021-03-21-where-do-i-begin?"> Where do I begin?
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2021.html#2021-01-01-happy-new-years-2021!">Jan 1
|
||||
<span class="devblog-calendar-tooltip-text"> Happy New Years 2021!</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Happy New Years 2021!</span>
|
||||
<a href="2021.html#2021-01-01-happy-new-years-2021!"> Happy New Years 2...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -118,20 +226,20 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2020.html#2020-11-14-evennia-0.9.5-released">Nov 14
|
||||
<span class="devblog-calendar-tooltip-text">Evennia 0.9.5 released</span>
|
||||
<span class="devblog-calendar-tooltip-text">Evennia 0.9.5 released</span>
|
||||
<a href="2020.html#2020-11-14-evennia-0.9.5-released">Evennia 0.9.5 rele...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2020.html#2020-10-20-on-using-markdown-with-sphinx">Oct 20
|
||||
<span class="devblog-calendar-tooltip-text">On using Markdown with Sphinx</span>
|
||||
<span class="devblog-calendar-tooltip-text">On using Markdown with Sphinx</span>
|
||||
<a href="2020.html#2020-10-20-on-using-markdown-with-sphinx">On using Markdown ...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2020.html#2020-04-14-spring-updates-while-trying-to-stay-healthy">Apr 14
|
||||
<span class="devblog-calendar-tooltip-text">Spring updates while trying to stay healthy</span>
|
||||
<span class="devblog-calendar-tooltip-text">Spring updates while trying to stay healthy</span>
|
||||
<a href="2020.html#2020-04-14-spring-updates-while-trying-to-stay-healthy">Spring updates whi...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -146,44 +254,44 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2019.html#2019-09-30-blackifying-and-fixing-bugs">Sep 30
|
||||
<span class="devblog-calendar-tooltip-text">Blackifying and fixing bugs</span>
|
||||
<span class="devblog-calendar-tooltip-text">Blackifying and fixing bugs</span>
|
||||
<a href="2019.html#2019-09-30-blackifying-and-fixing-bugs">Blackifying and fi...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2019.html#2019-07-04-evennia-0.9-released">Jul 4
|
||||
<span class="devblog-calendar-tooltip-text">Evennia 0.9 released</span>
|
||||
<span class="devblog-calendar-tooltip-text">Evennia 0.9 released</span>
|
||||
<a href="2019.html#2019-07-04-evennia-0.9-released">Evennia 0.9 released
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2019.html#2019-05-26-creating-evscaperoom-part-2">May 26
|
||||
<span class="devblog-calendar-tooltip-text">Creating Evscaperoom Part 2</span>
|
||||
<span class="devblog-calendar-tooltip-text">Creating Evscaperoom Part 2</span>
|
||||
<a href="2019.html#2019-05-26-creating-evscaperoom-part-2">Creating Evscapero...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2019.html#2019-05-18-creating-evscaperoom-part-1">May 18
|
||||
<span class="devblog-calendar-tooltip-text">Creating Evscaperoom Part 1</span>
|
||||
<span class="devblog-calendar-tooltip-text">Creating Evscaperoom Part 1</span>
|
||||
<a href="2019.html#2019-05-18-creating-evscaperoom-part-1">Creating Evscapero...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2019.html#2019-05-09-podcast-about-evennia">May 9
|
||||
<span class="devblog-calendar-tooltip-text">Podcast about Evennia</span>
|
||||
<span class="devblog-calendar-tooltip-text">Podcast about Evennia</span>
|
||||
<a href="2019.html#2019-05-09-podcast-about-evennia">Podcast about Even...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2019.html#2019-04-25-steaming-on-eating-jam">Apr 25
|
||||
<span class="devblog-calendar-tooltip-text">Steaming on Eating Jam</span>
|
||||
<span class="devblog-calendar-tooltip-text">Steaming on Eating Jam</span>
|
||||
<a href="2019.html#2019-04-25-steaming-on-eating-jam">Steaming on Eating...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2019.html#2019-01-02-into-2019">Jan 2
|
||||
<span class="devblog-calendar-tooltip-text">Into 2019</span>
|
||||
<span class="devblog-calendar-tooltip-text">Into 2019</span>
|
||||
<a href="2019.html#2019-01-02-into-2019">Into 2019
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -198,26 +306,26 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2018.html#2018-09-30-evennia-0.8-released">Sep 30
|
||||
<span class="devblog-calendar-tooltip-text">Evennia 0.8 released</span>
|
||||
<span class="devblog-calendar-tooltip-text">Evennia 0.8 released</span>
|
||||
<a href="2018.html#2018-09-30-evennia-0.8-released">Evennia 0.8 released
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2018.html#2018-08-18-inline-building-in-upcoming-evennia-0.8">Aug 18
|
||||
<span class="devblog-calendar-tooltip-text">Inline building in upcoming Evennia 0.8</span>
|
||||
<span class="devblog-calendar-tooltip-text">Inline building in upcoming Evennia 0.8</span>
|
||||
<a href="2018.html#2018-08-18-inline-building-in-upcoming-evennia-0.8">Inline building in...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2018.html#2018-01-27-kicking-into-gear-from-a-distance">Jan 27
|
||||
<span class="devblog-calendar-tooltip-text">Kicking into gear from a distance</span>
|
||||
<span class="devblog-calendar-tooltip-text">Kicking into gear from a distance</span>
|
||||
<a href="2018.html#2018-01-27-kicking-into-gear-from-a-distance">Kicking into gear ...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2018.html#2018-01-05-new-year,-new-stuff">Jan 5
|
||||
<span class="devblog-calendar-tooltip-text"> New year, new stuff</span>
|
||||
<span class="devblog-calendar-tooltip-text"> New year, new stuff</span>
|
||||
<a href="2018.html#2018-01-05-new-year,-new-stuff"> New year, new stuff
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -232,38 +340,38 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2017.html#2017-10-29-getting-a-mud-rp-scene-going">Oct 29
|
||||
<span class="devblog-calendar-tooltip-text">Getting a MUD RP scene going</span>
|
||||
<span class="devblog-calendar-tooltip-text">Getting a MUD RP scene going</span>
|
||||
<a href="2017.html#2017-10-29-getting-a-mud-rp-scene-going">Getting a MUD RP s...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2017.html#2017-10-01-evennia-in-hacktobergest-2017">Oct 1
|
||||
<span class="devblog-calendar-tooltip-text">Evennia in Hacktobergest 2017</span>
|
||||
<span class="devblog-calendar-tooltip-text">Evennia in Hacktobergest 2017</span>
|
||||
<a href="2017.html#2017-10-01-evennia-in-hacktobergest-2017">Evennia in Hacktob...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2017.html#2017-09-20-evennia-0.7-released">Sep 20
|
||||
<span class="devblog-calendar-tooltip-text">Evennia 0.7 released</span>
|
||||
<span class="devblog-calendar-tooltip-text">Evennia 0.7 released</span>
|
||||
<a href="2017.html#2017-09-20-evennia-0.7-released">Evennia 0.7 released
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2017.html#2017-08-25-renaming-django's-auth-user-and-app">Aug 25
|
||||
<span class="devblog-calendar-tooltip-text"> Renaming Django's Auth User and App</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Renaming Django's Auth User and App</span>
|
||||
<a href="2017.html#2017-08-25-renaming-django's-auth-user-and-app"> Renaming Django's...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2017.html#2017-04-23-the-luxury-of-a-creative-community">Apr 23
|
||||
<span class="devblog-calendar-tooltip-text">The luxury of a creative community</span>
|
||||
<span class="devblog-calendar-tooltip-text">The luxury of a creative community</span>
|
||||
<a href="2017.html#2017-04-23-the-luxury-of-a-creative-community">The luxury of a cr...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2017.html#2017-02-05-news-items-from-the-new-year">Feb 5
|
||||
<span class="devblog-calendar-tooltip-text">News items from the new year</span>
|
||||
<span class="devblog-calendar-tooltip-text">News items from the new year</span>
|
||||
<a href="2017.html#2017-02-05-news-items-from-the-new-year">News items from th...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -278,44 +386,44 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2016.html#2016-11-30-birthday-retrospective">Nov 30
|
||||
<span class="devblog-calendar-tooltip-text">Birthday retrospective</span>
|
||||
<span class="devblog-calendar-tooltip-text">Birthday retrospective</span>
|
||||
<a href="2016.html#2016-11-30-birthday-retrospective">Birthday retrospec...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2016.html#2016-10-13-season-of-fixes">Oct 13
|
||||
<span class="devblog-calendar-tooltip-text">Season of fixes</span>
|
||||
<span class="devblog-calendar-tooltip-text">Season of fixes</span>
|
||||
<a href="2016.html#2016-10-13-season-of-fixes">Season of fixes
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2016.html#2016-07-01-the-art-of-sharing-nicks-and-descriptions">Jul 1
|
||||
<span class="devblog-calendar-tooltip-text">The art of sharing nicks and descriptions</span>
|
||||
<span class="devblog-calendar-tooltip-text">The art of sharing nicks and descriptions</span>
|
||||
<a href="2016.html#2016-07-01-the-art-of-sharing-nicks-and-descriptions">The art of sharing...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2016.html#2016-05-31-evennia-in-pictures">May 31
|
||||
<span class="devblog-calendar-tooltip-text">Evennia in Pictures</span>
|
||||
<span class="devblog-calendar-tooltip-text">Evennia in Pictures</span>
|
||||
<a href="2016.html#2016-05-31-evennia-in-pictures">Evennia in Pictures
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2016.html#2016-05-22-evennia-0.6!">May 22
|
||||
<span class="devblog-calendar-tooltip-text"> Evennia 0.6!</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Evennia 0.6!</span>
|
||||
<a href="2016.html#2016-05-22-evennia-0.6!"> Evennia 0.6!
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2016.html#2016-03-24-technical-stuff-happening">Mar 24
|
||||
<span class="devblog-calendar-tooltip-text">Technical stuff happening</span>
|
||||
<span class="devblog-calendar-tooltip-text">Technical stuff happening</span>
|
||||
<a href="2016.html#2016-03-24-technical-stuff-happening">Technical stuff ha...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2016.html#2016-02-14-climbing-up-branches">Feb 14
|
||||
<span class="devblog-calendar-tooltip-text">Climbing up Branches</span>
|
||||
<span class="devblog-calendar-tooltip-text">Climbing up Branches</span>
|
||||
<a href="2016.html#2016-02-14-climbing-up-branches">Climbing up Branches
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -330,80 +438,80 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-12-17-a-summary-of-a-year">Dec 17
|
||||
<span class="devblog-calendar-tooltip-text">A summary of a year</span>
|
||||
<span class="devblog-calendar-tooltip-text">A summary of a year</span>
|
||||
<a href="2015.html#2015-12-17-a-summary-of-a-year">A summary of a year
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-11-12-mit-uses-evennia!">Nov 12
|
||||
<span class="devblog-calendar-tooltip-text"> MIT uses Evennia!</span>
|
||||
<span class="devblog-calendar-tooltip-text"> MIT uses Evennia!</span>
|
||||
<a href="2015.html#2015-11-12-mit-uses-evennia!"> MIT uses Evennia!
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-10-11-illustrations-and-soaps">Oct 11
|
||||
<span class="devblog-calendar-tooltip-text">Illustrations and soaps</span>
|
||||
<span class="devblog-calendar-tooltip-text">Illustrations and soaps</span>
|
||||
<a href="2015.html#2015-10-11-illustrations-and-soaps">Illustrations and ...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-10-02-emoting-system">Oct 2
|
||||
<span class="devblog-calendar-tooltip-text">Emoting System</span>
|
||||
<span class="devblog-calendar-tooltip-text">Emoting System</span>
|
||||
<a href="2015.html#2015-10-02-emoting-system">Emoting System
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-09-29-evennia-on-`podcast.__init__`">Sep 29
|
||||
<span class="devblog-calendar-tooltip-text"> Evennia on `podcast.__init__`</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Evennia on `podcast.__init__`</span>
|
||||
<a href="2015.html#2015-09-29-evennia-on-`podcast.__init__`"> Evennia on `podca...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-09-24-pushing-through-a-straw">Sep 24
|
||||
<span class="devblog-calendar-tooltip-text">Pushing through a straw</span>
|
||||
<span class="devblog-calendar-tooltip-text">Pushing through a straw</span>
|
||||
<a href="2015.html#2015-09-24-pushing-through-a-straw">Pushing through a ...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-08-27-a-wagon-load-of-post-summer-updates">Aug 27
|
||||
<span class="devblog-calendar-tooltip-text">A wagon load of post summer updates</span>
|
||||
<span class="devblog-calendar-tooltip-text">A wagon load of post summer updates</span>
|
||||
<a href="2015.html#2015-08-27-a-wagon-load-of-post-summer-updates">A wagon load of po...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-06-22-announcing-the-evennia-example-game-project-"ainneve"">Jun 22
|
||||
<span class="devblog-calendar-tooltip-text"> Announcing the Evennia example-game project "Ainneve"</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Announcing the Evennia example-game project "Ainneve"</span>
|
||||
<a href="2015.html#2015-06-22-announcing-the-evennia-example-game-project-"ainneve""> Announcing the Ev...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-06-15-need-your-help!">Jun 15
|
||||
<span class="devblog-calendar-tooltip-text"> Need your help!</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Need your help!</span>
|
||||
<a href="2015.html#2015-06-15-need-your-help!"> Need your help!
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-05-30-dreaming-big?">May 30
|
||||
<span class="devblog-calendar-tooltip-text"> Dreaming big?</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Dreaming big?</span>
|
||||
<a href="2015.html#2015-05-30-dreaming-big?"> Dreaming big?
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-05-11-things-goin-on">May 11
|
||||
<span class="devblog-calendar-tooltip-text">Things goin on</span>
|
||||
<span class="devblog-calendar-tooltip-text">Things goin on</span>
|
||||
<a href="2015.html#2015-05-11-things-goin-on">Things goin on
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-05-09-documenting-python-without-sphinx">May 9
|
||||
<span class="devblog-calendar-tooltip-text">Documenting Python without Sphinx</span>
|
||||
<span class="devblog-calendar-tooltip-text">Documenting Python without Sphinx</span>
|
||||
<a href="2015.html#2015-05-09-documenting-python-without-sphinx">Documenting Python...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2015.html#2015-01-19-building-django-proxies-and-mud-libraries">Jan 19
|
||||
<span class="devblog-calendar-tooltip-text">Building Django proxies and MUD libraries</span>
|
||||
<span class="devblog-calendar-tooltip-text">Building Django proxies and MUD libraries</span>
|
||||
<a href="2015.html#2015-01-19-building-django-proxies-and-mud-libraries">Building Django pr...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -418,44 +526,44 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2014.html#2014-10-02-slowly-moving-through-town">Oct 2
|
||||
<span class="devblog-calendar-tooltip-text">Slowly moving through town</span>
|
||||
<span class="devblog-calendar-tooltip-text">Slowly moving through town</span>
|
||||
<a href="2014.html#2014-10-02-slowly-moving-through-town">Slowly moving thro...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2014.html#2014-08-04-dance-my-puppets">Aug 4
|
||||
<span class="devblog-calendar-tooltip-text">Dance my puppets</span>
|
||||
<span class="devblog-calendar-tooltip-text">Dance my puppets</span>
|
||||
<a href="2014.html#2014-08-04-dance-my-puppets">Dance my puppets
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2014.html#2014-06-30-webby-stuff">Jun 30
|
||||
<span class="devblog-calendar-tooltip-text">Webby stuff</span>
|
||||
<span class="devblog-calendar-tooltip-text">Webby stuff</span>
|
||||
<a href="2014.html#2014-06-30-webby-stuff">Webby stuff
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2014.html#2014-06-15-bringing-back-python-memory">Jun 15
|
||||
<span class="devblog-calendar-tooltip-text">Bringing back Python memory</span>
|
||||
<span class="devblog-calendar-tooltip-text">Bringing back Python memory</span>
|
||||
<a href="2014.html#2014-06-15-bringing-back-python-memory">Bringing back Pyth...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2014.html#2014-05-16-imaginary-realities-volume-6,-issue-1">May 16
|
||||
<span class="devblog-calendar-tooltip-text"> Imaginary Realities volume 6, issue 1</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Imaginary Realities volume 6, issue 1</span>
|
||||
<a href="2014.html#2014-05-16-imaginary-realities-volume-6,-issue-1"> Imaginary Realiti...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2014.html#2014-02-08-moving-from-google-code-to-github">Feb 8
|
||||
<span class="devblog-calendar-tooltip-text">Moving from Google Code to Github</span>
|
||||
<span class="devblog-calendar-tooltip-text">Moving from Google Code to Github</span>
|
||||
<a href="2014.html#2014-02-08-moving-from-google-code-to-github">Moving from Google...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2014.html#2014-01-24-looking-forwards-and-backwards">Jan 24
|
||||
<span class="devblog-calendar-tooltip-text">Looking forwards and backwards</span>
|
||||
<span class="devblog-calendar-tooltip-text">Looking forwards and backwards</span>
|
||||
<a href="2014.html#2014-01-24-looking-forwards-and-backwards">Looking forwards a...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -470,32 +578,32 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2013.html#2013-12-16-imaginary-realities-is-back">Dec 16
|
||||
<span class="devblog-calendar-tooltip-text">Imaginary Realities is back</span>
|
||||
<span class="devblog-calendar-tooltip-text">Imaginary Realities is back</span>
|
||||
<a href="2013.html#2013-12-16-imaginary-realities-is-back">Imaginary Realitie...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2013.html#2013-11-28-out-of-band-mergings">Nov 28
|
||||
<span class="devblog-calendar-tooltip-text">Out of band mergings</span>
|
||||
<span class="devblog-calendar-tooltip-text">Out of band mergings</span>
|
||||
<a href="2013.html#2013-11-28-out-of-band-mergings">Out of band mergings
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2013.html#2013-10-22-a-list-of-evennia-topics">Oct 22
|
||||
<span class="devblog-calendar-tooltip-text">A list of Evennia topics</span>
|
||||
<span class="devblog-calendar-tooltip-text">A list of Evennia topics</span>
|
||||
<a href="2013.html#2013-10-22-a-list-of-evennia-topics">A list of Evennia ...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2013.html#2013-05-13-one-to-many">May 13
|
||||
<span class="devblog-calendar-tooltip-text">One to Many</span>
|
||||
<span class="devblog-calendar-tooltip-text">One to Many</span>
|
||||
<a href="2013.html#2013-05-13-one-to-many">One to Many
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2013.html#2013-01-29-churning-behind-the-scenes">Jan 29
|
||||
<span class="devblog-calendar-tooltip-text">Churning behind the scenes</span>
|
||||
<span class="devblog-calendar-tooltip-text">Churning behind the scenes</span>
|
||||
<a href="2013.html#2013-01-29-churning-behind-the-scenes">Churning behind th...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -510,80 +618,80 @@
|
|||
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-10-28-evennia-changes-to-bsd-license">Oct 28
|
||||
<span class="devblog-calendar-tooltip-text">Evennia changes to BSD license</span>
|
||||
<span class="devblog-calendar-tooltip-text">Evennia changes to BSD license</span>
|
||||
<a href="2012.html#2012-10-28-evennia-changes-to-bsd-license">Evennia changes to...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-10-05-community-interest">Oct 5
|
||||
<span class="devblog-calendar-tooltip-text">Community interest</span>
|
||||
<span class="devblog-calendar-tooltip-text">Community interest</span>
|
||||
<a href="2012.html#2012-10-05-community-interest">Community interest
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-08-31-combining-twisted-and-django">Aug 31
|
||||
<span class="devblog-calendar-tooltip-text">Combining Twisted and Django</span>
|
||||
<span class="devblog-calendar-tooltip-text">Combining Twisted and Django</span>
|
||||
<a href="2012.html#2012-08-31-combining-twisted-and-django">Combining Twisted ...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-08-16-taking-command">Aug 16
|
||||
<span class="devblog-calendar-tooltip-text">Taking command</span>
|
||||
<span class="devblog-calendar-tooltip-text">Taking command</span>
|
||||
<a href="2012.html#2012-08-16-taking-command">Taking command
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-06-26-extending-time-and-details">Jun 26
|
||||
<span class="devblog-calendar-tooltip-text">Extending time and details</span>
|
||||
<span class="devblog-calendar-tooltip-text">Extending time and details</span>
|
||||
<a href="2012.html#2012-06-26-extending-time-and-details">Extending time and...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-06-11-coding-from-the-inside">Jun 11
|
||||
<span class="devblog-calendar-tooltip-text">Coding from the inside</span>
|
||||
<span class="devblog-calendar-tooltip-text">Coding from the inside</span>
|
||||
<a href="2012.html#2012-06-11-coding-from-the-inside">Coding from the in...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-05-30-dummies-doing-(even-more)-dummy-things">May 30
|
||||
<span class="devblog-calendar-tooltip-text"> Dummies doing (even more) dummy things</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Dummies doing (even more) dummy things</span>
|
||||
<a href="2012.html#2012-05-30-dummies-doing-(even-more)-dummy-things"> Dummies doing (ev...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-03-26-shortcuts-to-goodness">Mar 26
|
||||
<span class="devblog-calendar-tooltip-text">Shortcuts to goodness</span>
|
||||
<span class="devblog-calendar-tooltip-text">Shortcuts to goodness</span>
|
||||
<a href="2012.html#2012-03-26-shortcuts-to-goodness">Shortcuts to goodn...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-02-22-dummies-doing-dummy-things">Feb 22
|
||||
<span class="devblog-calendar-tooltip-text">Dummies doing dummy things</span>
|
||||
<span class="devblog-calendar-tooltip-text">Dummies doing dummy things</span>
|
||||
<a href="2012.html#2012-02-22-dummies-doing-dummy-things">Dummies doing dumm...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-02-17-commands-and-you">Feb 17
|
||||
<span class="devblog-calendar-tooltip-text">Commands and you</span>
|
||||
<span class="devblog-calendar-tooltip-text">Commands and you</span>
|
||||
<a href="2012.html#2012-02-17-commands-and-you">Commands and you
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-02-15-such-a-small-thing-...">Feb 15
|
||||
<span class="devblog-calendar-tooltip-text"> Such a small thing ...</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Such a small thing ...</span>
|
||||
<a href="2012.html#2012-02-15-such-a-small-thing-..."> Such a small thin...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-02-05-evennia's-open-bottlenecks">Feb 5
|
||||
<span class="devblog-calendar-tooltip-text"> Evennia's open bottlenecks</span>
|
||||
<span class="devblog-calendar-tooltip-text">About this dev blog</span>
|
||||
<a href="2012.html#2012-02-05-about-this-dev-blog">About this dev blog
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="devblog-calendar-post devblog-calendar-tooltip">
|
||||
<a href="2012.html#2012-02-05-about-this-dev-blog">Feb 5
|
||||
<span class="devblog-calendar-tooltip-text">About this dev blog</span>
|
||||
<span class="devblog-calendar-tooltip-text"> Evennia's open bottlenecks</span>
|
||||
<a href="2012.html#2012-02-05-evennia's-open-bottlenecks"> Evennia's open bo...
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
|
@ -633,18 +741,10 @@
|
|||
<p>Evennia's default model uses traditional MU* rooms. These are simple nodes with exits linking them together. Such Rooms have no internal size and no inherent spatial relationship to each other. Moving from any Room to any other is happening as fast as the system can process the movement.</p>
|
||||
<p>Introducing a delay on exit traversal can have a surprisingly big effect on a game:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>It dramatically changes the "feel" of the game. It often makes the game feel less "twitch" and slows things down in a very real way. It lets Players consider movement as a "cost".</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>It simulates movement speed. A "quick" (or maybe well-rested) character might perceive an actual difference in traversal. The traversal speed can vary depending on if the Character is "running" or "walking".</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>It can emulate travel distance. An Exit leading to "the top of the mountain" may take longer to traverse than going "inside the tent".</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>It makes movement a "cost" to take into consideration in the game. Moving back and forth over and over across a distance of multiple rooms becomes a much more daunting prospect with a time delay than if you could just zip along as quickly as you could press the button. This also has effects on map and quest design.</p>
|
||||
</li>
|
||||
<li>It dramatically changes the "feel" of the game. It often makes the game feel less "twitch" and slows things down in a very real way. It lets Players consider movement as a "cost".</li>
|
||||
<li>It simulates movement speed. A "quick" (or maybe well-rested) character might perceive an actual difference in traversal. The traversal speed can vary depending on if the Character is "running" or "walking".</li>
|
||||
<li>It can emulate travel distance. An Exit leading to "the top of the mountain" may take longer to traverse than going "inside the tent".</li>
|
||||
<li>It makes movement a "cost" to take into consideration in the game. Moving back and forth over and over across a distance of multiple rooms becomes a much more daunting prospect with a time delay than if you could just zip along as quickly as you could press the button. This also has effects on map and quest design.</li>
|
||||
</ul>
|
||||
<p>Introducing delayed movement in Evennia is simple. But to explain the idea, let's first briefly explain how Evennia implements Exits.</p>
|
||||
<h4>A brief sideline: About Exits</h4>
|
||||
|
|
@ -735,16 +835,16 @@
|
|||
</h1>
|
||||
<p><a href="https://2.bp.blogspot.com/-AoyW71rwdmw/U52RCQqYoDI/AAAAAAAADnU/KH7QGKf_GmM/s1600/RAM.jpg"><img src="https://2.bp.blogspot.com/-AoyW71rwdmw/U52RCQqYoDI/AAAAAAAADnU/KH7QGKf_GmM/s1600/RAM.jpg" alt="" /></a></p>
|
||||
<p>Lately I've done work on the memory management of Evennia. Analyzing the memory footprint of a python program is a rather educational thing in general.</p>
|
||||
<p>Python keeps tracks of all objects (from variables to classes and everything in between) via a memory reference. When other objects reference that object it tracks this too.</p>
|
||||
<p>Once nothing references an object, it does not need to be in memory any more - in a more low-level languages this might lead to a memory leak. Python's <em>garbage collector</em> handles this for us though - it goes through all abandoned objects and frees the memory for usage by other things. The garbage collector will however <em>not</em> do its thing as long as some other object (which will not be garbage-collected) <em>still</em> holds a reference to the object. This is what you want - you don't want existing objects to stop working because an object they rely on is suddenly not there.</p>
|
||||
<p>Python keeps tracks of all objects (from variables to classes and everything in between) via a memory reference. When other objects reference that object it tracks this too.<br />
|
||||
Once nothing references an object, it does not need to be in memory any more - in a more low-level languages this might lead to a memory leak. Python's <em>garbage collector</em> handles this for us though - it goes through all abandoned objects and frees the memory for usage by other things. The garbage collector will however <em>not</em> do its thing as long as some other object (which will not be garbage-collected) <em>still</em> holds a reference to the object. This is what you want - you don't want existing objects to stop working because an object they rely on is suddenly not there.</p>
|
||||
<p>Normally in Django, whenever you retrieve an database model instance, that exists only in memory then and there. If you later retrieve the same object from the database, the model instance you have to work with is most likely a new one. This is okay for most usage, but Evennia's typeclass system (described in an earlier blog entry) as well our wish to store temporary properties on models (existing until next server restart) does not work if the model instance we get is always different. It would also help if we didn't have to load models from the database more than necessary.</p>
|
||||
<p>For this reason, Evennia uses something called the <em>idmapper</em>. This is a cache mechanism (heavily modified for Evennia) that allows objects to be loaded from the database only once and then be reused when later accessed. The speedup achieved from this is important, but as said it also makes critical systems work properly.</p>
|
||||
<p>The tradeoff of speed and utility is memory usage. Since the idmapper never drops those references it means that objects will never be garbage collected. The result was that the memory usage of Evennia could rise rapidly with an increasing number of objects. Whereas some objects (like those with temporary attributes) should indeed not be garbage collected, in a working game there is likely to be objects without such volatile data. An example might be objects that are not used some of the time - simply because players or the game don't need them for the moment. For such objects it may be okay to re-load them on demand rather than keep them in memory indefinitely.</p>
|
||||
<p>When looking into this I found that simply force-flushing the idmapper did <em>not</em> clean up all objects from memory. The reason for this has to do with how Evennia references objects via a range of other means. The reference count never went to zero and so the garbage collector never got around to it.</p>
|
||||
<p>With the excellent <a href="https://pypi.python.org/pypi/objgraph">objgraph</a> library it is actually pretty easy to track just what is referencing what, and to figure out what to remove. Using this I went through a rather prolonged spree of cleanups where I gradually (and carefully) cleaned up Evennia's object referencing to a point where the only external reference to most objects were the idmapper cache reference. So removing that (like when deliberately flushing the cache) will now make the object possible to garbage-collect.</p>
|
||||
<p><a href="http://postimg.org/image/p00v4oinl/">This</a> is how the reference map used to look for one type of Evennia object (ObjectDB) before the cleanup. Note the several references into the ObjectDB and the cyclic references for all handlers (the cyclic reference is in itself not a problem for reference-counting but they are slow and unnecessary; I now made all handlers use lazy-loading with weak referencing instead).</p>
|
||||
<p><a href="http://postimg.org/image/90i7l4mlt/">This</a> is how the reference map looks for the same object now. The <strong>instance</strong> cache is the idmapper reference. There are also no more cyclic references for handlers (the display don't even pick up on them for this depth of recursion). Just removing that single link will now garbage-collect ObjectDB and its typeclass (ignore the <em>g</em> reference, that is just the variable holding the object in ipython).</p>
|
||||
<p>We also see that the dbobj.typeclass <-> typeclass.dbobj references keep each other alive and when one goes the other one goes too - just as expected.</p>
|
||||
<p><a href="http://postimg.org/image/90i7l4mlt/">This</a> is how the reference map looks for the same object now. The <strong>instance</strong> cache is the idmapper reference. There are also no more cyclic references for handlers (the display don't even pick up on them for this depth of recursion). Just removing that single link will now garbage-collect ObjectDB and its typeclass (ignore the <em>g</em> reference, that is just the variable holding the object in ipython).<br />
|
||||
We also see that the dbobj.typeclass <-> typeclass.dbobj references keep each other alive and when one goes the other one goes too - just as expected.</p>
|
||||
<p>An curious aspect of Python memory handling is that (C-)Python does <em>not</em> actually release the memory back to operating system when flushing the idmapper cache. Rather Python makes it internally available so that it does not need to request any more. The result is that if you look at Evennia with the <em>top</em> command, its memory requirement (for example while continuously creating new objects) will not actually <em>drop</em> on a idmapper flush, it will just <em>stop rising</em>. This is discussed at length in <a href="http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm">this blog</a>, it was good to learn it was not something I did at least.</p>
|
||||
<p>Apart from the memory stuff, there is work ongoing with fixing the latest batch of user issue reports. Another dev is working on cleaning up the web-related code, it should make it a lot cleaner to overload web functionality with custom code. One of those days I'll also try to sit down and finally convert our web client from long-polling to use web sockets now that Evennia suppports web sockets natively. Time, time ...</p>
|
||||
|
||||
|
|
@ -767,27 +867,13 @@
|
|||
<p>I'm a bit late with writing about it, but the latest issue of <em>Imaginary Realities</em> has been out for a month or so now. You can find it <a href="https://www.blogger.com/"></a><a href="http://journal.imaginary-realities.com/volume-06/issue-01/index.html">here</a>.</p>
|
||||
<p>Here is a brief summary of the articles in the latest issue.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>In <em><strong>A Journey Through Paradice, Part II</strong>,</em> Matthew Chaplan continues his description of the C++ codebase <em>Paradice9</em>, notably focusing on its input handling, which uses character-mode telnet to produce plenty of interesting effects in a custom terminal client. There are plenty of interesting features (or potential features) discussed. An example is the client knowing to store the receiver of a "reply" command the moment the command is entered rather than waiting for the player the press return (at which point someone else might have written to you and the reply-to target would have changed in a traditional setup). There is no denying the power of having a custom client for your game. And whereas I think some more secure protocol than telnet would maybe be better to use when you control both server and client anyway, it's really interesting to see the power and features you can achieve with it.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em><strong>Building a Giant Mech in Evennia</strong> -</em> this is my entry for this issue; a short little tutorial on designing a machine of mirth and mayhem in Evennia.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Richard “KaVir” Woolcock's <em><strong>Describing a Virtual World</strong></em> covers the different uses of dynamically created descriptions in text games. He summarizes the types, from the most common, fully static room description up unto the character-dependent procedurally generated descriptions in his own <em>GodWarsII</em> mud. It's a fascinating read since it not only goes into rooms but also how to build piecemeal and situation-aware character and object descriptions as well as procedural help and quest info. The techniques are not for every type of game of course. But a good and informative read for anyone interested in game design.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em><strong>Dynamic room descriptions</strong>,</em> by Jana, are also covering room descriptions although takes a more conservative conclusion than the full procedural contruction of KaVir's article. This covers the hybrid hand-written description - that is hand-written text that uses a markup language for optional or situation-dependent text. It makes for a good text on implementing such a system (an Evennia equivalent is <em>extended_room.py</em> found in our <em>contrib</em> folder.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong><em>Saddle Up - A Personal Story about Riding Your Demon to Success</em></strong> is a summary and inspirational story by Michael "Drakkos" Heron. It ties back to his work with <em>Epitath</em> and how it has affected and improved (and continues to improve) his personal and professional life. I like that he manages to include his game development work into his teaching and reasearch, a cool way to make use of your hobby. He has a point on the usability of a coding hobby like this: I myself have had lots of use and even landed project work based on my work with Evennia. One of our users landed his current job based on knowledge he learned working with Evennia. So there is definitely an advantage to mud-development outside the hobby realm.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em><strong>The Successful Quest Builder</strong></em> by John "TheDude" Robinette and Joanna "Lorana" Liberty covers the construction of a Quest from the designer's perspective. Rather than focusing on gameplay considerations the authors here focus on the technical aspects; learning the codebase's tools and things to think about debugging and developing something that is enjoyable for the players.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The article <strong><em>Your MUD Should Have an Account System</em></strong> finally, is Matthew “Chaos” Sheahan's argument as to why a game should use a single login account system rather than the old way of creating a new account per player. Much of the argument is around converting an old-school code base into this configuration and how it's not as hard as one may think. I fully agree on his assessment (although I wonder just how "easy" it is to patch on such a system on an old-running mud). He even mentions Evennia as an example of a modern codebase having this functionality out of the box (yay!).</p>
|
||||
</li>
|
||||
<li>In <em><strong>A Journey Through Paradice, Part II</strong>,</em> Matthew Chaplan continues his description of the C++ codebase <em>Paradice9</em>, notably focusing on its input handling, which uses character-mode telnet to produce plenty of interesting effects in a custom terminal client. There are plenty of interesting features (or potential features) discussed. An example is the client knowing to store the receiver of a "reply" command the moment the command is entered rather than waiting for the player the press return (at which point someone else might have written to you and the reply-to target would have changed in a traditional setup). There is no denying the power of having a custom client for your game. And whereas I think some more secure protocol than telnet would maybe be better to use when you control both server and client anyway, it's really interesting to see the power and features you can achieve with it.</li>
|
||||
<li><em><strong>Building a Giant Mech in Evennia</strong> -</em> this is my entry for this issue; a short little tutorial on designing a machine of mirth and mayhem in Evennia.</li>
|
||||
<li>Richard “KaVir” Woolcock's <em><strong>Describing a Virtual World</strong></em> covers the different uses of dynamically created descriptions in text games. He summarizes the types, from the most common, fully static room description up unto the character-dependent procedurally generated descriptions in his own <em>GodWarsII</em> mud. It's a fascinating read since it not only goes into rooms but also how to build piecemeal and situation-aware character and object descriptions as well as procedural help and quest info. The techniques are not for every type of game of course. But a good and informative read for anyone interested in game design.</li>
|
||||
<li><em><strong>Dynamic room descriptions</strong>,</em> by Jana, are also covering room descriptions although takes a more conservative conclusion than the full procedural contruction of KaVir's article. This covers the hybrid hand-written description - that is hand-written text that uses a markup language for optional or situation-dependent text. It makes for a good text on implementing such a system (an Evennia equivalent is <em>extended_room.py</em> found in our <em>contrib</em> folder.</li>
|
||||
<li><strong><em>Saddle Up - A Personal Story about Riding Your Demon to Success</em></strong> is a summary and inspirational story by Michael "Drakkos" Heron. It ties back to his work with <em>Epitath</em> and how it has affected and improved (and continues to improve) his personal and professional life. I like that he manages to include his game development work into his teaching and reasearch, a cool way to make use of your hobby. He has a point on the usability of a coding hobby like this: I myself have had lots of use and even landed project work based on my work with Evennia. One of our users landed his current job based on knowledge he learned working with Evennia. So there is definitely an advantage to mud-development outside the hobby realm.</li>
|
||||
<li><em><strong>The Successful Quest Builder</strong></em> by John "TheDude" Robinette and Joanna "Lorana" Liberty covers the construction of a Quest from the designer's perspective. Rather than focusing on gameplay considerations the authors here focus on the technical aspects; learning the codebase's tools and things to think about debugging and developing something that is enjoyable for the players.</li>
|
||||
<li>The article <strong><em>Your MUD Should Have an Account System</em></strong> finally, is Matthew “Chaos” Sheahan's argument as to why a game should use a single login account system rather than the old way of creating a new account per player. Much of the argument is around converting an old-school code base into this configuration and how it's not as hard as one may think. I fully agree on his assessment (although I wonder just how "easy" it is to patch on such a system on an old-running mud). He even mentions Evennia as an example of a modern codebase having this functionality out of the box (yay!).</li>
|
||||
</ul>
|
||||
<p>Deadline for the next issue is <a href="http://posted-stuff.blogspot.se/2014/04/write-article-for-imaginary-realities.html">announced to be May 31 2014</a> so don't be shy to contribute your own article. Richard Tew hints at in his introduction, finding people to write articles is the tricky part still.</p>
|
||||
|
||||
|
|
@ -818,12 +904,8 @@
|
|||
<p>I set aside a new folder on my hard drive and cloned the original mercurial repo into a new sub folder. A good idea is to set up a quick Python <a href="https://pypi.python.org/pypi/virtualenv">virtual environment</a> for easily getting updated dependencies of build scripts.</p>
|
||||
<p>I initialized an empty Git repository and used a program called <a href="https://github.com/frej/fast-export">hg-fast-export</a> to convert. As it turned out there were some finer details to consider when doing that:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>The most obvious one was that the conversion initially failed, complaining about the Mercurial original containing "unnamed branches". These came from a contributor who did <em>something</em> to spawn off all sorts of weird branches with little purpose. I should not have merged those into main in the first place, but in those days I didn't know mercurial well enough to be concerned. In the end I simply used mercurial's MQ extension to remove the unnamed (and unused) branches so the conversion could complete.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The second issue was that Mercurial is less stringent about its author strings than Git is. Git's author string is "name <email>". Over the years we have gotten contributions from people with all sorts of combinations of names, with or without an email address. So for this we had to supply a mapping file to the converter. It's basically a list of old_author_string = new_author_string and allows for grouping the various used names as needed (some of them were the same person using slightly different author strings).</p>
|
||||
</li>
|
||||
<li>The most obvious one was that the conversion initially failed, complaining about the Mercurial original containing "unnamed branches". These came from a contributor who did <em>something</em> to spawn off all sorts of weird branches with little purpose. I should not have merged those into main in the first place, but in those days I didn't know mercurial well enough to be concerned. In the end I simply used mercurial's MQ extension to remove the unnamed (and unused) branches so the conversion could complete.</li>
|
||||
<li>The second issue was that Mercurial is less stringent about its author strings than Git is. Git's author string is "name <email>". Over the years we have gotten contributions from people with all sorts of combinations of names, with or without an email address. So for this we had to supply a mapping file to the converter. It's basically a list of old_author_string = new_author_string and allows for grouping the various used names as needed (some of them were the same person using slightly different author strings).</li>
|
||||
</ul>
|
||||
<p>Once this was in place, the repo conversion worked fine. It was just a matter of changing the .hgignore file to a .gitignore file and change some code that made use of mercurial to get and display the current revision id.</p>
|
||||
<h3>Converting the Wiki, part one</h3>
|
||||
|
|
@ -832,9 +914,7 @@
|
|||
<p>All in all, the initial wiki conversion worked decently - all the pages were converted over and were readable. I was even to the point of declaring success when finding the damn thing messed up the links. Googe Code writes links like this: [MyLink Text to see on page]. The script converted this to [[MyLink|Text to see on page]]. Which may look fine except it isn't. GitHub actually wants the syntax in the inverse order: [[Text to see on page|MyLink]].</p>
|
||||
<p>Furthermore, in Google Code's wiki, code blocks were marked with</p>
|
||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>{{{
|
||||
|
||||
<verbatim code>
|
||||
|
||||
}}}
|
||||
</pre></div>
|
||||
|
||||
|
|
@ -842,13 +922,9 @@
|
|||
<p>I could have gone back and fixed the converter script, but I suspected there would be enough small things to fix anyway. So in the end I went through 80+ pages of fixing link syntax and adding empty lines by hand. After that I could finally push the first converted wiki version up to the GitHub wiki repository.</p>
|
||||
<p>Some time later I also found that there is a way to let GitHub wiki pages use syntax highlighting for the language of your choice. The way to do this is to enclose your code blocks like this:</p>
|
||||
<div class="highlight" style="background: #f8f8f8"><pre style="line-height: 125%;"><span></span>```python
|
||||
|
||||
|
||||
|
||||
<verbatim code>
|
||||
|
||||
|
||||
|
||||
```
|
||||
</pre></div>
|
||||
|
||||
|
|
@ -859,37 +935,19 @@
|
|||
<h3>Converting the IRC announcer</h3>
|
||||
<p>A lot of development discussion goes on in our IRC channel #evennia on Freenode. There is an announcer bot in there that I've written, that collates information from various sources and reports it in the IRC channel:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Repository updates</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Wiki updates</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Issue creation and updates</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Mailing list/forum posts</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Dev-blog updates (this blog)</p>
|
||||
</li>
|
||||
<li>Repository updates</li>
|
||||
<li>Wiki updates</li>
|
||||
<li>Issue creation and updates</li>
|
||||
<li>Mailing list/forum posts</li>
|
||||
<li>Dev-blog updates (this blog)</li>
|
||||
</ul>
|
||||
<p>Say what you will about Google, but they are great at offering RSS feeds to all their stuff. So my IRC bot was basically a glorified threaded RSS reader that echoed changes to the channel as they came in. This had been working nicely for years.</p>
|
||||
<p>GitHub does offer RSS feeds to -some- of their offerings, but it's a lot more patchy. I eventually had to do quite a bit of hacking to get everything reporting the way we were used to.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>GitHub has its own IRC announcer bot that reports to IRC. The problem is that this will connect, send message and then disconnect. This causes a lot of spam in the channel. We neither can nor want to set +n on our channel to allow external messages either. The way I solved this was to expand my own custom IRC bot to sit in <em>two</em> irc channels. The GitHub announcer connects to only one of them (so this gets all the spammy connect messages). My IRC bot picks up the announcement and echoes it cleanly to our main #evennia channel. It works really well.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Issues are handled by the GitHub announcer in the same way.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>GitHub has no automatic way to report wiki updates. It doesn't even have a proper RSS feed. However, a user clued me in on using the <a href="http://pipes.yahoo.com/pipes/pipe.info?_id=02bfefe73ba14054570ce82f1929e433">pipes</a> website to relay an RSS feed from github. I then configured my IRC bot to check that RSS and report it (I also changed the IRC colours to match the GitHub-announcer ones).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Mailing list and blog haven't changed, so those are still handled via RSS as before.</p>
|
||||
</li>
|
||||
<li>GitHub has its own IRC announcer bot that reports to IRC. The problem is that this will connect, send message and then disconnect. This causes a lot of spam in the channel. We neither can nor want to set +n on our channel to allow external messages either. The way I solved this was to expand my own custom IRC bot to sit in <em>two</em> irc channels. The GitHub announcer connects to only one of them (so this gets all the spammy connect messages). My IRC bot picks up the announcement and echoes it cleanly to our main #evennia channel. It works really well.</li>
|
||||
<li>Issues are handled by the GitHub announcer in the same way.</li>
|
||||
<li>GitHub has no automatic way to report wiki updates. It doesn't even have a proper RSS feed. However, a user clued me in on using the <a href="http://pipes.yahoo.com/pipes/pipe.info?_id=02bfefe73ba14054570ce82f1929e433">pipes</a> website to relay an RSS feed from github. I then configured my IRC bot to check that RSS and report it (I also changed the IRC colours to match the GitHub-announcer ones).</li>
|
||||
<li>Mailing list and blog haven't changed, so those are still handled via RSS as before.</li>
|
||||
</ul>
|
||||
<p>All this done, the modified IRC announcement works well.</p>
|
||||
<h3>Closing the book on Google Code</h3>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue