mirror of
https://github.com/evennia/evennia.git
synced 2026-03-24 08:46:31 +01:00
Restructured devblog and built files
This commit is contained in:
parent
f914280be6
commit
8a62ca8171
14 changed files with 8948 additions and 18 deletions
1059
devblog/2012.html
Normal file
1059
devblog/2012.html
Normal file
File diff suppressed because it is too large
Load diff
713
devblog/2013.html
Normal file
713
devblog/2013.html
Normal file
|
|
@ -0,0 +1,713 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<title>Devblog: Evennia Python MUD/MU creation system</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../images/favicon.ico">
|
||||
<link rel="stylesheet" href="../stylesheets/styles.css">
|
||||
<link rel="stylesheet" href="../stylesheets/pygment_trac.css">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open Sans' rel='stylesheet'>
|
||||
<link href='https://fonts.googleapis.com/css?family=Arvo' rel='stylesheet'>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="Evennia is a modern Python library and server for creating text-based multi-player games and virtual worlds (also known as MUD, MUSH, MU, MUX, MUCK, etc). While Evennia handles all the necessary things every online game needs, like database and networking, you create the game of your dreams by writing normal Python modules.">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js">
|
||||
</script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<p>
|
||||
<img class="logo" src="../images/evennia_logo.png" alt="Evennia logo">
|
||||
</p>
|
||||
<h1 class="header">Evennia</h1>
|
||||
<p class="header header-text">The Python MU* Development Library</p>
|
||||
<div class="linksection">
|
||||
<ul>
|
||||
<div class="buttonsection">
|
||||
<li>
|
||||
<a class="buttons" href="https://www.evennia.com">Back to Evennia</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="devblog-calendar">
|
||||
<ul>
|
||||
|
||||
<li><a href="2021.html">2021 (2)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2020.html">2020 (3)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2019.html">2019 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2018.html">2018 (4)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2017.html">2017 (6)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2016.html">2016 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2015.html">2015 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2014.html">2014 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2013.html">2013 (5)
|
||||
|
||||
<ul class="devblog-calendar-open">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2012.html">2012 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<section>
|
||||
<h1>
|
||||
<a name="evennia-mudmu-creation-system" class="anchor" href="#evennia-mudmu-creation-system">
|
||||
<span class="octicon octicon-link">
|
||||
</span>
|
||||
</a>Evennia Dev Blog<div class="sponsor">
|
||||
<div class="sponsor-column">
|
||||
<a href="https://www.patreon.com/griatch">
|
||||
<img class="patreon" src="../images/evennia_patreon_100x100.png" alt="Patreon">
|
||||
</a>
|
||||
<p>
|
||||
<a href="https://www.paypal.me/GriatchEvennia">
|
||||
<img class="paypal" src="../images/btn_donateCC_LG.gif" alt="Paypal donate">
|
||||
</a>
|
||||
</div>
|
||||
</h1>
|
||||
|
||||
<em>Various Evennia- and MUD-related musings by Griatch, the Evennia lead developer.</em>
|
||||
|
||||
|
||||
|
||||
<div class="blog_post">
|
||||
<h1 id=2013-12-16-imaginary-realities-is-back>
|
||||
Imaginary Realities is back
|
||||
<a class="devblog-headerlink" href="2013.html#2013-12-16-imaginary-realities-is-back" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- December 16, 2013</div>
|
||||
</h1>
|
||||
<p><a href="http://imaginary-realities.disinterest.org/pics/logo_new.gif"><img src="https://lh4.googleusercontent.com/proxy/CEw97RBnw7FiR_z7fqlj9ELtwgDU-knwkyiW8Ybjg9tjTUAerwxQ0-omUEwpZAz4jKP1ozmnCLHPBh1A4QxrGZzYD3DEFfIdTReu0TTPJwo=s0-d" alt="" /></a>The <em><a href="http://imaginary-realities.disinterest.org/">Imaginariy Realities</a></em> webzine was the place to go to for MUD game design articles in the late 90's. Last released in 2001, its articles are still worth the read for any game designers today.</p>
|
||||
<p>But guess what - this venerable ezine has now returned! You can find the new issue <a href="http://journal.imaginary-realities.com/volume-05/issue-01/index.html">here</a>.</p>
|
||||
<p>I think this is a good community initiative worthy of support. I contibuted two articles myself (one of which is about Evennia) and would like to thank the staff/editors who took their work very seriously and did sterling work on getting everything in shape.</p>
|
||||
<p>Thanks also to the other authors who penned some very interesting articles. Great job guys!</p>
|
||||
<p>My impressions:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>KaVir elaborates in <em>A modern interface for a modern MUD</em> on the advantages of not sticking with an outdated UI just for the sake of it. Adding a more accessible presentation is not that hard and won't ruin your game but rather help it. Whereas I have read his argument about this before, this is a good summary to take to heart. Evennia's javascript web client is currently mainly a telnet clone; there's a lot of things we could offer to make it easier for users to offer a more graphical presentation.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Molly O’Hara, in her <em>A well built zone is a work of art,</em> outlines a list of useful things to keep in mind when designing a zone. While some of these vary with game type, others do not. I like the suggestion that scripting bugs need not be the most important aspect - syntactic errors can be handled by automated means as long as the design aspect of the zone is solid.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>A journey through Paradice</em> [sic] is Matthew Chaplain's entry on designing a dice-roller using the telnet protocol. Some interesting things here, including making creative use of the telnet character-mode and VT100 control sequences. This ties a bit into KaVir's article, in that the interface used for "modern" MUDs are often voefully missing out on a lot of possibilities.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Blind accessibility: challenges and opportunities</em> by Matthew “Chaos” Sheahan, is based on interviews with a blind mudder and a game admin having implemented lots of support for seeing-impaired players. This was a really interesting article since I've been pondering myself what could be done from Evennia's core side to help players support players using screen readers. Most seem to be down to configuration options though, and avoiding making colour or ascii art the only sources of information. These are all things Evennia devs implement depend on their game. We may offer some good contribs to build from though.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Evennia: an introduction -</em> this is mine. It not-so-briefly sums up stuff about Evennia and the more important systems it relies on.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Getting a roleplaying scene going</em> - another article of mine. This is a light-hearted list of tropes for getting a RP scene going on an RP-mud. It's based on things I've tried or seen myself in play.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Darcie “Natilena” Laur laments on the often opaque newbie guides in <em>Introducing new players and redesigning MUD School.</em> It describes how she tested (and improved) her own MUD's starter area while testing it on her kids. It made me think more on having Evennia offering easier ways to dump text logs in all sorts of situations. And we find out that kids have the attention span of zombie squirrels - something new learned every day!</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Finally, <em>The Hunger Game, or how I learned to break the ship from the bottle</em> is Michael “Drakkos” Heron's epic about his journey developing and releasing his zombie-survival MUD <em>Epitaph.</em> Drakkos is a frequent blogger on the MUD-planet feed, so I knew some of this already, but it's a good read and contains some useful warnings and things-to-think-of for those thinking of starting their own MUD project. We already give some of the same advice (albeit with fewer words) in our wiki but I'm seriously considering linking to Drakkos post from there as well - it gives a more comprehensive treatment and offers a real-world example of the long road to a released game.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>The issue also contains a call to help recover old MUDing resources that has gone offline since their heyday. Having browsed through the classic MUD-dev mailing list archives I can agree they are not quite as easily searchable as could be hoped. It would also be great to see the old comment posts tied to the articles of the old <em>Imaginary Realities</em> articles, if those could be found somehow.</p>
|
||||
<p>This is actually one thing which I do miss with this first Imaginary Realities issue - a way for readers to comment on the articles. This would likely mean a much higher level of complexity and work though, so I can certainly see why it's not there - using the existing MUD forums is probably enough for now.</p>
|
||||
<p>Anyway, I'm happy to see this thing getting off on a good start. I'm already looking forward to the next issue!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2013-11-28-out-of-band-mergings>
|
||||
Out of band mergings
|
||||
<a class="devblog-headerlink" href="2013.html#2013-11-28-out-of-band-mergings" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- November 28, 2013</div>
|
||||
</h1>
|
||||
<p><a href="https://4.bp.blogspot.com/-RcZi6McnLtc/Upd90AEpnTI/AAAAAAAACHA/ALGE2Ompi6k/s1600/FS-0609-Merger-1.jpg"><img src="https://4.bp.blogspot.com/-RcZi6McnLtc/Upd90AEpnTI/AAAAAAAACHA/ALGE2Ompi6k/s200/FS-0609-Merger-1.jpg" alt="" /></a></p>
|
||||
<p>As of today the development repository of Evennia, which has been brewing for a few months now, merged into the main repository. This update grew from one experimental feature to a relatively big update in the end. Together with the "many-character-per-player" feature released earlier, this update covers all the stuff I talked about in my <a href="http://evennia.blogspot.se/2013/01/churning-behind-scenes.html">Behind the Scenes</a> blog post.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Evennia's webserver was moved from <em>Portal</em> to <em>Server</em>. This moves all database-modifying operations into the same process and neatly avoids race conditions when modifying a game world from various interfaces.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The OOB (Out Of Band) handler was implemented. This goes together with a protocol for telnet sub-negotiations according to the <a href="http://tintin.sourceforge.net/msdp/">MSDP</a> specification. The handler allows on-demand reporting whenever database fields update. It also offers regular polling of properties if needed. A user can customize which oob commands are available to the client and write whatever handlers are needed for their particular game. In the future we'll also add support for GMCP, but the lack of a central, official specification is off-putting (if there is a central document besides accounts of how individual games chose to implement GMCP, please let me know). For our own included web client, we'll likely just use JSON straight off.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Our channel system is now <em>typeclassed</em>. If you are not familiar with Evennia this won't mean much to you - In short it means developers will be able to customize their channel system much easier than in the past since a channel can be treated pretty much like any Python class (thanks go to user Kelketek who actually did the implementation).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>We added the concept of <em>Tagging</em>, as a more generalized version of our old <em>Alias</em> system. Tagging is just what it sounds like - it allows you to tag all your objects in order to group them and easily (and efficiently) find them later. Tagging offers a powerful way to create what other code bases refer to as "zones". There are many other possible uses though, such as having effects appear only in certainly tagged rooms, indicate which Characters have joined a particular guild and so on.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Behind the scenes there were a lot of cleanups, along with minor API changes mentioned on the mailing list. A slew of older Issues were also fixed with this merge.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Now, in the immediate future we'll be working on updating the documentation. Evennia prides itself with having a large body of documentation and this update comes with small changes to various existing systems. There are also a few bigger new features (such as OOB). No doubt the near future will also see other issues popping up as more people try things out.</p>
|
||||
<h4>Imaginary Realities update</h4>
|
||||
<p>Apparently the reboot of <em>Imaginary Realities</em> (to which I contribute two articles) has been <a href="http://posted-stuff.blogspot.se/2013/11/imaginary-realities-update_15.html">pushed forward a week or two</a>. Reason being, apparently, to finalize the actual presentation of the content. I already signed off on the last editorial fixes way before deadline, so I guess it's just to wait and see what comes of it!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2013-10-22-a-list-of-evennia-topics>
|
||||
A list of Evennia topics
|
||||
<a class="devblog-headerlink" href="2013.html#2013-10-22-a-list-of-evennia-topics" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- October 22, 2013</div>
|
||||
</h1>
|
||||
<p><a href="https://4.bp.blogspot.com/-WXVxxb06XBA/UmZ_5TSzmrI/AAAAAAAACE4/NbBAjohOi6E/s1600/building-blocks.jpg"><img src="https://4.bp.blogspot.com/-WXVxxb06XBA/UmZ_5TSzmrI/AAAAAAAACE4/NbBAjohOi6E/s1600/building-blocks.jpg" alt="" /></a></p>
|
||||
<p>Some Evennia updates.</p>
|
||||
<h2>Development</h2>
|
||||
<p>Lots of work has been happening in the <a href="http://code.google.com/r/griatch-evennia-dev/source/list">dev-clone</a> of Evennia over the last few months.</p>
|
||||
<p>As alluded to in the last blog, the main work has been to move Evennia's webserver component into the <em>Server</em>-half of Evennia for various reasons, the most obvious one to make sure that all database writes happen in the same process, avoiding race conditions. But this move lead to a rework of the cache system, which in turn lead to me having to finalize the plans for how Out-of-Band protocols should be implemented server-side. And once that was finalized, OOB was pretty much implemented anyway. As part of making sure OOB trackers were updated correctly at all times meant reworking some of the ways data is stored ... So one thing led to another making this a bigger update than originally planned.</p>
|
||||
<p>I plan to make a more detailed post to the <a href="https://groups.google.com/forum/#%21forum/evennia">mailing list</a> soon with more technical details of the (relatively minor) API changes existing users should expect. The merging of the clone into the main repo is still a little way off, but adventurous users have already started testing things.</p>
|
||||
<h2>Google Code</h2>
|
||||
<p>I like Google Code. It's easy to manage and maintain, it has a good wiki and Issue system, not to mention that it allows the use of Mercurial. But in the beginning of September, suddenly all links to our user's clone repositories were <em>gone</em> from the front of the project page_._ Not only that, creating new clones just didn't work anymore.</p>
|
||||
<p>Now any site can have bugs, and we made an <a href="http://code.google.com/p/support/issues/detail?id=30989">issue</a> for it (other projects were similarly affected). But nothing happened for the longest time - at least two months given that we didn't report it right away. Just recently the functionality came back but there is no confirmation or comments from Google (our issue is not even closed).</p>
|
||||
<p>That such a fundamental feature can go unheeded for so long is disturbing to me, driving home the fact that Google is certainly not putting much priority in their code hosting.</p>
|
||||
<h2>Community</h2>
|
||||
<p>Some furious activity in the <a href="http://webchat.freenode.net/?channels=evennia&uio=MT1mYWxzZSY5PXRydWUmMTE9MTk1JjEyPXRydWUbb">IRC chat</a> lately, with new people dropping in to chat and ask about Evennia. For example, an enthusiastic new user learned not only about Evennia but also Python for the first time. It was a lot of fun to see him go from having <em>no programming experience except</em> <em>mush softcode</em> to doing advanced Evennia system implementations in the course of a week and offering good feedback on new features in two. Good show! The freedom you get upgrading from something like softcode to Evennia's use of a full modern programming language was seemingly quite eye-opening.</p>
|
||||
<p>Other discussions have concerned the policies around using clones/branches for development as well as the benefits of some other hosting solution. Nothing has been decided on this. There is however now also an official GitHub mirror of Evennia's main repo to be found <a href="https://github.com/Evennia/evennia">here</a>.</p>
|
||||
<h2>Imaginary Realities</h2>
|
||||
<p>The deadline for entering articles for the <em>Imaginary Realities</em> web zine <a href="http://posted-stuff.blogspot.se/2013/10/imaginary-realities-update.html">reboot</a> has passed. It's a good initiative to bring this back - the <a href="http://en.wikipedia.org/wiki/Imaginary_Realities">original (archived) webzine</a> remains a useful mud-creation resource to this day. I entered two articles, one about Evennia and another about general mud-roleplaying. It will be fun to see how it comes out, apparently the first issue will appear Nov 13</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2013-05-13-one-to-many>
|
||||
One to Many
|
||||
<a class="devblog-headerlink" href="2013.html#2013-05-13-one-to-many" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- May 13, 2013</div>
|
||||
</h1>
|
||||
<p><a href="https://4.bp.blogspot.com/-M_YNUYvWuiw/UZCNa-U24lI/AAAAAAAAB2o/6wZzFjpCSvk/s1600/one-in-many.jpg"><img src="https://4.bp.blogspot.com/-M_YNUYvWuiw/UZCNa-U24lI/AAAAAAAAB2o/6wZzFjpCSvk/s320/one-in-many.jpg" alt="" /></a></p>
|
||||
<p>As of yesterday, I completed and merged the first of the three upcoming Evennia features I mentioned in my <a href="http://evennia.blogspot.se/2013/01/churning-behind-scenes.html">Churning Behind the Scenes</a> blog post: the "Multiple Characters per Player" feature.</p>
|
||||
<p>Evennia makes a strict division between <em>Player</em> (this is an object storing login-info and represents the person connecting to the game) and their <em>Character</em> (their representation in-game; Characters are just Objects with some nice defaults). When you log into the game with a client, a <em>Session</em> tracks that particular connection.</p>
|
||||
<p>Previously the Player class would normally only handle one Session at a time. This made for an easy implementation and this behavior is quite familiar to users of many other mud code bases. There was an option to allow more than one Session, but each were then treated equally: all Sessions would see the same returns and the same in-game entities were controlled by all (and giving the quit command from one would kick all out).</p>
|
||||
<p>What changed now is that the Player class will manage each Session separately, without interfering with other Sessions connected to the same Player. Each Session can be connected, through the Player, to an individual Character. So multiple Characters could in principle be controlled simultaneously by the same real-world player using different open mud clients. This gives a lot of flexibility for games supporting multi-play but also as a nice way to transparently puppet temporary extras in heavy roleplaying games.</p>
|
||||
<p>It is still possible to force Evennia to accept only one Session per Player just like before, but this is now an option, not a limitation. And even in hardcore one-character-at-a-time roleplaying games it is nice for builders and admins to be able to have separate staff or npc characters without needing a separate account for each.</p>
|
||||
<p>This feature took a lot more work than I anticipated - it consitutes a lot of under-the-hood changes. But it also gave me ample opportunity to fix and clean up older systems and fix bugs. The outcome is more consistency and standardization in several places. There are plenty of other noteworthy changes that were made along the way in the dev branch along with some API changes users should be aware of.</p>
|
||||
<p>So if you are an Evennia game developer you should peek at the more detailed mailing list <a href="https://groups.google.com/forum/#%21topic/evennia/EjAW8S2N86I">announcement</a> on what has changed. The wiki is not updated yet, that will come soon.</p>
|
||||
<p>Now onward to the next feature!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2013-01-29-churning-behind-the-scenes>
|
||||
Churning behind the scenes
|
||||
<a class="devblog-headerlink" href="2013.html#2013-01-29-churning-behind-the-scenes" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- January 29, 2013</div>
|
||||
</h1>
|
||||
<p><a href="https://1.bp.blogspot.com/-kMcLTjgmpa0/UQfBh7FsD7I/AAAAAAAABys/uGhAhtwG22s/s1600/red_curtain_hand3crop_category.jpg"><img src="https://1.bp.blogspot.com/-kMcLTjgmpa0/UQfBh7FsD7I/AAAAAAAABys/uGhAhtwG22s/s200/red_curtain_hand3crop_category.jpg" alt="" /></a></p>
|
||||
<p>At the moment there are several Evennia projects churning along behind the scenes, none of which I've yet gotten to the point of pushing into a finished state. Apart from bug fixes and other minor things happening, these are the main updates in the pipeline at the moment.</p>
|
||||
<h3>Multiple Characters per Player/Session</h3>
|
||||
<p>Evennia has for a long time enforced a clean separation between the <em>Player</em> and the <em>Character.</em> It's a much appreciated feature among our users. The <em>Player</em> is "you", the human playing the game. It knows your password, eventual user profile etc. The <em>Character</em> is your avatar in-game. This setup makes it easy for a Player to have many characters, and to "puppet" characters - all you need to do is "disconnect" the Player object from the Character object, then connect to another Character object (assuming you are allowed to puppet that object, obviously). So far so good.</p>
|
||||
<p>What Evennia currently <em>doesn't</em> support is being logged in with <em>different</em> client sessions to the <em>same</em> Player/account while puppeting <em>multiple</em> characters <em>at the same time.</em> Currently multiple client sessions may log into the same Player account, but they will then all just act as separate views of the same action (all will see the same output, you can send commands from each but they will end up with the same Character).</p>
|
||||
<p>Allowing each session to control a separate Character suggests changing the way the session is tracked by the player and Character. This turns out to be more work than I originally envisioned when seeing the feature request in the issue tracker. But if my plan works out it will indeed become quite easy to use Evennia to both allow multi-play or not as you please, without having to remember separate passwords for each Character/account.</p>
|
||||
<h3>Webserver change to Server level</h3>
|
||||
<p>Evennia consists of two main processes, the <em>Portal</em> and the <em>Server.</em> The details of those were covered in an earlier blog post <a href="http://evennia.blogspot.se/2012/08/combining-twisted-and-django.html">here</a>. Evennia comes with a Twisted-based webserver which is currently operating on the <em>Portal</em> level. This has the advantage of not being affected by Server-reboots. The drawback is however that being in a different process from the main Server, accessing the database and notably its server-side caches becomes a problem - changing the database from the Portal side does not automatically update the caches on the Server side, telling them that the database has changed. Also writing to the database from two processes may introduce race conditions.</p>
|
||||
<p>For our simple default setup (like a website just listing some database statistics) this is not a terrible problem, but as more users start to use Evennia, there is a growing interest in more advanced uses of the webserver. Several developers want to use the webserver to build game-related rich website experiences for their games - online character generation, tie-in forums and things like that. Out-of-sync caches then becomes a real concern.</p>
|
||||
<p>One way around this could be to implement a framework (such as memcached) for homogenizing caches across all Evennia processes. After lots of IRC discussions I'm going with what seems to be the more elegant and clean solution though - moving the webserver into the <em>Server</em> process altogether. The <em>Portal</em> side will thus only hold a web proxy and the webclient protocol. This way all database access will happen from the same process simplifying things a lot. It will make it much easier for users to use django to create rich web experiences without having to worry about pesky behind the scenes things like caches and the like.</p>
|
||||
<h3>Out-of-band communication</h3>
|
||||
<p>This has been "brewing" for quite some time, I've been strangely unmotivated to finalize it. Out of band communication means the MUD client can send and receive data to/from the server directly, without the player having to necessesarily enter an active command or see any immediate effect. This could be things like updating a health bar in a client-side GUI, redirect text to a specific client window but also potentially more advanced stuff. I created the Evennia-side oob-handler over Christmas; it allows for client sessions to "sign up" for "listening" to attribute updates, do scheduled checks and so on. It's already in the codebase but is not activated nor tested yet.</p>
|
||||
<p>On the protocol side (for serializing data to the client) I have a MSDP implementation ready for telnet subnegotiation, it should be simple to add also GMCP once everything is tested. A JSON-based side channel for the webclient is already in place since a long time if I remember correctly, it just need to be connected to the server-side oob-handler once that's finished.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
869
devblog/2014.html
Normal file
869
devblog/2014.html
Normal file
|
|
@ -0,0 +1,869 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<title>Devblog: Evennia Python MUD/MU creation system</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../images/favicon.ico">
|
||||
<link rel="stylesheet" href="../stylesheets/styles.css">
|
||||
<link rel="stylesheet" href="../stylesheets/pygment_trac.css">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open Sans' rel='stylesheet'>
|
||||
<link href='https://fonts.googleapis.com/css?family=Arvo' rel='stylesheet'>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="Evennia is a modern Python library and server for creating text-based multi-player games and virtual worlds (also known as MUD, MUSH, MU, MUX, MUCK, etc). While Evennia handles all the necessary things every online game needs, like database and networking, you create the game of your dreams by writing normal Python modules.">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js">
|
||||
</script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<p>
|
||||
<img class="logo" src="../images/evennia_logo.png" alt="Evennia logo">
|
||||
</p>
|
||||
<h1 class="header">Evennia</h1>
|
||||
<p class="header header-text">The Python MU* Development Library</p>
|
||||
<div class="linksection">
|
||||
<ul>
|
||||
<div class="buttonsection">
|
||||
<li>
|
||||
<a class="buttons" href="https://www.evennia.com">Back to Evennia</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="devblog-calendar">
|
||||
<ul>
|
||||
|
||||
<li><a href="2021.html">2021 (2)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2020.html">2020 (3)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2019.html">2019 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2018.html">2018 (4)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2017.html">2017 (6)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2016.html">2016 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2015.html">2015 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2014.html">2014 (7)
|
||||
|
||||
<ul class="devblog-calendar-open">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2013.html">2013 (5)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2012.html">2012 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<section>
|
||||
<h1>
|
||||
<a name="evennia-mudmu-creation-system" class="anchor" href="#evennia-mudmu-creation-system">
|
||||
<span class="octicon octicon-link">
|
||||
</span>
|
||||
</a>Evennia Dev Blog<div class="sponsor">
|
||||
<div class="sponsor-column">
|
||||
<a href="https://www.patreon.com/griatch">
|
||||
<img class="patreon" src="../images/evennia_patreon_100x100.png" alt="Patreon">
|
||||
</a>
|
||||
<p>
|
||||
<a href="https://www.paypal.me/GriatchEvennia">
|
||||
<img class="paypal" src="../images/btn_donateCC_LG.gif" alt="Paypal donate">
|
||||
</a>
|
||||
</div>
|
||||
</h1>
|
||||
|
||||
<em>Various Evennia- and MUD-related musings by Griatch, the Evennia lead developer.</em>
|
||||
|
||||
|
||||
|
||||
<div class="blog_post">
|
||||
<h1 id=2014-10-02-slowly-moving-through-town>
|
||||
Slowly moving through town
|
||||
<a class="devblog-headerlink" href="2014.html#2014-10-02-slowly-moving-through-town" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- October 2, 2014</div>
|
||||
</h1>
|
||||
<p><a href="https://4.bp.blogspot.com/-LEAcNfC4EmQ/VC1ySqlz7cI/AAAAAAAAEO4/yVEgs7T6jlo/s1600/Grapevinesnail_01.jpg"><img src="https://4.bp.blogspot.com/-LEAcNfC4EmQ/VC1ySqlz7cI/AAAAAAAAEO4/yVEgs7T6jlo/s1600/Grapevinesnail_01.jpg" alt="" /></a></p>
|
||||
<p>After getting questions about it I recently added the <a href="https://github.com/evennia/evennia/blob/master/contrib/slow_exit.py">Slow Exit contribution</a> to the main repository as an example.</p>
|
||||
<p>Delayed movement is something often seen in various text games, it simply means that the time to move from room to room is artificially extended.</p>
|
||||
<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>
|
||||
</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>
|
||||
<p>An Exit in Evennia is a persistent Object sitting in a room. The Exit class is just like any Object except for two things - it stores a "destination" property and it houses a CommandSet on itself. This particular CommandSet holds a single command with the same name as the Exit object.</p>
|
||||
<p>Commands and CommandSets are things <a href="http://evennia.blogspot.se/2012/08/taking-command.html">I've covered in earlier blog posts</a>. Suffice to say is that any number of command sets can be merged together dynamically to at any moment represent the commands available to the Character at any given time or situation.</p>
|
||||
<p>What happens when an Exit bject is in the same room as a Character is that the Exit's command set is dynamically merged with that of the Character. This means a new command - which always has the same name as the Exit - becomes available. The result is that if the Exit object is called "south", the Character can use the command "south". By default all the command does is to call a hook method on the Exit object. This hook hooks simply moves the calling Character to the "destination" stored by the Exit. Done!</p>
|
||||
<p>The nice thing with this is that the whole system is implemented without any special cases or custom hard-wired code. It also means that the entire Exit system can be changed and modified without ever touching Evennia's core.</p>
|
||||
<h4>Delaying Exits</h4>
|
||||
<p>To delay the traversal, the principle is simple - after the Exit command has triggered, wait for a little while before continuing.</p>
|
||||
<p>Technically we define a new class of Exit, let's call it SlowExit, inheriting from the default Exit. We locate the spot where the Exit normally sends traversing objects on their way (this is a method called move_to()).</p>
|
||||
<p>Since Evennia is based on Twisted, we use Twisted's intrinsic CallLater() function to delay the move for as many seconds we desire (in the contrib I use a thin wrapper around CallLater called delay()). The result is that the command is called, you get a little text saying that you have started moving ... and a few seconds later you actually move.</p>
|
||||
<p>Once one understands how Exits work it's really quite straight forward - see the <a href="https://github.com/evennia/evennia/blob/master/contrib/slow_exit.py">code on github</a> for more details (it's got plenty of comments).</p>
|
||||
<p>In the contrib are also some example utility commands for setting one's movement speed and to abort movement if you change your mind before the timeout has passed.</p>
|
||||
<p>This simple start can easily be expanded as befits each individual game. One can imagine introducing anything from stamina costs to make travel time be dynamically calculated based on terrain or other factors.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2014-08-04-dance-my-puppets>
|
||||
Dance my puppets
|
||||
<a class="devblog-headerlink" href="2014.html#2014-08-04-dance-my-puppets" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- August 4, 2014</div>
|
||||
</h1>
|
||||
<p><a href="http://upload.wikimedia.org/wikipedia/commons/thumb/7/70/5016_-_Archaeological_Museum,_Athens_-_Dolls_-_Photo_by_Giovanni_Dall%27Orto,_Nov_13_2009.jpg/374px-5016_-_Archaeological_Museum,_Athens_-_Dolls_-_Photo_by_Giovanni_Dall%27Orto,_Nov_13_2009.jpg"><img src="https://lh3.googleusercontent.com/proxy/hraqnaf9pLN_5rYSN5vnqysZwOaipiA32vImwp1-TWic6HtbYxqlwtRLjJgl9WQd6IY0TsCGPiPaEw8HEEgcxx_yy9S3E3KRKRk0Ksdm50RDLgAtNaftkVdS2EGU0nuOqdIeUHIWmijKMWNtknEj7891LEFUgjaTDCcsvenRq7f3032soPG_mfUz5bXw7PMGiyQd42PSnvbBh4ufwvzvlQZp-93GVKsTH40MN5vgQm0SfEDVp4fNY49Yyo16MLMQM5MVEfWA9EKmy_HxCPwX07NmWLwIRbRD1_q821tQXDaYeJzzj40If2hJrB1EKPTzo41A7HKfsPbRnla48S9wtqcny_kTO88AdcF1=s0-d" alt="" /></a></p>
|
||||
<p>In many traditional multiplayer text engines for MUD/MUSH/MU*, the player connects to the game with an account name that also becomes their character's in-game name. When they log into the game they immediately "become" that character. If they want to play with another character, they need to create a new account.</p>
|
||||
<p>A single-login system is easy to implement but many code bases try to expand with some sort of "account system" where a single login "account" will allow you to manage one or more game characters. Matthew “Chaos” Sheahan beautifully argues for the benefits of an account system in the April issue of <a href="http://journal.imaginary-realities.com/volume-06/issue-01/index.html">Imaginary Realities</a>; you can read his article <a href="http://journal.imaginary-realities.com/volume-06/issue-01/your-mud-should-have-an-account-system/index.html">here</a>.</p>
|
||||
<h3>Evennia and account systems</h3>
|
||||
<p>First a brief show of how Evennia handles this. We use the following separation:</p>
|
||||
<p><strong>Session(s) <-> Player <-> Objects/Characters(s)</strong></p>
|
||||
<p>The <em>Session</em> object represents individual client connections to Evennia. The <em>Player</em> is our "account" object. It holds the password hash and your login name but has no in-game existence. Finally we have <em>Objects</em>, the most common being a subclass of Object we call <em>Character.</em> Objects exist in the game. They are "puppeted" by Sessions via the Player account.</p>
|
||||
<p>From this separation an account system follows naturally. Evennia also offers fully flexible puppeting out of the box: Changing characters (or for staff to puppet an NPC) is simply a matter of "disconnecting" from one Character and connecting to another (presuming you have permission to do so).</p>
|
||||
<h3>The Multisession modes of Evennia</h3>
|
||||
<p>This is the main gist of this entry since we just added another of these (mode 3). Evennia now offers four different <em>multisession modes</em> for the game designer to choose between. They affect how you gamers may control their characters and can be changed with just a server reload.</p>
|
||||
<h4>Mode 0</h4>
|
||||
<p>This is emulates the "traditional" mud codebase style. In mode 0 a Session controls one Character and one character only. Only one Session per account is allowed - that is, if a user try to connect to their Player account with a different client the old connection will be disconnected. In the default command set a new Character is created with the same name as the Player account and the two are automatically connected whenever they log in. To the user this makes Player and Character seem to be virtually the same thing.</p>
|
||||
<h4>Mode 1</h4>
|
||||
<p>In this mode, multiple Sessions are allowed per Player account. You still only have one Character per account but you can control that Character from any number of simultaneously connected clients. This is a requirement from MUSHes and some slower-moving games where there are communities of gamers who want to conveniently track the progress of the game continuously on multiple clients and computers.</p>
|
||||
<h4>Mode 2</h4>
|
||||
<p>In multisession mode 2, multiple Characters are allowed per Player account. No Characters are created by default in this mode, rather the default command set will drop you to a simplified OOC management screen where you can create new characters, list the ones you already have and puppet them. This mode offers true multiplaying, where you can connect via several clients simultaneously, each Session controlling a different Character.</p>
|
||||
<h4>Mode 3</h4>
|
||||
<p>This mode allows gamers not only to play multiple Characters on the same Player account (as in mode 2) but to also connect <em>multiple Sessions to each Character.</em> This is a multi-character version of Mode 1, where players can control the same Character via Player logins from several different clients on different machines in any combination.</p>
|
||||
<p>It's interesting that some of these modes may seem silly or superfluous to people used to a certain type of MU* yet are killer features for other communities. It goes to show how different the needs are for users of different game styles.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2014-06-30-webby-stuff>
|
||||
Webby stuff
|
||||
<a class="devblog-headerlink" href="2014.html#2014-06-30-webby-stuff" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- June 30, 2014</div>
|
||||
</h1>
|
||||
<p><a href="https://3.bp.blogspot.com/-82MT42ksmuU/U7FpMy-LgGI/AAAAAAAADqA/ok6MfvNNTvY/s1600/spiderweb.jpg"><img src="https://3.bp.blogspot.com/-82MT42ksmuU/U7FpMy-LgGI/AAAAAAAADqA/ok6MfvNNTvY/s1600/spiderweb.jpg" alt="" /></a></p>
|
||||
<p>Latest Evennia come with a range of improvements, mainly related to its integration with the web.</p>
|
||||
<h3>New and improved ways to expand the website/webclient</h3>
|
||||
<p>Thanks to the work of contributor Kelketek, Evennia's Django-based web system (website and webclient) has been restructured to be much easier to expand. Previously you had to basically copy the entire web/ folder into your game and modify things in-place. This was not ideal since it made it inherently harder to update when things changed upstream. Now Evennia makes use of Django's <em>collectstatic</em> functionality to allow people to plugin and overload only the media files and templates that they need. Kelketek wrote a new and shiny <a href="https://github.com/evennia/evennia/wiki/Web%20Tutorial">web tutorial</a> explaining just how things work.</p>
|
||||
<h3>Websocket-based webclient with OOB</h3>
|
||||
<p>Evennia's webclient was an ajax-based one using a long polling ("comet") paradigm to work. These days all modern browsers support <a href="http://en.wikipedia.org/wiki/WebSocket">websockets</a> though, a protocol that allows asynchronous server-client communication without the cludgery of long polling. So Evennia's new webclient will now use websockets if the browser supports it and fall back to the old comet client if it does not.</p>
|
||||
<p>The new client also has full support for OOB (Out-of-band) communication. The client uses JSON for straight forward OOB messaging with the server. As part of this, I had an excuse to go back to clean up and make the OOB backbone of Evennia more complete. The server-side oob commands are borrowed from <a href="http://tintin.sourceforge.net/msdp/">MSDP</a> but the server side is of course independent of communication protocol (so webclient and telnet extensions can call the same server-side callbacks). I've not yet finalized the documentation for how to use the OOB yet, that will come soon-ish.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2014-06-15-bringing-back-python-memory>
|
||||
Bringing back Python memory
|
||||
<a class="devblog-headerlink" href="2014.html#2014-06-15-bringing-back-python-memory" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- June 15, 2014</div>
|
||||
</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>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>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>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2014-05-16-imaginary-realities-volume-6,-issue-1>
|
||||
Imaginary Realities volume 6, issue 1
|
||||
<a class="devblog-headerlink" href="2014.html#2014-05-16-imaginary-realities-volume-6,-issue-1" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- May 16, 2014</div>
|
||||
</h1>
|
||||
<p><a href="http://imaginary-realities.disinterest.org/pics/logo_new.gif"><img src="https://lh4.googleusercontent.com/proxy/CEw97RBnw7FiR_z7fqlj9ELtwgDU-knwkyiW8Ybjg9tjTUAerwxQ0-omUEwpZAz4jKP1ozmnCLHPBh1A4QxrGZzYD3DEFfIdTReu0TTPJwo=s0-d" alt="" /></a></p>
|
||||
<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>
|
||||
</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>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2014-02-08-moving-from-google-code-to-github>
|
||||
Moving from Google Code to Github
|
||||
<a class="devblog-headerlink" href="2014.html#2014-02-08-moving-from-google-code-to-github" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- February 8, 2014</div>
|
||||
</h1>
|
||||
<p><a href="https://1.bp.blogspot.com/-O_mHSjm4u90/UvVmXrY3kkI/AAAAAAAACJc/5bREd9YEbLU/s1600/ar12943602961303.jpg"><img src="https://1.bp.blogspot.com/-O_mHSjm4u90/UvVmXrY3kkI/AAAAAAAACJc/5bREd9YEbLU/s1600/ar12943602961303.jpg" alt="" /></a></p>
|
||||
<p>A few weeks back, the Evennia project made the leap from Google Code to GitHub (<a href="https://github.com/evennia/evennia">here</a>). Things have been calming down so it's time to give a summary of how the process went.</p>
|
||||
<p>Firstly I want to say that I liked Google Code. It did everything expected of it with little hassle. It had a very good Issue system (better than GitHub in my opinion) and it allowed us to use Mercurial instead of Git for version control (I just happen to like Mercurial better than Git, so sue me). Now, GitHub is getting to be something of a standard these days. But whereas our users have occationaly inquired about us making the move, I've been reluctant to do so.</p>
|
||||
<p>The problem I <em>did</em> have with Google Code was that I got the increasing feeling that Google didn't care all that much about it. It worked decently, but it was not really going anywhere either. What finally made me change my mind though was an event just after summer last year. There was a bug in Google Code that made the links to online clones disappear. It was worse than that - creating new online clones of the main repo didn't work - people wanting to contribute using a clone just couldn't.</p>
|
||||
<p>This is extremely critical functionality for a code-sharing website to have! I made a bug report and many other projects chimed in seeing the same issues. Eventually the links returned and everything worked the way it had. But it took <em>several months</em> before this critical bug was fixed. Even then Google didn't even bother to close my issue. This suggested quite strongly to me that Google Code is not really a priority even for its parent company. It was time to consider a move.</p>
|
||||
<p>I was never personally a fan of Git. It is undoubtedly powerful, but I always felt its syntax way too archaic and the number of ways to shoot yourself in the foot way too many. But I do like GitHub better than BitBucket (I've used both in other projects), so that's where we nevertheless were heading.</p>
|
||||
<p>Already last year I created an Evennia "organization" on GitHub and one of our users first helped to set up a Git Mirror of our Mercurial repo. The idea was a good one - have a mirror on GitHub, allowing the transition to be more gradual. In the end this didn't work out though - there were some issue with the hg-git conversion and the mirror never didn't actually update. When I checked back and it was three months behind we just removed that first ill-fated version.</p>
|
||||
<p>In the end I decided to not fiddle about with it, but to move everything over in one go.</p>
|
||||
<h3>Converting the repository</h3>
|
||||
<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>
|
||||
</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>
|
||||
<p>Evennia's wiki consitutes our documentation, it's some 80+ pages or so by now. Definitely not something we want to loose. Google Code use a dialect of MediaWiki whereas GitHub's wiki supports a few other formats, like markdown or reST. I needed to convert between them.</p>
|
||||
<p>Digging around a bit I found <a href="https://github.com/trentm/googlecode2github.git">googlecode2github</a>. This download contains python scripts for converting the wiki as well as Issues. I didn't really get the issues-converter to work, so I had to find another solution for that (see next section).</p>
|
||||
<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>
|
||||
<pre><code>
|
||||
{{{
|
||||
|
||||
<verbatim code>
|
||||
|
||||
}}}
|
||||
|
||||
</code></pre>
|
||||
<p>In markdown, code blocks are created just by indenting the block by four spaces. The converter dutifully did this - but it didn't add empty lines above and below the block, which is another thing markdown requires. The result was that all code ended up mixed into the running text output.</p>
|
||||
<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>
|
||||
<pre><code>
|
||||
```python
|
||||
|
||||
|
||||
|
||||
<verbatim code>
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
||||
</code></pre>
|
||||
<p>This is apparently "GitHub-flavoured" markdown. So another stint into all the pages followed, to update everything for prettiness.</p>
|
||||
<h3>Converting Google Code Issues</h3>
|
||||
<p>I didn't want to loose our Issues from Google Code. I looked around a bit and tested some conversions for this (it helps to be able to create and delete repos on GitHub with abandon when things fail). I eventually settled on <a href="https://github.com/arthur-debert/google-code-issues-migrator">google-code-issues-migrator</a>.</p>
|
||||
<p>This is a Python script that gathers all the Issues from a given Google Code project. It then uses GitHub's API to re-post the issues. It retains the issue numbers and re-maps the Google Code Issue tags to GitHub's equivalent. It didn't retain most other formatting and whereas I ended up as the creator of all issues, the converter included the name of the original author as well as a link back to the original Google Code one. I found that to be quite sufficient for our needs.</p>
|
||||
<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>
|
||||
</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>
|
||||
</ul>
|
||||
<p>All this done, the modified IRC announcement works well.</p>
|
||||
<h3>Closing the book on Google Code</h3>
|
||||
<p>At this point all the critical things were moved over. So after some heads-up warnings on the mailing list (and users helping to rewrite our documentation to use Git instead of mercurial) we eventually made the official move.</p>
|
||||
<p>One thing I really dislike is when a project switches hosts and don't let users know about it in their revision history. So I made a mercurial-only last commit announcing that the repo is closed and giving the link to the new one.</p>
|
||||
<p>The Google Code page doesn't go anywhere, but I changed the front page to point to GitHub instead. I even made an issue in the Issue tracker with a title telling people not to use that tracker anymore. Finally I re-pointed all the links on <a href="http://www.evennia.com/">http://www.evennia.com</a> to GitHub and made a mailing list posting. Move was officially complete.</p>
|
||||
<h3>Converting the Wiki, part 2</h3>
|
||||
<p>At this point were were officially moved over and I started to look into getting fancy with our documentation. We have for the longest time made automated translations of our wiki for compiling by <a href="https://readthedocs.org/projects/evennia/">ReadTheDocs</a>.</p>
|
||||
<p>Getting Google Code's special wikimedia syntax into reST (that ReadTheDocs uses) used to mean jumping through a few hoops. My hackish solution worked in two steps. First a custom python script (whose originating url I can no longer find, sorry) converted the Google Code wiki to HTML. Once this was done, <a href="http://johnmacfarlane.net/pandoc/">pandoc</a> converted the files from HTML to reST. The result was ... acceptable. There were some minor issues here and there but mostly the result was readable.</p>
|
||||
<p>I figured that converting from the more standard Markdown of the GitHub wiki to reST should be a breeze by comparison. Not so.</p>
|
||||
<p>The first hurdle was that the version of pandoc coming with my Linux distribution was too old to support Github-flavoured markdown syntax. I knew from before that Pandoc worked so I didn't want to start with something else. I had to download the several hundred MBs needed by the Haskell build environment and their package manager in order to get and compile all the dependencies and finally the latest version of pandoc. To their credit it was all a very streamlined experience, it just took quite some time.</p>
|
||||
<p>The second hurdle came when finally looping pandoc to convert all wiki files. It turns out to be that the [[Text on page|address]] syntax I had manually corrected earlier is a special syntax offered by <em>Gollum,</em> the engine powering GitHub's wiki behind the scenes. None of the markdown-to-reSt converters I looked at (pandoc or otherwise) even recognized this syntax as a link at all. As it turns out, normal markdown actually expects its links in the format <a href="address">Text on page</a>.</p>
|
||||
<p>I was not going to go through and edit all those pages <em>again.</em> So my next step was to write a script to scan and replace all the [[...|...]] syntax in our wiki and replace it with the standard markdown one. After this the markdown files converted to reST quite nicely -- formatting-wise they look much better than the old wiki to HTML to reST chain I had to use from Google Code.</p>
|
||||
<p>Problem was that when compiling these reST pages into HTML with Sphinx, no links worked.</p>
|
||||
<p>Each individual page looked okay, just that the links were not pointing to anything reasonable. In retrospect this was not so strange. Pandoc knows nothing about the relationships between files, and clearly the simple naming scheme used for addresses is something the wiki softwares knows and Sphinx does not.</p>
|
||||
<p>Some thinking lead to a custom Python script for renaming the link targets in the converted pages to their html page name. This needed to handle the fact that wiki links also allows whitespace. So the [Start](Getting Started) link would be converted to <a href="GettingStarted.html">Start</a>, which seems to be the format with which Sphinx will generate its pages.</p>
|
||||
<p>One also needs to have a "toc" (Table of Contents) to tie all those pages together for the benefit of Sphinx. I just used a "hidden" toc, letting my converter script add this to the bottom of my normal index file. As long as it's included <em>somewhere,</em> Sphinx will be happy.</p>
|
||||
<p>Originally I put the reST files in a subfolder of the GitHub wiki repo, I thought I could just point ReadTheDocs to that repo later. The GitHub wiki has a strange "feature" though. It seems to pick its wiki pages from <em>wherever</em> they are in the repo, no matter if they are in the root or in subfolders. Suddenly I was starting to see reST-style pages appear in the online wiki, and sometimes I would get the markdown version (the two would go out of sync). Very strange and confusing.</p>
|
||||
<p>Since the files clearly "polluted" our wiki, I had to move the converted reST files to a separate branch of the wiki repository. This has the advantage of keeping all the support scripts and converter mechanisms separate from the normal wiki content. ReadTheDocs can luckily be set to read its information from another branch than master, so finally the latest converted wiki can again be read there!</p>
|
||||
<p>That concludes what I think was the last main conversion effort. Phew!</p>
|
||||
<h3>Impressions so far</h3>
|
||||
<p>GitHub is nice. The merge requests and easy way to comment on them are really good. Since people are more familiar with using GitHub overall, it does seem to be a shorter step for people to make a fork and contribute small things. Doing the same in Google Code was probably not harder per se, just something less people were previously familiar with.</p>
|
||||
<p>Due to the modular way Evennia is structured, people are recommended to make a fresh clone of the new Git repo and simply copy their plugin source files and database back into it. So far this seems to have gone smoothly.</p>
|
||||
<p>The GitHub issue tracker is worse than the Google Code one. It has no good way to order Issues or list them in a more compact form (nor in a matrix). Not having good issue templates is really limiting; having to reply to issues only to ask for basic info they should include in their issue is an unnecessary time sink.</p>
|
||||
<p>I also find that there is no clear way to announce an issue change (like "Needing more information"). Tags work partly for this, but setting them is not announced anywhere as far as I can tell - they are just there.</p>
|
||||
<p>Most things also takes so much spaaace. Overall GitHub seems designed for people with big monitors. I have those, but most of the time I prefer working on my laptop. I'm sure it's a matter of habit, but Google Code is very compact by comparison. It gave a lot better overview of things. On GitHub I have to scroll everywhere and this is true both in the repo view, wiki and issues.</p>
|
||||
<p>These small quips nonwithstanding, I think this move will serve us well. There is a good wibe of development and continuing improvement going on at GitHub. There's plenty of help and tutorials all over. Since so many people are using GitHub, problems are more likely to have been answered before. And of course we hope this will in effect help more people find Evennia and join the fun.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2014-01-24-looking-forwards-and-backwards>
|
||||
Looking forwards and backwards
|
||||
<a class="devblog-headerlink" href="2014.html#2014-01-24-looking-forwards-and-backwards" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- January 24, 2014</div>
|
||||
</h1>
|
||||
<p><a href="https://2.bp.blogspot.com/-wjnGsBNyUqg/UuLtTZAo_II/AAAAAAAACJE/vYvxUE0zIpw/s1600/1390625062_binoculars.png"><img src="https://2.bp.blogspot.com/-wjnGsBNyUqg/UuLtTZAo_II/AAAAAAAACJE/vYvxUE0zIpw/s1600/1390625062_binoculars.png" alt="" /></a></p>
|
||||
<p>We are almost a month into the new year, time to look forward.</p>
|
||||
<p>But first a look backwards. The year of 2013 was a year of big development projects and lots of quiet in the main repository in between. Two major updates were released during the year.</p>
|
||||
<p>The first update, the "many sessions per player" update, originated in a feature request that I thought would be easy to implement but which led to far-ranging changes (and honestly, improvements) to how Players and Sessions interconnect. It was a <em>lot</em> more more work than I anticipated.</p>
|
||||
<p>The second update was about moving Evennia's web server from the Portal level into the Server-level. The actual moving of the server was actually considerably easier than I thought it would be. But it turned out that a truckload of other things came along with it. Not only did the cache system have to change in order to accommodate the new webs erver, I had to also finalize the Out-of-band structure, since this made use of the cache system. And while I were at it, other fixes were done and ... the update grew and grew. When it finally merged late last year it closed plenty of issues, but it would probably have been better to structure it into more, small updates instead.</p>
|
||||
<p>Anyway, 2014 promises continued (and hopefully more continuous and gradual) development of Evennia. The closest upcoming upheaval is our move from Google Code to GitHub in a few days (I'll probably do a blog about that once it's done). Apart from that we are currently in a fixing state, cleaning up and fixing remnant issues from the big mergers.</p>
|
||||
<p>Another Issue of the MUD e-zine <a href="http://journal.imaginary-realities.com/volume-05/issue-01/index.html">Imaginary Realities</a> is coming too. I just contributed with an Evennia-related article. If anyone reading this blog has anything MUD-related to write about, do consider <a href="http://posted-stuff.blogspot.se/2013/12/write-article-for-imaginary-realities.html">contributing</a> before January 31, they need more articles! I don't think you need to be too advanced, anything from a mud-development anecdote to retells of good MUD gaming memories might be interesting I would think.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
1106
devblog/2015.html
Normal file
1106
devblog/2015.html
Normal file
File diff suppressed because it is too large
Load diff
839
devblog/2016.html
Normal file
839
devblog/2016.html
Normal file
|
|
@ -0,0 +1,839 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<title>Devblog: Evennia Python MUD/MU creation system</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../images/favicon.ico">
|
||||
<link rel="stylesheet" href="../stylesheets/styles.css">
|
||||
<link rel="stylesheet" href="../stylesheets/pygment_trac.css">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open Sans' rel='stylesheet'>
|
||||
<link href='https://fonts.googleapis.com/css?family=Arvo' rel='stylesheet'>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="Evennia is a modern Python library and server for creating text-based multi-player games and virtual worlds (also known as MUD, MUSH, MU, MUX, MUCK, etc). While Evennia handles all the necessary things every online game needs, like database and networking, you create the game of your dreams by writing normal Python modules.">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js">
|
||||
</script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<p>
|
||||
<img class="logo" src="../images/evennia_logo.png" alt="Evennia logo">
|
||||
</p>
|
||||
<h1 class="header">Evennia</h1>
|
||||
<p class="header header-text">The Python MU* Development Library</p>
|
||||
<div class="linksection">
|
||||
<ul>
|
||||
<div class="buttonsection">
|
||||
<li>
|
||||
<a class="buttons" href="https://www.evennia.com">Back to Evennia</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="devblog-calendar">
|
||||
<ul>
|
||||
|
||||
<li><a href="2021.html">2021 (2)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2020.html">2020 (3)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2019.html">2019 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2018.html">2018 (4)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2017.html">2017 (6)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2016.html">2016 (7)
|
||||
|
||||
<ul class="devblog-calendar-open">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2015.html">2015 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2014.html">2014 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2013.html">2013 (5)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2012.html">2012 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<section>
|
||||
<h1>
|
||||
<a name="evennia-mudmu-creation-system" class="anchor" href="#evennia-mudmu-creation-system">
|
||||
<span class="octicon octicon-link">
|
||||
</span>
|
||||
</a>Evennia Dev Blog<div class="sponsor">
|
||||
<div class="sponsor-column">
|
||||
<a href="https://www.patreon.com/griatch">
|
||||
<img class="patreon" src="../images/evennia_patreon_100x100.png" alt="Patreon">
|
||||
</a>
|
||||
<p>
|
||||
<a href="https://www.paypal.me/GriatchEvennia">
|
||||
<img class="paypal" src="../images/btn_donateCC_LG.gif" alt="Paypal donate">
|
||||
</a>
|
||||
</div>
|
||||
</h1>
|
||||
|
||||
<em>Various Evennia- and MUD-related musings by Griatch, the Evennia lead developer.</em>
|
||||
|
||||
|
||||
|
||||
<div class="blog_post">
|
||||
<h1 id=2016-11-30-birthday-retrospective>
|
||||
Birthday retrospective
|
||||
<a class="devblog-headerlink" href="2016.html#2016-11-30-birthday-retrospective" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- November 30, 2016</div>
|
||||
</h1>
|
||||
<p><a href="https://4.bp.blogspot.com/-pW3nsIxgroY/WDDFXo3z2dI/AAAAAAAAEs8/n9ehRTZrlggiEIOMGZupSVFxYa7DSGsZgCPcB/s1600/evennia_logo_festive_small.png"><img src="https://4.bp.blogspot.com/-pW3nsIxgroY/WDDFXo3z2dI/AAAAAAAAEs8/n9ehRTZrlggiEIOMGZupSVFxYa7DSGsZgCPcB/s200/evennia_logo_festive_small.png" alt="" /></a></p>
|
||||
<p>So, 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">Guild Wars</a> MMORPG and Greg's <a href="https://groups.google.com/forum/#%21category-topic/evennia/evennia-news/5hQTspfWd_Q">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/#%21category-topic/evennia/evennia-news/CJ52R4Ws0OM">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.</p>
|
||||
<p>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/">pymoo</a> before asking myself why I was going through the trouble of parsing a custom script language <em>... in Python</em> ... Why not use Python throughout? This is when I came upon Evennia. I started <a href="https://groups.google.com/forum/#%21category-topic/evennia/evennia-news/yfR0GLKGhJA">making contributions</a> and around 2010 I <a href="https://groups.google.com/forum/#%21category-topic/evennia/evennia-news/zXsA2PaWUoU">took over the development</a> as real life commitments forced Greg to step down.</p>
|
||||
<p>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">extensive documentation</a>).</p>
|
||||
<p>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.</p>
|
||||
<p>Back in the day you were also expected to create your own game in a folder game/ 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.</p>
|
||||
<p>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">Openhub</a> lists us as</p>
|
||||
<blockquote>
|
||||
<p>"<em>A mature, well-established codebase with a stable commit history, a large development team and very well documented source code</em>".</p>
|
||||
</blockquote>
|
||||
<p>It's just words compiled by an algorithm, but they still feel kinda good!</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>The first active "game" may have been an Evennia game/chat supporting the Russian version of 4chan... The community driven Evennia demo-game <a href="http://ainneve.evennia.com/">Ainneve</a> 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. That said, the Evennia-game <a href="http://games.evennia.com/game/arx">Arx, After the Reckoning</a> is progressing through beta at a good clip and is showing all signs of becoming the first full-fledged released Evennia game.</p>
|
||||
<p>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.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2016-10-13-season-of-fixes>
|
||||
Season of fixes
|
||||
<a class="devblog-headerlink" href="2016.html#2016-10-13-season-of-fixes" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- October 13, 2016</div>
|
||||
</h1>
|
||||
<p><a href="https://2.bp.blogspot.com/-WRQkMo7-t8o/V_931Qgj7bI/AAAAAAAAEq4/GN2_I60bzdQGpgqJ_Brl-dFnmxK_2QsiACPcB/s1600/New_hampshire_in_autumn.jpg"><img src="https://2.bp.blogspot.com/-WRQkMo7-t8o/V_931Qgj7bI/AAAAAAAAEq4/GN2_I60bzdQGpgqJ_Brl-dFnmxK_2QsiACPcB/s320/New_hampshire_in_autumn.jpg" alt="" /></a></p>
|
||||
<p>The last few months has been dominated by bug-fixing and testing in Evennia-land. A lot more new users appears to be starting to use Evennia, especially from the <a href="https://en.wikipedia.org/wiki/MUSH">MUSH</a> world where the Evennia-based <em><a href="http://play.arxgame.org/">Arx, After the Reckoning</a></em> is, while still in alpha, currently leading the charge.</p>
|
||||
<p>With a new influx of users comes the application of all sorts of use- and edge-cases that stretch and exercise the framework in all the places where it matters. There is no better test of code than new users trying to use it unsupervised! Evennia is holding up well overall but there are always things that can be improved.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>I reworked the way on-object Attributes was cached (from a stupid but simple way to a lot more sophisticated but harder way) and achieved three times faster performance in certain special cases people had complained about. Other issues also came to view while diving into this, which could be fixed.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I reworked the venerable batch command and batchcode processors (these allow to create a game world from a script file) and made their inputs make more sense to people. This was one of the older parts of Evennia and apart from the module needing a big refactoring to be easier to read, some parts were pretty fragile and prone to break. Especially when passing it file names tended to be confusing since it understood only certain relative paths to the files to read in and not even I could remember if one should include the file ending or not. This was cleaned up a lot.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Lots of changes and updates were made to the RPSystem contrib, which optionally adds more advanced roleplaying mechanics to Evennia. The use of this in Evennia's demo game (<a href="https://github.com/evennia/ainneve">Ainneve</a>, being separately developed) helps a lot for ironing out any remaining wrinkles.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Lots and lots of other fixes and smaller feature updates were done (About <a href="https://www.blogger.com/goog_1124770844"></a><a href="https://github.com/evennia/evennia/commits/master">150 commits and 50 Issues</a> closed since end of summer).</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>A fun thing with a growing user base is that we are also starting to see a lot more Pull requests and contributions. Thanks a lot, keep 'em coming!</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Map system contrib (merged), for creating a world based on ASCII map. Talking about maps, users contributed not just one but two new tutorials for implementing both static and dynamic maps with Evennia.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Webclient notifications (pending), for making the webclient show us in a clearer way when it gets updated in a different tab. A more advanced implementation awaits the webclient being expanded with a proper client-side option window; there is currently a feature request for this if anyone's interested in taking it on.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>AI system contrib (pending). This is a full AI backend for adding complex behaviors to game agents. It uses Behavioral trees and is designed to be modified both in code and from inside the game.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Action system contrib (pending). This contrib assigns the actions of Characters a time cost and delays the results of commands the given time. It also allows players to go into turn-based mode to enforce a strict action order.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><em>Lots</em> of now closed PRs were contributed by the Arx lead developer to fix various bugs and edge-cases as they came up in live use.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>The fixing and tightening of the nuts and bolts will likely continue the remainder of the year. I'm currently working on a refactoring of the way command sets are merged together (see the end of my <a href="http://evennia.blogspot.se/2016/05/evennia-in-pictures.html">blog post on Evennia in pictures</a> for a brief summary of the command system). But with so much new blood in the community, who can tell where things will turn from here!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2016-07-01-the-art-of-sharing-nicks-and-descriptions>
|
||||
The art of sharing nicks and descriptions
|
||||
<a class="devblog-headerlink" href="2016.html#2016-07-01-the-art-of-sharing-nicks-and-descriptions" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- July 1, 2016</div>
|
||||
</h1>
|
||||
<p><a href="https://3.bp.blogspot.com/-wIhCzMzQyho/V3aDpCR8dEI/AAAAAAAAEog/L8_xmAiXKK8b-42Zoa7t8vjgpIBx1fgnQCLcB/s1600/142455033_49ce50a89b_m.jpg"><img src="https://3.bp.blogspot.com/-wIhCzMzQyho/V3aDpCR8dEI/AAAAAAAAEog/L8_xmAiXKK8b-42Zoa7t8vjgpIBx1fgnQCLcB/s320/142455033_49ce50a89b_m.jpg" alt="" /></a></p>
|
||||
<p>In the month or so since the merger of Evennia's development branch and all its web-client updates, we have been in bug-fixing mode as more people use and stress the code.</p>
|
||||
<p>There have been some new features as well though - I thought it could be interesting to those of you not slavishly following the mailing list.</p>
|
||||
<h3>Shared web login</h3>
|
||||
<p>When you are logged into the website you will now also auto-login to your account in the web client - no need to re-enter the login information! The inverse is also true. You still need to connect to game at least once to create the account, but after that you will stay connected while the browser session lasts.</p>
|
||||
<p>Behind the scenes the shared login uses cookies linked to server-side Django sessions which is a robust and safe way to manage access tokens. Obviously browser sessions are irrelevant to telnet- or ssh connections.</p>
|
||||
<h3>Extended Nicks</h3>
|
||||
<p>Evennia's nick(name) system is a way to create a personal alias for things in game - both to on-the-fly replacing text you input and for referring to in-game objects. In the old implementation this replacement was simply matched from the beginning of the input - if the string matched, it was replaced with the nick.</p>
|
||||
<p>In this new implementation, the matching part can be much more elaborate. For example you can catch arguments and put those arguments into the replacement nick in another order.</p>
|
||||
<p>Let's say we often use the @dig command this limited way:</p>
|
||||
<blockquote>
|
||||
<p><strong>@dig roomname;alias = exit;alias, backexit;alias</strong></p>
|
||||
</blockquote>
|
||||
<p>Let's say we find this syntax unintuitive. The new nick system allows to change this by catching the arguments in your nick and put it into the "real" command. Here is an example of a syntax putting the aliases in parentheses and separating all components with commas:</p>
|
||||
<p><strong>> nick newroom $1($2), $3($4), $5($6) = @dig $1;$2 = $3;$4, $5;$6</strong></p>
|
||||
<p>From here on you can now create your rooms with entries like this:</p>
|
||||
<p><strong>> newroom The great castle(castle), to the castle(castle), back to the path(back)</strong></p>
|
||||
<h3>Multidescer contrib</h3>
|
||||
<p>I have added a new "multidescer" to the contrib folder. A multidescer is (I think) a MUSH term for a mechanism managing more than one description. You can then combine any of these various descriptions into your "active" description.</p>
|
||||
<p>An example of usage:</p>
|
||||
<p><strong>desc hat = a blue hat.</strong></p>
|
||||
<p><strong>desc basic = This is a tall man with narrow features.</strong></p>
|
||||
<p><strong>desc clothing = He is wearing black, flowing robes.</strong></p>
|
||||
<p>These commands store the description on the Character and references them as unique keywords. Next we can combine these strings together in any order to build the actual current description:</p>
|
||||
<p><strong>> desc/set basic + |/ + clothing + On his head he has + hat</strong></p>
|
||||
<p><strong>> look self</strong></p>
|
||||
<p><strong>This is a tall man with narrow features.</strong></p>
|
||||
<p><strong>He is wearing black, flowing robes. On his head he has a blue hat.</strong></p>
|
||||
<p>This allows for both very flexible and easy-to-update descriptions but also a way to handle freeform equipment and clothing. And you can of course use the nick system to pre-format the output</p>
|
||||
<p><strong>> nick setdesc $1 $2 $3 $4 = $1 + |/ + clothing + On his head he has a $4</strong></p>
|
||||
<p>This way you can clothe yourself in different outfits easily using the same output format:</p>
|
||||
<p><strong>> setdesc basic clothing hat</strong></p>
|
||||
<p>The multidescer is a single, self-contained command that is easy to import and add to your game as needed.</p>
|
||||
<p>... There's also plenty of bug fixes, documentation work and other minor things or course.</p>
|
||||
<p>Anyway, summer is now upon us here in the northern hemisphere so things will calm down for a bit, at least from my end. Have a good 'un!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em><p>Image by <a href="https://www.flickr.com/photos/ryanr/142455033">ryancr</a> (released under <a href="https://creativecommons.org/licenses/by-nc/2.0/">Creative Commons</a>)</p>
|
||||
</em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2016-05-31-evennia-in-pictures>
|
||||
Evennia in Pictures
|
||||
<a class="devblog-headerlink" href="2016.html#2016-05-31-evennia-in-pictures" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- May 31, 2016</div>
|
||||
</h1>
|
||||
<p>This article describes the MU* development system <a href="http://www.evennia.com/">Evennia</a> using pictures!</p>
|
||||
<p><em>This article was originally written for <a href="http://www.optionalrealities.com/">Optional Realities</a>.</em></p>
|
||||
<p><em>Since it is no longer available to read on OR, I'm reposting it in full here.</em></p>
|
||||
<h4>Figure 1: The parts of the Evennia library</h4>
|
||||
<p><a href="https://2.bp.blogspot.com/-0-oir21e76k/W3kaUuGrg3I/AAAAAAAAJLU/qlQWmXlAiGUz_eKG_oYYVRf0yP6KVDdmQCEwYBhgL/s1600/Evennia_illustrated_fig1.png"><img src="https://2.bp.blogspot.com/-0-oir21e76k/W3kaUuGrg3I/AAAAAAAAJLU/qlQWmXlAiGUz_eKG_oYYVRf0yP6KVDdmQCEwYBhgL/s640/Evennia_illustrated_fig1.png" alt="" /></a></p>
|
||||
<p>Evennia is a game development library. What you see in Figure 1 is the part you download from us. This will not run on its own, we will soon initialize the missing “jigsaw puzzle” piece on the left. But first let’s look at what we’ve got.</p>
|
||||
<p>Looking at Figure 1 you will notice that Evennia internally has two components, the Portal and the Server. These will run as separate processes.</p>
|
||||
<p>The Portal tracks all connections to the outside world and understands Telnet protocols, websockets, SSH and so on. It knows nothing about the database or the game state. Data sent between the Portal and the Server is protocol-agnostic, meaning the Server sends/receives the same data regardless of how the user is connected. Hiding behind the Portal also means that the Server can be completely rebooted without anyone getting disconnected.</p>
|
||||
<p>The Server is the main “mud driver” and handles everything related to the game world and its database. It's asynchronous and uses <a href="http://twistedmatrix.com/trac/">Twisted</a>. In the same process of the Server is also the Evennia web server component that serves the game’s website. That the Server and webserver are accessing the database in the same process allows for a consistent game state without any concerns for caching or race condition issues.</p>
|
||||
<p>Now, let’s get a game going. We’ll call it mygame. Original, isn’t it?</p>
|
||||
<h4>Figure 2: The full setup for mygame</h4>
|
||||
<p><a href="https://4.bp.blogspot.com/-TuLk-PIVyK8/W3kaUi-e-MI/AAAAAAAAJLc/DA9oMA6m5ooObZlf0Ao6ywW1jHqsPQZAQCEwYBhgL/s1600/Evennia_illustrated_fig2.png"><img src="https://4.bp.blogspot.com/-TuLk-PIVyK8/W3kaUi-e-MI/AAAAAAAAJLc/DA9oMA6m5ooObZlf0Ao6ywW1jHqsPQZAQCEwYBhgL/s640/Evennia_illustrated_fig2.png" alt="" /></a></p>
|
||||
<p>After <a href="https://github.com/evennia/evennia/wiki/Getting-Started">installing evennia</a> you will have the evennia command available. Using this you create a game directory - the darker grey piece in Figure 2 that was missing previously. This is where you will create your dream game!</p>
|
||||
<p>During initialization, Evennia will create Python module templates in mygame/ and link up all configurations to make mygame a fully functioning, if empty, game, ready to start extending. Two more commands will create your database and then start the server. From this point on, mygame is up and running and you can connect to your new game with telnet on localhost:4000 or by pointing your browser to http://localhost:4001.</p>
|
||||
<p>Now, our new mygame world needs Characters, locations, items and more! These we commonly refer to as game entities. Let’s see how Evennia handles those.</p>
|
||||
<h4>Figure 3: The Database Abstraction of Evennia entities</h4>
|
||||
<p><a href="https://3.bp.blogspot.com/-81zsySVi_EE/W3kaVRn4IWI/AAAAAAAAJLc/yA-j1Nwy4H8F28BF403EDdCquYZ9sN4ZgCEwYBhgL/s1600/Evennia_illustrated_fig3.png"><img src="https://3.bp.blogspot.com/-81zsySVi_EE/W3kaVRn4IWI/AAAAAAAAJLc/yA-j1Nwy4H8F28BF403EDdCquYZ9sN4ZgCEwYBhgL/s400/Evennia_illustrated_fig3.png" alt="" /></a></p>
|
||||
<p>Evennia is fully persistent and abstracts its database in Python using <a href="https://www.djangoproject.com/">Django</a>. The database tables are few and generic, each represented by a single Python class. As seen in Figure 3, the example ObjectDB Python class represents one database table. The properties on the class are the columns (fields) of the table. Each row is an instance of the class (one entity in the game).</p>
|
||||
<p>Among the example columns shown is the key (name) of the ObjectDB entity as well as a <a href="https://en.wikipedia.org/wiki/Foreign_key">Foreign key</a>-relationship for its current “location”. From the above we can see that Trigger is in the Dungeon, carrying his trusty crossbow Old Betsy!</p>
|
||||
<p>The db_typeclass_path is an important field. This is a python-style path and tells Evennia which subclass of ObjectDB is actually representing this entity.</p>
|
||||
<h4>Figure 4: Inheriting classes to customize entities</h4>
|
||||
<p><a href="https://2.bp.blogspot.com/--4_MqVdHj8Q/W3kaVpdAZKI/AAAAAAAAJLk/jvTsuBBUlkEbBCaV9vyIU0IWiuF6PLsSwCEwYBhgL/s1600/Evennia_illustrated_fig4.png"><img src="https://2.bp.blogspot.com/--4_MqVdHj8Q/W3kaVpdAZKI/AAAAAAAAJLk/jvTsuBBUlkEbBCaV9vyIU0IWiuF6PLsSwCEwYBhgL/s400/Evennia_illustrated_fig4.png" alt="" /></a></p>
|
||||
<p>In Figure 4 we see the (somewhat simplified) Python class inheritance tree that you as an Evennia developer will see, along with the three instanced entities.</p>
|
||||
<p>ObjectDB represents stuff you will actually see in-game and its child classes implement all the handlers, helper code and the hook methods that Evennia makes use of. In your mygame/ folder you just import these and overload the things you want to modify. In this way, the Crossbow is modified to do the stuff only crossbows can do and CastleRoom adds whatever it is that is special about rooms in the castle.</p>
|
||||
<p>When creating a new entity in-game, a new row will automatically be created in the database table and then “Trigger” will appear in-game! If we, in code, search the database for Trigger, we will get an instance of the Character class back - a Python object we can work with normally.</p>
|
||||
<p>Looking at this you may think that you will be making a lot of classes for every different object in the game. Your exact layout is up to you but Evennia also offers other ways to customize each individual object, as exemplified by Figure 5.</p>
|
||||
<h4>Figure 5: Adding persistent Attributes to a game entity.</h4>
|
||||
<p><a href="https://3.bp.blogspot.com/-6ulv5T_gUCI/W3kaViWBBfI/AAAAAAAAJLU/0NqeAsz3YVsQKwpODzsmjzR-7tICw1pTQCEwYBhgL/s1600/Evennia_illustrated_fig5.png"><img src="https://3.bp.blogspot.com/-6ulv5T_gUCI/W3kaViWBBfI/AAAAAAAAJLU/0NqeAsz3YVsQKwpODzsmjzR-7tICw1pTQCEwYBhgL/s400/Evennia_illustrated_fig5.png" alt="" /></a></p>
|
||||
<p>The Attribute is another class directly tied to the database behind the scenes. Each Attribute basically has a key, a value and a ForeignKey relation to another ObjectDB. An Attribute serializes Python constructs into the database, meaning you can store basically any valid Python, like the dictionary of skills seen in Figure 5. The “strength” and “skills” Attributes will henceforth be reachable directly from the Trigger object. This (and a few other resources) allow you to create individualized entities while only needing to create classes for those that really behave fundamentally different.</p>
|
||||
<h4>Figure 6: Sessions, Players and Objects</h4>
|
||||
<p><a href="https://4.bp.blogspot.com/-u-npXjlq6VI/W3kaVwAoiUI/AAAAAAAAJLY/T9bhrzhJJuQwTR8nKHH9GUxQ74hyldKOgCEwYBhgL/s1600/Evennia_illustrated_fig6.png"><img src="https://4.bp.blogspot.com/-u-npXjlq6VI/W3kaVwAoiUI/AAAAAAAAJLY/T9bhrzhJJuQwTR8nKHH9GUxQ74hyldKOgCEwYBhgL/s400/Evennia_illustrated_fig6.png" alt="" /></a></p>
|
||||
<p>Trigger is most likely played by a human. This human connects to the game via one or more Sessions, one for each client they connect with. Their account on mygame is represented by a PlayerDB entity. The PlayerDB holds the password and other account info but has no existence in the game world. Through the PlayerDB entity, Sessions can control (“puppet”) one or more ObjectDB entities in-game.</p>
|
||||
<p>In Figure 6, a user is connected to the game with three Sessions simultaneously. They are logged in to their Player account Richard. Through these Sessions they are simultaneously puppeting the in-game entities Trigger and Sir Hiss. Evennia can be configured to allow or disallow a range of different gaming styles like this.</p>
|
||||
<p>Now, for users to be able to control their game entities and actually play the game, they need to be able to send Commands.</p>
|
||||
<h4>Figure 7: Commands are Python classes too</h4>
|
||||
<p><a href="https://3.bp.blogspot.com/-_RM9-Pb2uKg/W3kaWIs4ndI/AAAAAAAAJLc/n45Hcvk1PiYhNdBbAAr_JjkebRVReffTgCEwYBhgL/s1600/Evennia_illustrated_fig7.png"><img src="https://3.bp.blogspot.com/-_RM9-Pb2uKg/W3kaWIs4ndI/AAAAAAAAJLc/n45Hcvk1PiYhNdBbAAr_JjkebRVReffTgCEwYBhgL/s400/Evennia_illustrated_fig7.png" alt="" /></a></p>
|
||||
<p>Commands represent anything a user can input actively to the game, such as the look command, get, quit, emote and so on.</p>
|
||||
<p>Each Command handles both argument parsing and execution. Since each Command is described with a normal Python class, it means that you can implement parsing once and then just have the rest of your commands inherit the effect. In Figure 7, the DIKUCommand parent class implements parsing of all the syntax common for all DIKU-style commands so CmdLook and others won’t have to.</p>
|
||||
<h4>Figure 8: Commands are grouped together in sets and always associated with game entities.</h4>
|
||||
<p><a href="https://2.bp.blogspot.com/-pgpYPsd4CLM/W3kaWG2ffuI/AAAAAAAAJLg/LKl4m4-1xkYxVA7JXXuVP28Q9ZqhNZXTACEwYBhgL/s1600/Evennia_illustrated_fig8.png"><img src="https://2.bp.blogspot.com/-pgpYPsd4CLM/W3kaWG2ffuI/AAAAAAAAJLg/LKl4m4-1xkYxVA7JXXuVP28Q9ZqhNZXTACEwYBhgL/s400/Evennia_illustrated_fig8.png" alt="" /></a></p>
|
||||
<p>Commands in Evennia are always joined together in Command Sets. These are containers that can hold many Command instances. A given Command class can contribute Command instances to any number of Command Sets. These sets are always associated with game entities. In Figure 8, Trigger has received a Command Set with a bunch of useful commands that he (and by extension his controlling Player) can now use.</p>
|
||||
<h4>Figure 9: Command Sets can affect those around them</h4>
|
||||
<p><a href="https://3.bp.blogspot.com/-acmVo7kUZCk/W3kaWZWlT0I/AAAAAAAAJLk/nnFrNaq_TNoO08MDleadwhHfVQLdO74eACEwYBhgL/s1600/Evennia_illustrated_fig9.png"><img src="https://3.bp.blogspot.com/-acmVo7kUZCk/W3kaWZWlT0I/AAAAAAAAJLk/nnFrNaq_TNoO08MDleadwhHfVQLdO74eACEwYBhgL/s400/Evennia_illustrated_fig9.png" alt="" /></a></p>
|
||||
<p>Trigger’s Command Set is only available to himself. In Figure 8 we put a Command Set with three commands on the Dungeon room. The room itself has no use for commands but we configure this set to affect those inside it instead. Note that we let these be different versions of these commands (hence the different color)! We’ll explain why below.</p>
|
||||
<h4>Figure 10: The name Command “Set” is not just a name</h4>
|
||||
<p><a href="https://4.bp.blogspot.com/--lixKOYjEe4/W3kaUl9SFXI/AAAAAAAAJLQ/tCGd-dFhZ8gfLH1HAsQbZdaIS_OQuvU3wCEwYBhgL/s1600/Evennia_illustrated_fig10.png"><img src="https://4.bp.blogspot.com/--lixKOYjEe4/W3kaUl9SFXI/AAAAAAAAJLQ/tCGd-dFhZ8gfLH1HAsQbZdaIS_OQuvU3wCEwYBhgL/s400/Evennia_illustrated_fig10.png" alt="" /></a></p>
|
||||
<p>Command Sets can be dynamically (and temporarily) merged together in a similar fashion as <a href="https://en.wikipedia.org/wiki/Set_theory">Set Theory</a>, except the merge priority can be customized. In Figure 10 we see a Union-type merger where the Commands from Dungeon of the same name temporarily override the commands from Trigger. While in the Dungeon, Trigger will be using this version of those commands. When Trigger leaves, his own Command Set will be restored unharmed.</p>
|
||||
<p>Why would we want to do this? Consider for example that the dungeon is in darkness. We can then let the Dungeon’s version of the look command only show the contents of the room if Trigger is carrying a light source. You might also not be able to easily get things in the room without light - you might even be fumbling randomly in your inventory!</p>
|
||||
<p>Any number of Command Sets can be merged on the fly. This allows you to implement multiple overlapping states (like combat in a darkened room while intoxicated) without needing huge if statements for every possible combination. The merger is non-destructive, so you can remove cmdsets to get back previous states as needed.</p>
|
||||
<p>… And that’s how many illustrations I have the stamina to draw at this time. Hopefully this quick illustrated dive into Evennia helps to clarify some of the basic features of the system!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2016-05-22-evennia-0.6!>
|
||||
Evennia 0.6!
|
||||
<a class="devblog-headerlink" href="2016.html#2016-05-22-evennia-0.6!" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- May 22, 2016</div>
|
||||
</h1>
|
||||
<p><a href="https://1.bp.blogspot.com/-2Axqwk9ps84/Ui8fvdZ3ReI/AAAAAAAAB-M/_W0YsmCG6BwRv8a01AOG-nXfYws5wCilwCKgB/s1600/evennia_logo_small.png"><img src="https://1.bp.blogspot.com/-2Axqwk9ps84/Ui8fvdZ3ReI/AAAAAAAAB-M/_W0YsmCG6BwRv8a01AOG-nXfYws5wCilwCKgB/s1600/evennia_logo_small.png" alt="" /></a></p>
|
||||
<p>As of today, I merged the development branch to make version 0.6 of the MU* development system and server Evennia.</p>
|
||||
<p>Evennia 0.6 comes with a lot of updates, mainly in the way Evennia talks to the outside world. All communication is now standardized, so there are no particular treatment of things like text - text is just one of any standardized commands being passed between the server the client (whether over telnet, ssh, websockets or ajax/comet).</p>
|
||||
<p>For example the user can now easily plug in "inputfuncs" to handle any data coming from the client. If you want your client to offer some particular functionality, you just need to plop in a python function to handle it, server-side. We also now offer a lot of utility functions for things like monitoring change (tell the client whenever your health status changes so it can update a health bar or flash the screen).</p>
|
||||
<p>The HTML5 webclient has itself updated considerably. Most is happening behind the scenes though. Notably the webclient's javascript component is split into two:</p>
|
||||
<p><a href="https://1.bp.blogspot.com/-vx-uriUXOjI/V0If9Q3TcVI/AAAAAAAAEm4/35haAV1OyAoafjxwHP8wMcOad4CC4OpkQCLcB/s1600/evennia_screen.png"><img src="https://1.bp.blogspot.com/-vx-uriUXOjI/V0If9Q3TcVI/AAAAAAAAEm4/35haAV1OyAoafjxwHP8wMcOad4CC4OpkQCLcB/s400/evennia_screen.png" alt="" /></a></p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>evennia.js</strong>, acts as a library for handling all communication with the server part of Evennia. It offers events for a gui library to plug into and send/receive. It will also gracefully degrade from a websocket connection to AJAX/COMET long-polling if the player uses an older browser.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>evennia_gui.js</strong> is the default front-end and implements a traditional and stable "telnet-like" interface. The html part uses uses Django templating to make it easy to customize and expand. Since this simply makes use of the resources offered by evennia.js, one could pretty easily slip in some other gui library here, or set up calls to get all sorts of interesting information from the server (which talks back using inputfuncs).</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>There are a truckload of more updates and features that are covered <a href="https://groups.google.com/forum/#%21category-topic/evennia/evennia-news/Ik8hi7ajZlI">on the mailing list</a>.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2016-03-24-technical-stuff-happening>
|
||||
Technical stuff happening
|
||||
<a class="devblog-headerlink" href="2016.html#2016-03-24-technical-stuff-happening" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- March 24, 2016</div>
|
||||
</h1>
|
||||
<p><a href="https://2.bp.blogspot.com/-2joU-U3OlH0/VvQ9hatC4MI/AAAAAAAAEic/PdL_kxHeXPE6O-HuM3Pk_6GQ5T19fc2zA/s1600/supersonic-nozzle.png"><img src="https://2.bp.blogspot.com/-2joU-U3OlH0/VvQ9hatC4MI/AAAAAAAAEic/PdL_kxHeXPE6O-HuM3Pk_6GQ5T19fc2zA/s320/supersonic-nozzle.png" alt="" /></a></p>
|
||||
<p>Hi folks, a bit more technical entry this time. These usually go onto the Evennia mailing list but I thought it would be interesting to put it in the dev-blog for once.</p>
|
||||
<p>So, I'm now halfway through the <a href="https://github.com/evennia/evennia/issues/924">TODO list issue</a> of the <a href="http://evennia.blogspot.se/2016/02/climbing-up-branches.html">wclient development branch</a> as alluded to in the last post. The wclient branch aims to rework and beef up the web client infrastructure of Evennia.</p>
|
||||
<p>The first steps, which has been done a while was converting the SSH/SSL and IRC input/output protocols to use the new protocol infrastructure (telnet and websockets was done since before). That's just under-the-hood stuff though. Today I finished the changes to the Monitor/TickerHandlers, which may be of more general interest.</p>
|
||||
<p>With the changes to the the way OOB (Out-Of-Band) messages are passing through Evennia (see <a href="https://groups.google.com/forum/#%21category-topic/evennia/evennia-news/xWQu_YVm14k">this mailing list post</a> for more details), the <strong>OOBHandler</strong> is no more. As discussed there, the handling of incoming data is becoming a lot freer and will be easily expandable to everyone wanting to make for a custom client experience. The idea is thus for Evennia to offer <em>resources</em> for various input commands to make use of, rather than prescribing such functionality in a monolothic way in the OOBHandler. There were three main functionalities the OOBHandler offered, and which will now be offered by separate components:</p>
|
||||
<ol>
|
||||
<li>
|
||||
<p><strong>Direct function callback.</strong> The instruction from the client should be able to trigger a named server-side function. This is the core of the inputfunc system described previously.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Field/Attribute monitoring</strong>. The client should be able to request <em>monitoring</em> of an object's database fields or Attributes. For example, the client may request to be notified whenever the Character's "health" Attribute changes in some way. This is now handled by the new <em>monitorhandler</em>. See below.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Non-persistent function repeats.</strong> One should be able to set up a repeating ticker that survives a server reload but does <em>not</em> survive a cold shutdown - this mimics the life cycle of server Sessions. Scripts could do this already but I wanted to be able to use the TickerHandler for quick assignment. Problem was that the Tickerhandler in master branch is not only always-persistent, it also only calls <em>database</em> <em>object methods</em>. So I have now expanded the tickerhandler to also accept arbitrary module functions, without any connection to a database object.</p>
|
||||
</li>
|
||||
</ol>
|
||||
<h2>The MonitorHandler</h2>
|
||||
<p><strong>evennia.MONITOR_HANDLER</strong> is the new singleton managing monitoring of on-object field/attribute changes. It is used like this:</p>
|
||||
<pre><code>MONITOR_HANDLER.add(obj, field_or_attrname, callback, **kwargs)
|
||||
</code></pre>
|
||||
<p>Here <strong>obj</strong> is a database entity, like a Character or another Object. The <strong>field_or_attrname</strong> is a string giving the name of a <strong>db_</strong>* database field (like <strong>"db_key", "db_location"</strong> etc). Any name not starting with <strong>db_</strong> is assumed to be the name of an on-object Attribute (like <strong>"health"</strong>). Henceforth, whenever this field or attribute changes in any way (that is, whenever it is re-saved to the database), the <strong>callback</strong> will be called with the optional <strong>kwargs</strong>, as well as a way to easily get to the changed value. As all handlers you can also list and remove monitors using the standard <strong>MONITOR_HANDLER</strong>.<strong>remove()</strong>, <strong>.all()</strong> etc.</p>
|
||||
<h2>The TickerHandler</h2>
|
||||
<p><strong>evennia.TICKER_HANDLER</strong> should be familiar to Evennia users from before - it's been around for a good while. It allows for creating arbitrary "tickers" that is being "subscribed" to - one ticker will call all subscribers rather than each object or function having its own timer.</p>
|
||||
<p>Before, the syntax for adding a new ticker required you specify a typeclassed entity and the name of the method on it to call every N seconds. This will now change. This is the new callsign for creating a new ticker:</p>
|
||||
<pre><code>TICKER_HANDLER.add(interval, callback, idstring="", persistent=True, *args, **kwargs)
|
||||
</code></pre>
|
||||
<p>Here**, interval,** like before, defines how often to call **callback(*args, <strong>kwargs)</strong>.</p>
|
||||
<p>The big change here is that <strong>callback</strong> should be given as a valid, already imported callable, which can be <em>either</em> an on-entity method (like obj.func) or a global function in any module (like world.test.func) - the TickerHandler will analyze it and internally store it properly.</p>
|
||||
<p><strong>idstring</strong> works as before, to separate tickers with the same intervals. Finally <strong>persistent</strong>=<strong>False</strong> means the ticker will behave the same way a Script with <strong>persistent=False</strong> does: it will survive a server reload but will <em>not</em> survive a server shutdown. This latter functionality is particularly useful for client-side commands since the client Session will also not survive a shutdown.</p>
|
||||
<p>... So this is a rather big API change to the TickerHandler, which will mean some conflicts for those of you relying heavily on tickers. Easiest will definitely be to simply stop the old and start new ones. It's not clear yet if we'll offer some automated way to convert old tickers to new ones. Chime in if this is something important to you.</p>
|
||||
<h2>Happening Next</h2>
|
||||
<p>The next steps involves making use of these new utilities to implement the basic OOB commands recommended by the MSDP and GMCP protocols along with some recommended functionality. We'll see how long that takes, but progress is being made. And if you are a web guy, do consider <a href="https://github.com/evennia/evennia/issues/924">helping out.</a></p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2016-02-14-climbing-up-branches>
|
||||
Climbing up Branches
|
||||
<a class="devblog-headerlink" href="2016.html#2016-02-14-climbing-up-branches" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- February 14, 2016</div>
|
||||
</h1>
|
||||
<p><a href="https://2.bp.blogspot.com/-YRSejcCHpq4/VsDcZRdmTVI/AAAAAAAAEgE/oK4igrEnqWk/s1600/male-lazuli-bunting-bird-perches-on-branch-passerina-amoena.jpg"><img src="https://2.bp.blogspot.com/-YRSejcCHpq4/VsDcZRdmTVI/AAAAAAAAEgE/oK4igrEnqWk/s320/male-lazuli-bunting-bird-perches-on-branch-passerina-amoena.jpg" alt="" /></a></p>
|
||||
<p>Today I pushed the latest Evennia development branch "wclient". This has a bunch of updates to how Evennia's webclient infrastructure works, by making all exchanged data be treated equal (instead of treating text separately from other types of client instructions).</p>
|
||||
<p>It also reworks the javascript client into a library that should be a lot easier to expand on and customize. The actual client GUI is still pretty rudimentary though, so I hope a user with more web development experience can take upon themselves to look it over for best practices.</p>
|
||||
<p>A much more detailed description of what is currently going on (including how to check out the latest for yourself) is found in this <a href="https://groups.google.com/forum/#%21category-topic/evennia/evennia-news/xWQu_YVm14k">mailing list post</a>. Enjoy!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
1019
devblog/2017.html
Normal file
1019
devblog/2017.html
Normal file
File diff suppressed because it is too large
Load diff
721
devblog/2018.html
Normal file
721
devblog/2018.html
Normal file
|
|
@ -0,0 +1,721 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<title>Devblog: Evennia Python MUD/MU creation system</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../images/favicon.ico">
|
||||
<link rel="stylesheet" href="../stylesheets/styles.css">
|
||||
<link rel="stylesheet" href="../stylesheets/pygment_trac.css">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open Sans' rel='stylesheet'>
|
||||
<link href='https://fonts.googleapis.com/css?family=Arvo' rel='stylesheet'>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="Evennia is a modern Python library and server for creating text-based multi-player games and virtual worlds (also known as MUD, MUSH, MU, MUX, MUCK, etc). While Evennia handles all the necessary things every online game needs, like database and networking, you create the game of your dreams by writing normal Python modules.">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js">
|
||||
</script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<p>
|
||||
<img class="logo" src="../images/evennia_logo.png" alt="Evennia logo">
|
||||
</p>
|
||||
<h1 class="header">Evennia</h1>
|
||||
<p class="header header-text">The Python MU* Development Library</p>
|
||||
<div class="linksection">
|
||||
<ul>
|
||||
<div class="buttonsection">
|
||||
<li>
|
||||
<a class="buttons" href="https://www.evennia.com">Back to Evennia</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="devblog-calendar">
|
||||
<ul>
|
||||
|
||||
<li><a href="2021.html">2021 (2)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2020.html">2020 (3)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2019.html">2019 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2018.html">2018 (4)
|
||||
|
||||
<ul class="devblog-calendar-open">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2017.html">2017 (6)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2016.html">2016 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2015.html">2015 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2014.html">2014 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2013.html">2013 (5)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2012.html">2012 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<section>
|
||||
<h1>
|
||||
<a name="evennia-mudmu-creation-system" class="anchor" href="#evennia-mudmu-creation-system">
|
||||
<span class="octicon octicon-link">
|
||||
</span>
|
||||
</a>Evennia Dev Blog<div class="sponsor">
|
||||
<div class="sponsor-column">
|
||||
<a href="https://www.patreon.com/griatch">
|
||||
<img class="patreon" src="../images/evennia_patreon_100x100.png" alt="Patreon">
|
||||
</a>
|
||||
<p>
|
||||
<a href="https://www.paypal.me/GriatchEvennia">
|
||||
<img class="paypal" src="../images/btn_donateCC_LG.gif" alt="Paypal donate">
|
||||
</a>
|
||||
</div>
|
||||
</h1>
|
||||
|
||||
<em>Various Evennia- and MUD-related musings by Griatch, the Evennia lead developer.</em>
|
||||
|
||||
|
||||
|
||||
<div class="blog_post">
|
||||
<h1 id=2018-09-30-evennia-0.8-released>
|
||||
Evennia 0.8 released
|
||||
<a class="devblog-headerlink" href="2018.html#2018-09-30-evennia-0.8-released" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- September 30, 2018</div>
|
||||
</h1>
|
||||
<p><a href="https://4.bp.blogspot.com/-2Axqwk9ps84/Ui8fvdZ3ReI/AAAAAAAAB-M/mNkREiXqmJM8Ilz-VmP3V-4YhazaZJIIQCPcBGAYYCw/s1600/evennia_logo_small.png"><img src="https://4.bp.blogspot.com/-2Axqwk9ps84/Ui8fvdZ3ReI/AAAAAAAAB-M/mNkREiXqmJM8Ilz-VmP3V-4YhazaZJIIQCPcBGAYYCw/s1600/evennia_logo_small.png" alt="" /></a>After about a year of work and almost 540 commits from close to 20 contributors, <a href="http://www.evennia.com/">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.</p>
|
||||
<p>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">completely reworked server infrastructure</a>:</p>
|
||||
<p><a href="https://4.bp.blogspot.com/-R0ziGF8cMPc/Wmz0ppbJkQI/AAAAAAAAH9s/e1D6DVBVwMMia04OubZi5nvO1h8RfdRoACPcBGAYYCw/s1600/portal_server_reboot_develop.png"><img src="https://4.bp.blogspot.com/-R0ziGF8cMPc/Wmz0ppbJkQI/AAAAAAAAH9s/e1D6DVBVwMMia04OubZi5nvO1h8RfdRoACPcBGAYYCw/s320/portal_server_reboot_develop.png" alt="" /></a></p>
|
||||
<p>as well as the new <a href="https://evennia.blogspot.com/2018/08/inline-building-in-upcoming-evennia-08.html">Online Creation System</a> that allows for editing in-game prototypes using a powerful menu system:</p>
|
||||
<p><a href="https://3.bp.blogspot.com/-ht9SIPcUxfc/W3f0xcl2HdI/AAAAAAAAJIw/cZt90znG82sSNg7Y-dpdiG5f1EXefZiNACPcBGAYYCw/s1600/Screenshot%2Bfrom%2B2018-08-18%2B12-26-12.png"><img src="https://3.bp.blogspot.com/-ht9SIPcUxfc/W3f0xcl2HdI/AAAAAAAAJIw/cZt90znG82sSNg7Y-dpdiG5f1EXefZiNACPcBGAYYCw/s400/Screenshot%2Bfrom%2B2018-08-18%2B12-26-12.png" alt="" /></a></p>
|
||||
<p>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.</p>
|
||||
<p><a href="https://4.bp.blogspot.com/-BKHBV0L443U/W7EgLdZIQmI/AAAAAAAAJZo/Dzv_aD80B-80GgxzZsyq6XUSzAzv86IwQCLcBGAs/s1600/Screenshot%2Bfrom%2B2018-09-30%2B21-09-55.png"><img src="https://4.bp.blogspot.com/-BKHBV0L443U/W7EgLdZIQmI/AAAAAAAAJZo/Dzv_aD80B-80GgxzZsyq6XUSzAzv86IwQCLcBGAs/s400/Screenshot%2Bfrom%2B2018-09-30%2B21-09-55.png" alt="" /></a></p>
|
||||
<p>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!</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>The more detailed list of improvements and changes can be found in the announcement <a href="https://groups.google.com/forum/#%21category-topic/evennia/evennia-news/teSx6ICHSTU">here</a>. As usual, please report any issues to the issue tracker on github.</p>
|
||||
<h3>Future</h3>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2018-08-18-inline-building-in-upcoming-evennia-0.8>
|
||||
Inline building in upcoming Evennia 0.8
|
||||
<a class="devblog-headerlink" href="2018.html#2018-08-18-inline-building-in-upcoming-evennia-0.8" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- August 18, 2018</div>
|
||||
</h1>
|
||||
<p><a href="https://4.bp.blogspot.com/-h2OiulcCLIY/W3gLw-UzGgI/AAAAAAAAJKI/bS_gTmOcQoAgaGmCOnx-b4x60zTr1pVCgCLcBGAs/s1600/773px-Industrial_Trust_Building_Providence_RI.jpg"><img src="https://4.bp.blogspot.com/-h2OiulcCLIY/W3gLw-UzGgI/AAAAAAAAJKI/bS_gTmOcQoAgaGmCOnx-b4x60zTr1pVCgCLcBGAs/s200/773px-Industrial_Trust_Building_Providence_RI.jpg" alt="" /></a></p>
|
||||
<p><a href="http://www.evennia.com/">Evennia</a>, the Python MUD-server game development kit, is slowly creeping closer to its 0.8 release.</p>
|
||||
<p>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 <strong>olc</strong> command in-game. This is a visual system for manipulating Evennia <em>Prototypes</em>.</p>
|
||||
<h3>Briefly on Prototypes</h3>
|
||||
<p>The <em>Prototype</em> 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:</p>
|
||||
<pre><code>
|
||||
{"key": "My house",
|
||||
|
||||
"typeclass": "typeclasses.houses.MyHouse"}
|
||||
|
||||
</code></pre>
|
||||
<p>By passing this dict to the spawner, a new object named "My house" will be created. It will be set up with the given typeclass (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.</p>
|
||||
<p>There are two main reasons for the Prototypes existing in Evennia:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>They allow you to customize <em>individual</em> 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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>What's new</h3>
|
||||
<p>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.</p>
|
||||
<p><em>Note: If you are visually impaired, each image is also a link to a text-only version.</em></p>
|
||||
<p><a href="https://pastebin.com/raw/3YNtAdvz"><img src="https://2.bp.blogspot.com/-ht9SIPcUxfc/W3f0xcl2HdI/AAAAAAAAJIk/VSk4VaBMhTc3J8ZaTnar9X2Rws-LOMiqACLcBGAs/s400/Screenshot%2Bfrom%2B2018-08-18%2B12-26-12.png" alt="OLC index" title="OLC index 1" /></a></p>
|
||||
<p>In Evennia 0.8, while you can still insert the Prototype as a raw dict, <strong>spawn/menu</strong> or the new <strong>olc</strong> command opens a new menu-driven interface.</p>
|
||||
<p><a href="https://pastebin.com/raw/4UbUNGmG"><img src="https://3.bp.blogspot.com/-tdauL-B6j1E/W3f01ltKlzI/AAAAAAAAJIs/Q5-cIY6AcGU_IXXasdzPWec7cxN061WrwCLcBGAs/s400/Screenshot%2Bfrom%2B2018-08-18%2B12-27-37.png" 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 " title="Prototype loading" /></a></p>
|
||||
<p>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).</p>
|
||||
<p><a href="https://pastebin.com/raw/dUGiSLDL"><img src="https://2.bp.blogspot.com/-XFm3KqhLBwE/W3f93upyVLI/AAAAAAAAJJA/eZDWGPHM93MWvt2T5W8Ytr4cHstGg8iXACLcBGAs/s400/Screenshot%2Bfrom%2B2018-08-18%2B13-04-48.png" 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)" title="Load prototype from object" /></a></p>
|
||||
<p>You can now also use the menu to search for and create a new Prototype based on <em>an existing object</em> (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.</p>
|
||||
<p><a href="https://pastebin.com/raw/VspKN3xf"><img src="https://1.bp.blogspot.com/-DYcYStEWXKk/W3f_-bnH4vI/AAAAAAAAJJY/iv4-GN8NTpUCpBvyXBwMUABG8TTPJYN9ACLcBGAs/s400/Screenshot%2Bfrom%2B2018-08-18%2B13-15-44.png" 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 " title="Typeclass selection, miltipage" /></a></p>
|
||||
<p>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).</p>
|
||||
<p>There is also a new switch to the <strong>typeclass</strong> command, <strong>/list</strong>, that will list all available typeclasses outside of the OLC.</p>
|
||||
<h3>Protfuncs</h3>
|
||||
<p>Another new feature are <em>Protfuncs.</em> Similarly to how <em>Inlinefuncs</em> 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 $funcname(arguments), where arguments could themselves contain one or more nested Protfuncs.</p>
|
||||
<p>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</p>
|
||||
<blockquote>
|
||||
<p><strong>Strength = $randint(5, 20)</strong></p>
|
||||
</blockquote>
|
||||
<p>to automatically spawn objects with a random strength between 5 and 20.</p>
|
||||
<p><a href="https://pastebin.com/raw/3VLMEPFd"><img src="https://1.bp.blogspot.com/-qHeRpEQTEzU/W3gFpJ9ge5I/AAAAAAAAJJw/-PVcelDk2CsIW1nJwWvMjazcJ9LyKx5pgCLcBGAs/s400/Screenshot%2Bfrom%2B2018-08-18%2B13-40-04.png" 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" title="Spawning screen" /></a></p>
|
||||
<p>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.</p>
|
||||
<p><a href="https://pastebin.com/raw/K0a1z23h"><img src="https://4.bp.blogspot.com/-mkpUmXNQsWQ/W3gKE-5nnlI/AAAAAAAAJJ8/S65RiLXa6BcSstru3ePZmMna38cnWGRYQCLcBGAs/s400/Screenshot%2Bfrom%2B2018-08-18%2B13-58-27.png" alt="https://pastebin.com/raw/K0a1z23h" /></a></p>
|
||||
<p>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.</p>
|
||||
<h2>Current status</h2>
|
||||
<p>The OLC is currently in the develop branch of Evennia - what will soon(ish) merge to become Evennia 0.8.</p>
|
||||
<p>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!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2018-01-27-kicking-into-gear-from-a-distance>
|
||||
Kicking into gear from a distance
|
||||
<a class="devblog-headerlink" href="2018.html#2018-01-27-kicking-into-gear-from-a-distance" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- January 27, 2018</div>
|
||||
</h1>
|
||||
<p><a href="https://3.bp.blogspot.com/-63mc2ur3Gyk/Wmz6puNzMGI/AAAAAAAAH94/vsXKZcCu2MwKlEaoCi7IjzWHJnPvGAQKgCLcBGAs/s1600/karate-312470_640.png"><img src="https://3.bp.blogspot.com/-63mc2ur3Gyk/Wmz6puNzMGI/AAAAAAAAH94/vsXKZcCu2MwKlEaoCi7IjzWHJnPvGAQKgCLcBGAs/s200/karate-312470_640.png" alt="" /></a></p>
|
||||
<p>The last few weeks I have reworked the way <a href="http://www.evennia.com/">Evennia</a>'s startup procedure works. This is now finished in the <em>develop</em> branch so I thought I'd mention a little what's going on.</p>
|
||||
<p>Evennia, being a server for creating and running text-games (MU*s), consists of two main processes:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <em>Portal</em> - this is what players connect to with their clients.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <em>Server</em> - 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.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Since Evennia should be easy to set up <em>and</em> 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:</p>
|
||||
<p><a href="https://1.bp.blogspot.com/-U98LnVTJF7Y/WmzvHbQN2NI/AAAAAAAAH9U/10u8n91y56MdyW4Fmuv9k5Abk79TCCtUgCLcBGAs/s1600/portal_server_reboot_master.png"><img src="https://1.bp.blogspot.com/-U98LnVTJF7Y/WmzvHbQN2NI/AAAAAAAAH9U/10u8n91y56MdyW4Fmuv9k5Abk79TCCtUgCLcBGAs/s400/portal_server_reboot_master.png" alt="" /></a></p>
|
||||
<p>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.</p>
|
||||
<p>The <strong><em>Launcher</em></strong> is the evennia program one uses to interact with the Server in the terminal/console. You give it commands like evennia start/stop/reload.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>When <strong>starting</strong>, the Launcher spawns a new program, the <em><strong>Runner</strong></em>, 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 <em><strong>.pid files</strong></em>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>When <strong>reloading</strong>, the Launcher writes a flag in a little <em><strong>.restart</strong></em> <em><strong>file</strong></em>. 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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>When <strong>stopping,</strong> 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.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>The original reason for this Server-Portal-Runner setup is that the Portal is <em>also</em> 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 ...</p>
|
||||
<p>It overall feels a little ... fiddly.</p>
|
||||
<p>In develop branch, this is now the new process management setup:</p>
|
||||
<p><a href="https://4.bp.blogspot.com/-R0ziGF8cMPc/Wmz0ppbJkQI/AAAAAAAAH9o/2BNcUTEqvBwkmlZAy7Q74Xmww_LkpB3wgCLcBGAs/s1600/portal_server_reboot_develop.png"><img src="https://4.bp.blogspot.com/-R0ziGF8cMPc/Wmz0ppbJkQI/AAAAAAAAH9o/2BNcUTEqvBwkmlZAy7Q74Xmww_LkpB3wgCLcBGAs/s400/portal_server_reboot_develop.png" alt="" /></a></p>
|
||||
<p>The Portal is now a Twisted <a href="https://twistedmatrix.com/documents/current/api/twisted.protocols.amp.html">AMP</a> server, while the Evennia Server and Launcher are AMP clients. The Runner is no more.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>When <strong>starting</strong>, 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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>When <strong>reloading</strong>, 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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>When <strong>stopping</strong>, 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.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2018-01-05-new-year,-new-stuff>
|
||||
New year, new stuff
|
||||
<a class="devblog-headerlink" href="2018.html#2018-01-05-new-year,-new-stuff" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- January 5, 2018</div>
|
||||
</h1>
|
||||
<p><a href="https://1.bp.blogspot.com/-Cos98gc1wVU/Wk9Qdu2v6pI/AAAAAAAAH3U/O29xABaYrPYxPT3xubw79li5zU-kj_HVACLcBGAs/s1600/child-1539341_640.jpg"><img src="https://1.bp.blogspot.com/-Cos98gc1wVU/Wk9Qdu2v6pI/AAAAAAAAH3U/O29xABaYrPYxPT3xubw79li5zU-kj_HVACLcBGAs/s200/child-1539341_640.jpg" alt="" /></a></p>
|
||||
<p>Happy 2018 everyone! Here's a little summary of the past Evennia year and what is brewing.</p>
|
||||
<p><em>(Evennia is a Python server- and toolbox for creating text-based multiplayer games (MU*)).</em></p>
|
||||
<p>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">as described in my blog post here.</a> But now 0.7 <a href="http://evennia.blogspot.se/2017/09/evennia-07-released.html">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/#%21category-topic/evennia/evennia-news/0JYYNGY-NfE">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.</p>
|
||||
<p>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">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.</p>
|
||||
<p>One thing we added with 0.7 was a more formal branching structure: Evennia now uses fixed <strong>master</strong> and <strong>develop</strong> 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.</p>
|
||||
<p>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/#%21category-topic/evennia/evennia-news/GbLh1GF-ZaY">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.</p>
|
||||
<p>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">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.</p>
|
||||
<p>Finally, a continued great thank you to those of you contributing to the <a href="https://www.patreon.com/griatch">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!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
1031
devblog/2019.html
Normal file
1031
devblog/2019.html
Normal file
File diff suppressed because it is too large
Load diff
795
devblog/2020.html
Normal file
795
devblog/2020.html
Normal file
|
|
@ -0,0 +1,795 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<title>Devblog: Evennia Python MUD/MU creation system</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../images/favicon.ico">
|
||||
<link rel="stylesheet" href="../stylesheets/styles.css">
|
||||
<link rel="stylesheet" href="../stylesheets/pygment_trac.css">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open Sans' rel='stylesheet'>
|
||||
<link href='https://fonts.googleapis.com/css?family=Arvo' rel='stylesheet'>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="Evennia is a modern Python library and server for creating text-based multi-player games and virtual worlds (also known as MUD, MUSH, MU, MUX, MUCK, etc). While Evennia handles all the necessary things every online game needs, like database and networking, you create the game of your dreams by writing normal Python modules.">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js">
|
||||
</script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<p>
|
||||
<img class="logo" src="../images/evennia_logo.png" alt="Evennia logo">
|
||||
</p>
|
||||
<h1 class="header">Evennia</h1>
|
||||
<p class="header header-text">The Python MU* Development Library</p>
|
||||
<div class="linksection">
|
||||
<ul>
|
||||
<div class="buttonsection">
|
||||
<li>
|
||||
<a class="buttons" href="https://www.evennia.com">Back to Evennia</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="devblog-calendar">
|
||||
<ul>
|
||||
|
||||
<li><a href="2021.html">2021 (2)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2020.html">2020 (3)
|
||||
|
||||
<ul class="devblog-calendar-open">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2019.html">2019 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2018.html">2018 (4)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2017.html">2017 (6)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2016.html">2016 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2015.html">2015 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2014.html">2014 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2013.html">2013 (5)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2012.html">2012 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<section>
|
||||
<h1>
|
||||
<a name="evennia-mudmu-creation-system" class="anchor" href="#evennia-mudmu-creation-system">
|
||||
<span class="octicon octicon-link">
|
||||
</span>
|
||||
</a>Evennia Dev Blog<div class="sponsor">
|
||||
<div class="sponsor-column">
|
||||
<a href="https://www.patreon.com/griatch">
|
||||
<img class="patreon" src="../images/evennia_patreon_100x100.png" alt="Patreon">
|
||||
</a>
|
||||
<p>
|
||||
<a href="https://www.paypal.me/GriatchEvennia">
|
||||
<img class="paypal" src="../images/btn_donateCC_LG.gif" alt="Paypal donate">
|
||||
</a>
|
||||
</div>
|
||||
</h1>
|
||||
|
||||
<em>Various Evennia- and MUD-related musings by Griatch, the Evennia lead developer.</em>
|
||||
|
||||
|
||||
|
||||
<div class="blog_post">
|
||||
<h1 id=2020-11-14-evennia-0.9.5-released>
|
||||
Evennia 0.9.5 released
|
||||
<a class="devblog-headerlink" href="2020.html#2020-11-14-evennia-0.9.5-released" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- November 14, 2020</div>
|
||||
</h1>
|
||||
<p><a href="https://1.bp.blogspot.com/-WACefg23bBA/X6_6vGTcjbI/AAAAAAAALh0/4FtZQDj5XosG_Dnyj6e-8ScHwyOTaOSzQCLcBGAsYHQ/s1544/evennia_screenshot.png"><img src="https://1.bp.blogspot.com/-WACefg23bBA/X6_6vGTcjbI/AAAAAAAALh0/4FtZQDj5XosG_Dnyj6e-8ScHwyOTaOSzQCLcBGAsYHQ/s320/evennia_screenshot.png" alt="" /></a></p>
|
||||
<p>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>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 <em>master</em> 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>Webclient improvements</h4>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Big <strong>web client</strong> 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).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Allow to redirect video/music to separate panes.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Many other fixes, such as improving the input-history behavior.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h4>EvMenu improvements</h4>
|
||||
<p><strong>EvMenu</strong> is a powerful system for creating in-game text menus.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <strong>EvMenu</strong> class was refactored to be easier to override. For example, all messages now go through <strong>EvMenu.msg</strong> which allows for easy customization. It also defaults to sending with a <strong>type</strong> of "menu", making it easier to redirect menus to seprate panes in the webclient.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In a node, EvMenu is now accessed via the much more logically named <strong>.ndb._evmenu</strong> instead of <strong>.ndb._menutree</strong> (the old name still works for backwards compatibility, but is deprecated).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>New optional <strong>EvMenu template</strong> 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.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h4>New settings</h4>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>INLINEFUNC_STACK_MAXSIZE</strong> is an integer that allows to control how big the inlinefunc nesting stacksize is.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>New <strong>DEFAULT_CHANNELS</strong> setting to allow customization of which channels should be initialized on startup. This can be modified after initial server start.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>CHANNEL_HANDLER_CLASS</strong> allows for specifying an alternative to the default <strong>ChannelHandler</strong> if wanting to change how Channels behave.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>SERVER_LOG_DAY_ROTATION</strong> defines how many days the server log should run before being force-rotated (default is seven days).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>SERVER_LOG_MAX_SIZE</strong> specifies how big the log must be before it auto-rotates (even if <strong>SERVER_LOG_DAY_ROTATION</strong> days has not passed yet).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>PORTAL_LOG_DAY_ROTATION, PORTA_LOG_MAX_SIZE</strong> - equivalent for the Portal.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h4>Other improvements</h4>
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <strong>EvMore</strong> pager saw big performance speedups, making the viewing of large numbers of entries much snappier. You can now also paginate <strong>EvTables</strong> directly and create custom pagers by override the <strong>EvMore class</strong> (useful if you want to e.g. do a EvTable per-page).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Improvement to the multi-match parser: Trying to get for example <strong>3-box</strong> will now fail with a no-found if there are only two boxes in the room (before it would show the multi-match menu).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>New <strong>inside_rec</strong> 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).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>New <strong>$random</strong> inlinefunc for producing a random number in strings.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>TickerHandler.add()</strong> now returns a <strong>store_key</strong> to uniquely describe the ticker just added. The <strong>TickerHandler.remove()</strong> accepts a new kwarg <strong>store_key</strong> for removing the ticker - this makes it easier to manage tickers instead having to insert the full specifications of the ticker to remove it.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Many fixes to the <strong>spawn</strong> command and prototype functionality. The new <strong>spawn/raw</strong> flag will now return the prototype-dict so one can manually edit and copy&paste it.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <strong>evennia.GLOBAL_SCRIPTS</strong> container will now contain all global scripts, not only those explicitly created with the <strong>GLOBAL_SCRIPTS</strong> setting.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <strong>list_to_string</strong> utility converts a list to a nice string-representation, such as <strong>["a", "b", "c", "d"]</strong> -> <strong><em>"a, b, c and d"</em></strong>. The function is renamed to <strong>iter_to_string</strong> (but old name still works) and now also works with generators and will not crash even when provided a single value.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>A lot of bug fixes and stability fixes!</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h4>See the <a href="https://github.com/evennia/evennia/blob/master/CHANGELOG.md#evennia-095-nov-2020">changelog here.</a></h4>
|
||||
<h3>New documentation system</h3>
|
||||
<p>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="">my previous 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>Check it out:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>New evennia.com: <a href="https://evennia.com">https://evennia.com</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>New static documentation: <a href="https://evennia.com/docs/latest">https://evennia.com/docs/latest</a></p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>But that's for future blogs ...</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2020-10-20-on-using-markdown-with-sphinx>
|
||||
On using Markdown with Sphinx
|
||||
<a class="devblog-headerlink" href="2020.html#2020-10-20-on-using-markdown-with-sphinx" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- October 20, 2020</div>
|
||||
</h1>
|
||||
<p><a href="https://1.bp.blogspot.com/-GNQ1IGvFf3o/X44OC1-OxXI/AAAAAAAALgY/OugrLSGGW7YgPDxHuG-tveB-xcCQ2RVZACLcBGAsYHQ/s207/book.png"><img src="https://1.bp.blogspot.com/-GNQ1IGvFf3o/X44OC1-OxXI/AAAAAAAALgY/OugrLSGGW7YgPDxHuG-tveB-xcCQ2RVZACLcBGAsYHQ/s0/book.png" alt="" /></a></p>
|
||||
<p>Last 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).</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 <em>master</em> 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>
|
||||
<li>
|
||||
<p>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 <strong>scripts</strong> and <strong>spawn/list</strong> commands, once you have a lot of items.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>EvMenu templating language, to make it easier to create simpler menus.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>MUD/Evennia Intro wizard to the tutorial world to explain basic game controls in an interactive way.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Default channels can now be defined in settings instead of having to do so from in-game.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>New documentation system (see below).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Many, many bug fixes and optimizations!</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Many contributors helped out along the way. See the <a href="https://github.com/evennia/evennia/blob/master/CHANGELOG.md">changelog</a> where contributors of the bigger new features are listed.</p>
|
||||
<h2>The path to a new documentation</h2>
|
||||
<p>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">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>After considering a bunch of options, I eventually went with <a href="https://www.sphinx-doc.org">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>Luckily there are extensions for Sphinx to handle this:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html">Napoleon</a> to convert Google-style docstrings to reST on the fly</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://recommonmark.readthedocs.io/en/latest/index.html">recommonmark</a> to convert our markdown wiki pages to reST on compile-time</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://holzhaus.github.io/sphinx-multiversion/master/index.html">sphinx-multiversion</a> to merge docs from one or more GIT branches into a documentation where you can select between the versions.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>What could go wrong? Well, it's been quite a ride.</p>
|
||||
<h4>Getting Markdown into reST</h4>
|
||||
<p>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>My custom fork of recommonmark had to be tweaked a bit for my needs, such as not having to specify the <strong>.md</strong> 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.</p>
|
||||
<p>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 <em>toctrees</em>, something that the Evennia wiki doesn't have.</p>
|
||||
<p>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.</p>
|
||||
<h4>Getting the wiki into the new doc site</h4>
|
||||
<p>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>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 <em>not</em> expect Markdown. So the end result is <em>mostly</em> markdown but we still have to fall back to reST for some things. It's probably as far as we get.</p>
|
||||
<h4>Deploying the docs</h4>
|
||||
<p>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>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>I've not gotten down to trying to make LaTeX/PDF generation work yet. I'm dreading it quite a bit...</p>
|
||||
<h4>Where we are</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.</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>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!</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2020-04-14-spring-updates-while-trying-to-stay-healthy>
|
||||
Spring updates while trying to stay healthy
|
||||
<a class="devblog-headerlink" href="2020.html#2020-04-14-spring-updates-while-trying-to-stay-healthy" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- April 14, 2020</div>
|
||||
</h1>
|
||||
<p><a href="https://1.bp.blogspot.com/-vnauuJpCVfo/XpXkbERzSRI/AAAAAAAALJQ/lDoYHE6zjWsg7It_fsXn_3roGUISX2HxgCLcBGAsYHQ/s1600/spring-flower-and-snow.jpg"><img src="https://1.bp.blogspot.com/-vnauuJpCVfo/XpXkbERzSRI/AAAAAAAALJQ/lDoYHE6zjWsg7It_fsXn_3roGUISX2HxgCLcBGAsYHQ/s320/spring-flower-and-snow.jpg" alt="" /></a></p>
|
||||
<p>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.</p>
|
||||
<p>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 develop 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.</p>
|
||||
<h3>What's in a version?</h3>
|
||||
<p>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).</p>
|
||||
<p>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.</p>
|
||||
<h3>Documentation changes</h3>
|
||||
<p>Our documentation will move away from our trusty <a href="https://github.com/evennia/evennia/wiki">Github wiki</a>. Instead we will convert the wiki into a static github page built from sources inside evennia/docs/.</p>
|
||||
<p>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:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The wiki word-search functionality is not really great.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>It's impossible to review changes before they go live, to check consistency and style. This has led to some documentation pages overlapping.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Building the documentation to local HTML or PDF is an archaic process that I doubt anyone but me has done with any regularity.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>The change so far planned is to switch to the <a href="https://www.sphinx-doc.org/en/master/">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.</p>
|
||||
<p>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).</p>
|
||||
<p>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.</p>
|
||||
<p>Many of the details around the docs are still up in the air. This is still very much work-in-progress, like everything else.</p>
|
||||
<p>Work with this has started in the static-file-docs branch of Evennia. But we have not closed the wiki either - the two will exist in parallel for now.</p>
|
||||
<h3>PyPi</h3>
|
||||
<p>As mentioned before, we will finally start to distribute Evennia via PyPi (the Python Package Index) - that is, you will be able to run <code>pip install evennia</code>. Using GIT will no longer be a requirement to get started.</p>
|
||||
<p>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.</p>
|
||||
<p>With the new documentation system, this would improve. And you can of course still use git and follow master branch like the good ol' days if you want!</p>
|
||||
<h3>Web Admin improvements</h3>
|
||||
<p>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.</p>
|
||||
<h3>API improvements</h3>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>... 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!</p>
|
||||
<p>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).</p>
|
||||
<p>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).</p>
|
||||
<h3>Many other fixes and contributions</h3>
|
||||
<p>There's a truckload of stuff already available in master branch, but with the latest contributions of bigger code changes, we have started to use the Evennia develop 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">Changelog</a>.</p>
|
||||
<p>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.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em><p>Image: ©George Hodan, released under CC0 Public Domain</p>
|
||||
</em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
764
devblog/2021.html
Normal file
764
devblog/2021.html
Normal file
|
|
@ -0,0 +1,764 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<title>Devblog: Evennia Python MUD/MU creation system</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../images/favicon.ico">
|
||||
<link rel="stylesheet" href="../stylesheets/styles.css">
|
||||
<link rel="stylesheet" href="../stylesheets/pygment_trac.css">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open Sans' rel='stylesheet'>
|
||||
<link href='https://fonts.googleapis.com/css?family=Arvo' rel='stylesheet'>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
<meta name="description" content="Evennia is a modern Python library and server for creating text-based multi-player games and virtual worlds (also known as MUD, MUSH, MU, MUX, MUCK, etc). While Evennia handles all the necessary things every online game needs, like database and networking, you create the game of your dreams by writing normal Python modules.">
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js">
|
||||
</script>
|
||||
<![endif]-->
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<header>
|
||||
<p>
|
||||
<img class="logo" src="../images/evennia_logo.png" alt="Evennia logo">
|
||||
</p>
|
||||
<h1 class="header">Evennia</h1>
|
||||
<p class="header header-text">The Python MU* Development Library</p>
|
||||
<div class="linksection">
|
||||
<ul>
|
||||
<div class="buttonsection">
|
||||
<li>
|
||||
<a class="buttons" href="https://www.evennia.com">Back to Evennia</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="devblog-calendar">
|
||||
<ul>
|
||||
|
||||
<li><a href="2021.html">2021 (2)
|
||||
|
||||
<ul class="devblog-calendar-open">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2020.html">2020 (3)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2019.html">2019 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2018.html">2018 (4)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2017.html">2017 (6)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2016.html">2016 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2015.html">2015 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2014.html">2014 (7)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2013.html">2013 (5)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
<li><a href="2012.html">2012 (13)
|
||||
|
||||
<ul class="devblog-calendar-closed">
|
||||
|
||||
|
||||
<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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</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>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</header>
|
||||
<section>
|
||||
<h1>
|
||||
<a name="evennia-mudmu-creation-system" class="anchor" href="#evennia-mudmu-creation-system">
|
||||
<span class="octicon octicon-link">
|
||||
</span>
|
||||
</a>Evennia Dev Blog<div class="sponsor">
|
||||
<div class="sponsor-column">
|
||||
<a href="https://www.patreon.com/griatch">
|
||||
<img class="patreon" src="../images/evennia_patreon_100x100.png" alt="Patreon">
|
||||
</a>
|
||||
<p>
|
||||
<a href="https://www.paypal.me/GriatchEvennia">
|
||||
<img class="paypal" src="../images/btn_donateCC_LG.gif" alt="Paypal donate">
|
||||
</a>
|
||||
</div>
|
||||
</h1>
|
||||
|
||||
<em>Various Evennia- and MUD-related musings by Griatch, the Evennia lead developer.</em>
|
||||
|
||||
|
||||
|
||||
<div class="blog_post">
|
||||
<h1 id=2021-03-21-where-do-i-begin?>
|
||||
Where do I begin?
|
||||
<a class="devblog-headerlink" href="2021.html#2021-03-21-where-do-i-begin?" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- March 21, 2021</div>
|
||||
</h1>
|
||||
<blockquote>
|
||||
<p><em>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.</em></p>
|
||||
</blockquote>
|
||||
<p>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:</p>
|
||||
<p><img src="images/yellow_world_by_griatch_art-d7a6e5n.jpg" alt="painted image of the beginning of a road in autumn" /></p>
|
||||
<p><em>“Where do I begin?”</em></p>
|
||||
<p>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.</p>
|
||||
<h2>What is your motivation for doing this?</h2>
|
||||
<p>So you want to make a game. First you need to make a few things clear to yourself.</p>
|
||||
<p>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.</p>
|
||||
<p>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:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>I want to earn recognition and fame from my online community and/or among my friends.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I want to build the game so I can play and enjoy it myself.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I want to build the same game I already play but without the bad people.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I want to create a game so that I can control it and be the head honcho.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>A friend or online acquaintance talked me into working on it.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I work on this because I’m paid to (wow!)</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I only build this for my own benefit or to see if I can pull it off.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I want to create something to give back to the community I love.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I want to use this project as a stepping-stone towards other projects (like a career in game design or programming).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I am interested in coding or server and network architectures, making a MUD just seems to be a good way to teach myself.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I want to build a commercial game and earn money.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>I want to fulfill a life-long dream of game making.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<h2>What are your skills?</h2>
|
||||
<p>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.</p>
|
||||
<p>Your game will have two principal components and you will need skills to cater for both:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>The game engine (“the code base”)</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The assets created for using the game engine (“the game world”)</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>The game engine</h2>
|
||||
<p>The 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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>When judging which engine you want to use, consider:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>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?</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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?</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Other available documentation - does the engine come with a manual? Are there online tutorials or other help resources to read?</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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?</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Asset creation</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<h2>So, where <em>do</em> I begin?</h2>
|
||||
<p>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:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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!</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>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.</p>
|
||||
<p>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):</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Change some phrasing in the output of an already existing command.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Make a new command and add it to the game engine. Make it just echo back whatever argument you give it.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Code an object that echoes “tick” to everyone at its location every 20 seconds.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Make a new command that creates new ticking objects where you are, but with a name given by you.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Make a room whose description changes every time you enter it.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Make an object that deletes itself when its “health” property is changed to zero.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Make an “attack” command that randomly reduces the “health” property of a target object until it deletes itself.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>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.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>What is your scope?</h2>
|
||||
<p>We are now past the “things to do first”. Welcome to the things you do later.</p>
|
||||
<p>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.</p>
|
||||
<p>You should now hopefully have enough information to be able to realistically set the scope of your game.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<h2>How to continue from here?</h2>
|
||||
<p>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 <em>a first version</em> of your game at this point, not the <em>final, ultimate</em> version.</p>
|
||||
<p>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://evennia.com/docs/latest/Game-Planning">Evennia’s game planning documentation</a>. This reiterates some aspects of this article while expanding on others.</p>
|
||||
<p>… But in the end, remember that what kills a hobby game project will usually be <em>your own lack of motivation</em>. 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.</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em><p>Images: <a href="https://deviantart.com/griatch-art">©Griatch</a></p>
|
||||
</em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div class="blog_post">
|
||||
<h1 id=2021-01-01-happy-new-years-2021!>
|
||||
Happy New Years 2021!
|
||||
<a class="devblog-headerlink" href="2021.html#2021-01-01-happy-new-years-2021!" title="Permalink to this blog post">¶</a>
|
||||
<div class="devblog-title-date">- January 1, 2021</div>
|
||||
</h1>
|
||||
<p><a href="https://1.bp.blogspot.com/-QtfaDoIwzkA/X-8XYiPQ27I/AAAAAAAALm4/2-EHKh3IaYMNeoj6WykJvhPccJeJ1KD7QCLcBGAsYHQ/s2048/1a1-sydney_new_years_eve_2008.jpeg"><img src="https://1.bp.blogspot.com/-QtfaDoIwzkA/X-8XYiPQ27I/AAAAAAAALm4/2-EHKh3IaYMNeoj6WykJvhPccJeJ1KD7QCLcBGAsYHQ/s320/1a1-sydney_new_years_eve_2008.jpeg" alt="" /></a></p>
|
||||
<p>Another 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 <em>develop</em> branch of Evennia, which is currently <em>not</em> recommended for general use.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>SessionDB:</strong> 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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Script refactor:</strong> 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).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Channel refactor:</strong> 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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>New starting tutorial:</strong> 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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Contrib restructure:</strong> 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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Documentation cleanup:</strong> 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).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Unittest coverage:</strong> 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.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Evennia PYPI package:</strong> 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 <strong>pip install evennia</strong>. Once we do it will simplify the install instructions dramatically for those not interested in contributing to Evennia proper.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>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).</p>
|
||||
<p>A lot of work to do as usual!</p>
|
||||
<p><strong>Thanks</strong> 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!</p>
|
||||
<p>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!</p>
|
||||
<p>May all our game development move forward and our hard drives stay healthy for another year.</p>
|
||||
<p>Cheers and a Happy new year,</p>
|
||||
<p>Griatch</p>
|
||||
|
||||
<footer>
|
||||
<p>
|
||||
<small><em></em></small>
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -25,7 +25,7 @@ from dataclasses import dataclass
|
|||
from collections import defaultdict
|
||||
from dateutil import parser as dateparser
|
||||
from datetime import datetime
|
||||
from os import mkdir, symlink, remove
|
||||
from os import mkdir, symlink, remove, chdir
|
||||
from os.path import abspath, dirname, join as pathjoin, sep
|
||||
import mistletoe
|
||||
import jinja2
|
||||
|
|
@ -34,13 +34,17 @@ import jinja2
|
|||
CURRDIR = dirname(abspath(__file__))
|
||||
SOURCE_DIR = pathjoin(CURRDIR, "markdown")
|
||||
TEMPLATE_DIR = pathjoin(CURRDIR, "templates")
|
||||
IMG_DIR = pathjoin(SOURCE_DIR, "images")
|
||||
|
||||
IMG_DIR_NAME = "images"
|
||||
IMG_DIR = pathjoin(CURRDIR, "images")
|
||||
IMG_REL_LINK = "_src/images"
|
||||
|
||||
OUTDIR = dirname(CURRDIR)
|
||||
OUTFILE_TEMPLATE = "devblogs_{year}.html"
|
||||
OUT_IMG_DIR = pathjoin(OUTDIR, "images")
|
||||
OUTFILE_TEMPLATE = "{year}.html"
|
||||
OUT_IMG_DIR = "images"
|
||||
|
||||
START_PAGE = "index.html"
|
||||
|
||||
BLOG_TEMPLATE = "blog.html"
|
||||
POST_TEMPLATE = "post.html"
|
||||
|
||||
|
|
@ -101,8 +105,6 @@ def md2html():
|
|||
print(f"Warning: Markdown file '{filename}' is not on a recognized format. Skipping.")
|
||||
continue
|
||||
|
||||
print(f"Processing {filename}...")
|
||||
|
||||
title = title[:-3] # remove .md ending
|
||||
blurb = title[:11] + "..."
|
||||
title = " ".join(title.split("-"))
|
||||
|
|
@ -180,6 +182,8 @@ def md2html():
|
|||
# build the blog pages, per year
|
||||
html_pages = {}
|
||||
for blogpage in blogpages:
|
||||
print(f"Processing blogs from {blogpage.year} ...")
|
||||
|
||||
context = {
|
||||
"pageyear": blogpage.year,
|
||||
"blogpage": blogpage,
|
||||
|
|
@ -198,11 +202,18 @@ def build_pages(blog_pages):
|
|||
Generate devblog pages.
|
||||
|
||||
"""
|
||||
|
||||
for html_file in glob.glob(pathjoin(OUTDIR, "*.html")):
|
||||
remove(html_file)
|
||||
shutil.rmtree(OUT_IMG_DIR, ignore_errors=True)
|
||||
try:
|
||||
remove(pathjoin(OUTDIR, START_PAGE))
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
try:
|
||||
remove(pathjoin(OUTDIR, IMG_DIR_NAME))
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
mkdir(OUT_IMG_DIR)
|
||||
html_pages = md2html()
|
||||
|
||||
latest_year = -1
|
||||
|
|
@ -211,14 +222,15 @@ def build_pages(blog_pages):
|
|||
filename = pathjoin(OUTDIR, OUTFILE_TEMPLATE.format(year=year))
|
||||
if year > latest_year:
|
||||
latest_year = year
|
||||
latest_page = filename
|
||||
latest_page = filename.rsplit(sep, 1)[1] if sep in filename else filename
|
||||
with open(filename, 'w') as fil:
|
||||
fil.write(html_page)
|
||||
|
||||
shutil.copytree(IMG_DIR, OUT_IMG_DIR, dirs_exist_ok=True)
|
||||
symlink(latest_page, pathjoin(OUTDIR, START_PAGE))
|
||||
chdir(OUTDIR)
|
||||
symlink(IMG_REL_LINK, IMG_DIR_NAME)
|
||||
symlink(latest_page, START_PAGE)
|
||||
|
||||
print(f"Output written to {OUTDIR}. Latest year is {latest_year}.")
|
||||
print(f"Output htmls written to {OUTDIR}{sep}. Latest year is {latest_year}.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@
|
|||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="chrome=1">
|
||||
<title>Devblog: Evennia Python MUD/MU creation system</title>
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../../images/favicon.ico">
|
||||
<link rel="stylesheet" href="../../stylesheets/styles.css">
|
||||
<link rel="stylesheet" href="../../stylesheets/pygment_trac.css">
|
||||
<link rel="shortcut icon" type="image/x-icon" href="../images/favicon.ico">
|
||||
<link rel="stylesheet" href="../stylesheets/styles.css">
|
||||
<link rel="stylesheet" href="../stylesheets/pygment_trac.css">
|
||||
<link href='https://fonts.googleapis.com/css?family=Open Sans' rel='stylesheet'>
|
||||
<link href='https://fonts.googleapis.com/css?family=Arvo' rel='stylesheet'>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
||||
|
|
@ -20,7 +20,7 @@
|
|||
<div class="wrapper">
|
||||
<header>
|
||||
<p>
|
||||
<img class="logo" src="../../images/evennia_logo.png" alt="Evennia logo">
|
||||
<img class="logo" src="../images/evennia_logo.png" alt="Evennia logo">
|
||||
</p>
|
||||
<h1 class="header">Evennia</h1>
|
||||
<p class="header header-text">The Python MU* Development Library</p>
|
||||
|
|
@ -62,11 +62,11 @@
|
|||
</a>Evennia Dev Blog<div class="sponsor">
|
||||
<div class="sponsor-column">
|
||||
<a href="https://www.patreon.com/griatch">
|
||||
<img class="patreon" src="../../images/evennia_patreon_100x100.png" alt="Patreon">
|
||||
<img class="patreon" src="../images/evennia_patreon_100x100.png" alt="Patreon">
|
||||
</a>
|
||||
<p>
|
||||
<a href="https://www.paypal.me/GriatchEvennia">
|
||||
<img class="paypal" src="../../images/btn_donateCC_LG.gif" alt="Paypal donate">
|
||||
<img class="paypal" src="../images/btn_donateCC_LG.gif" alt="Paypal donate">
|
||||
</a>
|
||||
</div>
|
||||
</h1>
|
||||
|
|
|
|||
1
devblog/images
Symbolic link
1
devblog/images
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
_src/images
|
||||
1
devblog/index.html
Symbolic link
1
devblog/index.html
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
2021.html
|
||||
Loading…
Add table
Add a link
Reference in a new issue